texlive[47516] Master/texmf-dist: l3 (30apr18)
commits+karl at tug.org
commits+karl at tug.org
Tue May 1 00:39:10 CEST 2018
Revision: 47516
http://tug.org/svn/texlive?view=revision&revision=47516
Author: karl
Date: 2018-05-01 00:39:09 +0200 (Tue, 01 May 2018)
Log Message:
-----------
l3 (30apr18)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
trunk/Master/texmf-dist/doc/latex/l3packages/README.md
trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
Added Paths:
-----------
trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
Removed Paths:
-------------
trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2018/03/05
+Release 2018-04-30
Overview
--------
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex 2018-04-30 22:39:09 UTC (rev 47516)
@@ -52,7 +52,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2018/03/05}
+\date{Released 2018-04-30}
\pagenumbering{roman}
\maketitle
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt 2018-04-30 22:39:09 UTC (rev 47516)
@@ -31,8 +31,12 @@
\iow_log_streams: 2018
\sort_ordered: 2018
\sort_reversed: 2018
+\tl_show_analysis:N 2019
+\tl_show_analysis:n 2019
\token_new:Nn 2018
----------------------------------------
+Variants of n into N/c 2018
+Variants of N into n/o/V/v/f/x 2018
+--------------------------------------
Removed functions and variables
===============================
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex 2018-04-30 22:39:09 UTC (rev 47516)
@@ -30,7 +30,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2018/03/05}
+\date{Released 2018-04-30}
\begin{document}
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex 2018-04-30 22:39:09 UTC (rev 47516)
@@ -30,7 +30,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2018/03/05}
+\date{Released 2018-04-30}
\newcommand{\TF}{\textit{(TF)}}
@@ -38,8 +38,13 @@
\maketitle
-This file lists functions whose syntax has changed after August 2011,
-with an approximate date.
+This file describes functions that were expected to be completely
+stable, but whose syntax has changed in ways that may potentially
+require code relying on them to be changed. This file does not include
+bug-fixes, nor backward-compatible extensions of the syntax, nor changes
+to functions in \pkg{l3candidates}, nor functions that were completely
+deprecated: the latter are listed in \texttt{l3obsolete.txt}. Only
+changes after August 2011 are listed, with an approximate date.
\section{August 2011}
@@ -68,6 +73,16 @@
now trim spaces from each item in the argument.
\end{itemize}
+\section{May 2012}
+
+\begin{itemize}
+ \item The \pkg{l3fp} code has been completely rewritten with a new
+ expandable interface.
+ \item Getting/popping from a comma list or sequence or property list
+ that is empty (or missing the given key) now gives the quark
+ \cs{q_no_value}.
+\end{itemize}
+
\section{June 2012}
\begin{itemize}
@@ -97,5 +112,70 @@
same way as for example \cs{str_if_eq_x:nn(TF)}.
\end{itemize}
+\section{December 2013}
+\begin{itemize}
+ \item In \pkg{l3fp} expressions, the badly named functions |round0|,
+ |round-|, |round+| are now named |trunc|, |floor|, |ceil|.
+\end{itemize}
+
+\section{May 2014}
+
+\begin{itemize}
+ \item Now \cs{int_step_function:nnnN} evaluates its first three
+ arguments (start, step, stop) up front, rather than evaluating them
+ at each step in the loop. The same holds for the related mappings
+ \cs{int_step_inline:nnnn}, \cs{int_step_variable:nnnNn}, and their
+ analogues for \texttt{dim} and \texttt{fp} datatypes.
+\end{itemize}
+
+\section{July 2014}
+
+\begin{itemize}
+ \item In \pkg{l3fp} expressions, juxtaposition is interpreted as
+ multiplication. Now the precedence of juxtaposition is set to be
+ the same as if there was an explicit multiplication
+ sign~\texttt{*}. Previously, juxtaposition would bound more tightly
+ than any other operation.
+\end{itemize}
+
+\section{August 2015}
+
+\begin{itemize}
+ \item The \cs{hbox:n} and related \pkg{l3box} commands now take an
+ \texttt{n}-type argument and provide it braced to the underlying
+ \TeX{} primitive. The functions \cs{hbox:w} and \cs{hbox_end:} in
+ contrast do not read the contents of the box as a macro argument.
+\end{itemize}
+
+\section{2016}
+
+No change.
+
+\section{July 2017}
+
+\begin{itemize}
+ \item Boolean expressions are now evaluated eagerly, namely both
+ operands of logical \texttt{and} (|&&|) and \texttt{or} (\verb"||")
+ are evaluated even when the result of the logical operation is fixed
+ after determining the first operand. For lazy evaluation,
+ \cs{bool_lazy_and_p:nn} and related functions are provided.
+\end{itemize}
+
+\section{November 2017}
+
+\begin{itemize}
+ \item Spaces are now preserved inside keys in \pkg{l3keys}, and
+ trimmed at both ends.
+ \item \cs{cs_generate_variant:Nn} is now stricter: it only allows to
+ change \texttt{N}-type arguments to \texttt{c}, and \texttt{n} to
+ \texttt{o}, \texttt{V}, \texttt{v}, \texttt{f}, \texttt{x}. On the
+ one hand the latter argument types typically give rise to more than
+ one token, not suitable for use by an \texttt{N}-type base function.
+ On the other hand, \texttt{c} variants of \texttt{n} arguments
+ should often be \texttt{v} variants (when the argument is eventually
+ evaluated) or mistakes where the programmer thought the base
+ function was \texttt{N}-type.
+\end{itemize}
+
\end{document}
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex 2018-04-30 22:39:09 UTC (rev 47516)
@@ -51,7 +51,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2018/03/05}
+\date{Released 2018-04-30}
\pagenumbering{roman}
\maketitle
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex 2018-04-30 22:39:09 UTC (rev 47516)
@@ -335,9 +335,14 @@
\begin{syntax}
|\sys_if_engine_xetex:TF| \Arg{true code} \Arg{false code}
\end{syntax}
- The underlining and italic of \texttt{TF} indicates that
- |\sys_if_engine_xetex:T|, |\sys_if_engine_xetex:F| and
- |\sys_if_engine_xetex:TF| are all available. Usually, the illustration
+ The underlining and italic of \texttt{TF} indicates that three functions
+ are available:
+ \begin{itemize}
+ \item |\sys_if_engine_xetex:T|
+ \item |\sys_if_engine_xetex:F|
+ \item |\sys_if_engine_xetex:TF|
+ \end{itemize}
+ Usually, the illustration
will use the \texttt{TF} variant, and so both \meta{true code}
and \meta{false code} will be shown. The two variant forms \texttt{T} and
\texttt{F} take only \meta{true code} and \meta{false code}, respectively.
@@ -402,16 +407,19 @@
\DocInput{l3bootstrap.dtx}
\DocInput{l3names.dtx}
+\ExplSyntaxOn
+\clist_gput_right:Nn \g_docinput_clist { l3kernel-functions.dtx }
+\ExplSyntaxOff
\DocInput{l3basics.dtx}
\DocInput{l3expan.dtx}
\DocInput{l3tl.dtx}
\DocInput{l3str.dtx}
+\DocInput{l3quark.dtx}
\DocInput{l3seq.dtx}
\DocInput{l3int.dtx}
-\DocInput{l3intarray.dtx}
\DocInput{l3flag.dtx}
-\DocInput{l3quark.dtx}
\DocInput{l3prg.dtx}
+\DocInput{l3sys.dtx}
\DocInput{l3clist.dtx}
\DocInput{l3token.dtx}
\DocInput{l3prop.dtx}
@@ -441,17 +449,20 @@
}
\ExplSyntaxOff
+\DocInput{l3intarray.dtx}
\DocInput{l3sort.dtx}
-\DocInput{l3tl-build.dtx}
\DocInput{l3tl-analysis.dtx}
\DocInput{l3regex.dtx}
\DocInput{l3box.dtx}
\DocInput{l3coffins.dtx}
\DocInput{l3color-base.dtx}
-\DocInput{l3sys.dtx}
-\DocInput{l3deprecation.dtx}
+\DocInput{l3luatex.dtx}
+\DocInput{l3unicode.dtx}
\DocInput{l3candidates.dtx}
-\DocInput{l3luatex.dtx}
\DocInput{l3drivers.dtx}
+\ExplSyntaxOn
+\clist_gput_right:Nn \g_docinput_clist { l3deprecation.dtx }
+\ExplSyntaxOff
+
\endinput
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,7 +1,7 @@
LaTeX3 High-Level Concepts
==========================
-Release 2018/02/21
+Release 2018-04-30
Overview
--------
@@ -122,6 +122,6 @@
-----
-<p>Copyright (C) 1998-2011,2015-2017 The LaTeX3 Project <br />
+<p>Copyright (C) 1998-2011,2015-2018 The LaTeX3 Project <br />
<a href="http://latex-project.org/">http://latex-project.org/</a> <br />
All rights reserved.</p>
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -21,7 +21,7 @@
% for those people who are interested.
%
%<*driver|generic|package>
-\def\ExplFileDate{2018/03/05}%
+\def\ExplFileDate{2018-04-30}%
%</driver|generic|package>
%<*driver>
\documentclass[full]{l3doc}
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -575,11 +575,11 @@
% arguments before passing it to the base function:
% \begin{description}
% \item[c] Character string used as a command name.\\ The argument (a
-% token or braced token list) must, when fully expanded, produce a
-% sequence of characters which is then used to construct a command
-% name (\emph{via}~\tn{csname} \ldots \tn{endcsname}).
-% This command name is the
-% single token that is passed to the function as the argument. Hence
+% token or braced token list) is \emph{fully expanded}; the result
+% must be a sequence of characters which is then used to construct a
+% command name (\emph{via}~\tn{csname} \ldots \tn{endcsname}). This
+% command name is a single token that is passed to the function as
+% the argument. Hence
% \begin{quote}
% \cs{seq_gpush:cV} |{ g_file_name_seq }| \cs{l_tmpa_tl}
% \end{quote}
@@ -587,8 +587,7 @@
% \begin{quote}
% \cs{seq_gpush:NV} |\g_file_name_seq| \cs{l_tmpa_tl}.
% \end{quote}
-% Remember that \texttt{c} arguments are \emph{fully expanded} by
-% \TeX{} when creating csnames. This means that (a) the entire
+% Full expansion means that (a) the entire
% argument must be expandable and (b) any variables are
% converted to their content. So the preceding examples are also
% equivalent to
@@ -599,21 +598,23 @@
% \end{quote}
% (Token list variables are expandable and we could omit the
% accessor function \cs{tl_use:N}. Other variable types require the
-% appropriate \cs{<var>_use:N} functions to be used in this
+% appropriate \cs{\meta{var}_use:N} functions to be used in this
% context.)
% \item[V] Value of a variable.\\
-% This means that the contents of the register in question is used as the
-% argument, be it an integer, a length-type register, a token list variable
-% or similar. The value is passed to the function as a braced token list.
-% Can be applied to variables which have a \cs{\meta{var}_use:N} function,
-% and which therefore deliver a single \enquote{value}.
+% This means that the contents of the register in question is used
+% as the argument, be it an integer, a length-type register, a token
+% list variable or similar. The value is passed to the function as a
+% braced token list. Can be applied to variables which have a
+% \cs{\meta{var}_use:N} function (other than floating points and
+% boxes), and which therefore deliver a single \enquote{value}.
% \item[v] Value of a register, constructed from a character string
% used as a command name.\\
% This is a combination of |c| and |V| which first constructs a
-% control sequence from the argument and then passes the value of the
-% resulting register to the function.
-% Can be applied to variables which have a \cs{\meta{var}_use:N} function,
-% and which therefore deliver a single \enquote{value}.
+% control sequence from the argument and then passes the value of
+% the resulting register to the function. Can be applied to
+% variables which have a \cs{\meta{var}_use:N} function (other than
+% floating points and boxes), and which therefore deliver a single
+% \enquote{value}.
% \item[x] Fully-expanded token or braced token list.\\
% This means that the argument is expanded as in the replacement
% text of an~\tn{edef}, and the expansion is passed to the function as
@@ -920,7 +921,8 @@
% which are constructed using macros as the underlying storage system. The
% \texttt{check-declarations} option enables checking for all variable
% assignments, issuing an error if any variables are assigned without being
-% initialised. See also the function \cs{debug_check_declarations_on:}.
+% initialised.
+% See also \cs{debug_on:n} \texttt{\{check-declarations\}} for finer control.
%
% \DescribeOption{log-functions}
% The \texttt{log-functions} option is used to enable recording of every new
@@ -927,8 +929,8 @@
% function name in the \texttt{.log} file. This is useful for debugging
% purposes, as it means that there is a complete list of all functions
% created by each module loaded (with the exceptions of a very small number
-% required by the bootstrap code for \LaTeX3). See also the function
-% \cs{debug_log_functions_on:}.
+% required by the bootstrap code for \LaTeX3).
+% See also \cs{debug_on:n} \texttt{\{log-functions\}} for finer control.
%
% \DescribeOption{enable-debug}
% To allow more localized checking and logging than provided by
@@ -998,7 +1000,7 @@
% \item \pdfTeX{} v1.40 or later.
% \item \XeTeX{} v0.9994 or later.
% \item \LuaTeX{} v0.70 or later.
-% \item e-(u)p\TeX{} mid-2012 or later.
+% \item e-(u)\pTeX{} mid-2012 or later.
% \end{itemize}
%
% Additional modules beyond the core of \pkg{expl3} may require additional
@@ -1207,13 +1209,13 @@
\DeclareOption{#1=false}{\chardef #2=0 }%
\newcommand*#2{}%
\chardef #2=0 %
- }
+ }%
\expl at create@bool at option{check-declarations}\l at expl@check at declarations@bool
\expl at create@bool at option{log-functions}\l at expl@log at functions@bool
\expl at create@bool at option{enable-debug}\l at expl@enable at debug@bool
\let\expl at create@bool at option\@undefined
\chardef\l at expl@enable at debug@bool=0 %
-\newcommand*\l at expl@options at clist{}
+\newcommand*\l at expl@options at clist{}%
\DeclareOption*
{%
\ifx\l at expl@options at clist\@empty
@@ -1224,7 +1226,7 @@
\expandafter\expandafter\expandafter
{\expandafter\l at expl@options at clist\expandafter,\CurrentOption}
\fi
- }
+ }%
\ProcessOptions\relax
\ifodd\l at expl@check at declarations@bool
\chardef\l at expl@enable at debug@bool=1 %
@@ -1249,23 +1251,23 @@
{%
\ProvidesPackage{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
\ExplSyntaxOn
- }
+ }%
\protected\def\ProvidesExplClass#1#2#3#4%
{%
\ProvidesClass{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
\ExplSyntaxOn
- }
+ }%
\protected\def\ProvidesExplFile#1#2#3#4%
{%
\ProvidesFile{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
\ExplSyntaxOn
- }
+ }%
% \end{macrocode}
% \end{macro}
%
% Load the business end: this leaves \cs{expl3} syntax on.
% \begin{macrocode}
-\input{expl3-code.tex}
+\input{expl3-code.tex}%
% \end{macrocode}
%
% A check that the bootstrap code did not abort loading: if it did,
@@ -1472,8 +1474,8 @@
\hbox_set:Nn #1
{
\resizebox *
- { \__dim_eval:n {#2} }
- { \__dim_eval:n {#3} }
+ { \dim_eval:n {#2} }
+ { \dim_eval:n {#3} }
{ \box_use:N #1 }
}
}
@@ -1481,7 +1483,7 @@
{
\hbox_set:Nn #1
{
- \resizebox * { ! } { \__dim_eval:n {#2} }
+ \resizebox * { ! } { \dim_eval:n {#2} }
{ \box_use:N #1 }
}
}
@@ -1489,7 +1491,7 @@
{
\hbox_set:Nn #1
{
- \resizebox * { \__dim_eval:n {#2} } { ! }
+ \resizebox * { \dim_eval:n {#2} } { ! }
{ \box_use:N #1 }
}
}
@@ -1534,7 +1536,7 @@
% \begin{macrocode}
\tl_put_left:Nn \@pushfilename
{
- \exp_args:Nx \__file_input_push:n
+ \exp_args:Nx \__kernel_file_input_push:n
{
\tl_to_str:N \@currname
\tl_to_str:N \@currext
@@ -1559,7 +1561,7 @@
}
\tl_put_right:Nn \@popfilename
{
- \__file_input_pop:
+ \__kernel_file_input_pop:
\tl_if_empty:NTF \l__expl_status_stack_tl
{ \ExplSyntaxOff }
{ \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \q_stop }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins 2018-04-30 22:39:09 UTC (rev 47516)
@@ -65,12 +65,12 @@
\from{l3expan.dtx} {package}
\from{l3tl.dtx} {package}
\from{l3str.dtx} {package}
+ \from{l3quark.dtx} {package}
\from{l3seq.dtx} {package}
\from{l3int.dtx} {package}
- \from{l3intarray.dtx} {package}
\from{l3flag.dtx} {package}
- \from{l3quark.dtx} {package}
\from{l3prg.dtx} {package}
+ \from{l3sys.dtx} {package}
\from{l3clist.dtx} {package}
\from{l3token.dtx} {package}
\from{l3prop.dtx} {package}
@@ -91,17 +91,17 @@
\from{l3fp-trig.dtx} {package}
\from{l3fp-convert.dtx} {package}
\from{l3fp-random.dtx} {package}
+ \from{l3intarray.dtx} {package}
\from{l3sort.dtx} {package}
- \from{l3tl-build.dtx} {package}
\from{l3tl-analysis.dtx}{package}
\from{l3regex.dtx} {package}
\from{l3box.dtx} {package}
\from{l3color-base.dtx} {package}
\from{l3coffins.dtx} {package}
- \from{l3sys.dtx} {package}
+ \from{l3luatex.dtx} {package,tex}
+ \from{l3unicode.dtx} {package}
+ \from{l3candidates.dtx} {package}
\from{l3deprecation.dtx}{package}
- \from{l3candidates.dtx} {package}
- \from{l3luatex.dtx} {package,tex}
}
}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -164,7 +164,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_reg:nNnN #1#2#3#4
{
- \__chk_if_free_cs:N #4
+ \__kernel_chk_if_free_cs:N #4
\int_compare:nNnTF { \int_use:c { g_@@_ #1 _int } } < {#3}
{
\int_gincr:c { g_@@_ #1 _int }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -673,6 +673,8 @@
% control sequence. For a macro, this includes the \meta{replacement text}.
% \begin{texnote}
% This is \TeX{}'s \tn{meaning} primitive.
+% For tokens that are not control sequences, it is more logical to
+% use \cs{token_to_meaning:N}.
% The \texttt{c} variant correctly reports undefined arguments.
% \end{texnote}
% \end{function}
@@ -704,14 +706,19 @@
% \begin{syntax}
% \cs{use:c} \Arg{control sequence name}
% \end{syntax}
-% Converts the given \meta{control sequence name} into a single
-% control sequence token. This process requires two expansions.
-% The content for \meta{control sequence name} may be literal
-% material or from other expandable functions. The
-% \meta{control sequence name} must, when fully expanded, consist
-% of character tokens which are not active: typically
-% of category code $10$ (space), $11$ (letter)
-% or $12$ (other), or a mixture of these.
+% Expands the \meta{control sequence name} until only characters
+% remain, and then converts this into a control sequence. This process
+% requires two expansions. As in other \texttt{c}-type arguments the
+% \meta{control sequence name} must, when fully expanded, consist of
+% character tokens, typically a mixture of category code $10$ (space),
+% $11$ (letter) and $12$ (other).
+% \begin{texnote}
+% Protected macros that appear in a \texttt{c}-type argument are
+% expanded despite being protected; \cs{exp_not:n} also has no
+% effect. An internal error occurs if non-characters or active
+% characters remain after full expansion, as the conversion to a
+% control sequence is not possible.
+% \end{texnote}
% \end{function}
%
% As an example of the \cs{use:c} function, both
@@ -793,6 +800,23 @@
% of the result.
% \end{function}
%
+% \section{Analysing control sequence names}
+%
+% \begin{function}[EXP, added = 2018-04-06]{\cs_split_function:N}
+% \begin{syntax}
+% \cs{cs_split_function:N} \meta{function}
+% \end{syntax}
+% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
+% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
+% This information is then placed in the input stream
+% in three parts: the \meta{name}, the
+% \meta{signature} and a logic token indicating if a colon was found
+% (to differentiate variables from function names). The \meta{name}
+% does not include the escape character, and both the \meta{name} and
+% \meta{signature} are made up of tokens with category code $12$
+% (other).
+% \end{function}
+%
% \section{Using or removing tokens and arguments}
%
% Tokens in the input can be read and used or read and discarded.
@@ -1148,255 +1172,6 @@
% execute <false code>. Similar for the other functions.
% \end{function}
%
-% \section{Internal kernel functions}
-%
-% \begin{function}{\__chk_if_free_cs:N, \__chk_if_free_cs:c}
-% \begin{syntax}
-% \cs{__chk_if_free_cs:N} \meta{cs}
-% \end{syntax}
-% This function checks that \meta{cs} is free according to the
-% criteria for \cs{cs_if_free_p:N}, and if not raises a kernel-level
-% error.
-% \end{function}
-%
-% \begin{function}[EXP]{\__cs_count_signature:N, \__cs_count_signature:c}
-% \begin{syntax}
-% \cs{__cs_count_signature:N} \meta{function}
-% \end{syntax}
-% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
-% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
-% The \meta{number} of tokens in the \meta{signature} is then left in
-% the input stream. If there was no \meta{signature} then the result is
-% the marker value $-1$.
-% \end{function}
-%
-% \begin{function}[EXP]{\__cs_split_function:NN}
-% \begin{syntax}
-% \cs{__cs_split_function:NN} \meta{function} \meta{processor}
-% \end{syntax}
-% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
-% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
-% This information is then placed in the input stream after the
-% \meta{processor} function in three parts: the \meta{name}, the
-% \meta{signature} and a logic token indicating if a colon was found
-% (to differentiate variables from function names). The \meta{name}
-% does not include the escape character, and both the \meta{name} and
-% \meta{signature} are made up of tokens with category code $12$
-% (other). The \meta{processor} should be a function with argument
-% specification \texttt{:nnN} (plus any trailing arguments needed).
-% \end{function}
-%
-% \begin{function}[EXP]{\__cs_get_function_name:N}
-% \begin{syntax}
-% \cs{__cs_get_function_name:N} \meta{function}
-% \end{syntax}
-% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
-% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
-% The \meta{name} is then left in the input stream without the escape
-% character present made up of tokens with category code $12$
-% (other).
-% \end{function}
-%
-% \begin{function}[EXP]{\__cs_get_function_signature:N}
-% \begin{syntax}
-% \cs{__cs_get_function_signature:N} \meta{function}
-% \end{syntax}
-% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
-% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
-% The \meta{signature} is then left in the input stream made up of
-% tokens with category code $12$ (other).
-% \end{function}
-%
-% \begin{function}{\__cs_tmp:w}
-% Function used for various short-term usages, for instance defining
-% functions whose definition involves tokens which are hard to insert
-% normally (spaces, characters with category other).
-% \end{function}
-%
-% \begin{function}{\__kernel_debug:TF}
-% \begin{syntax}
-% \cs{__kernel_debug:TF} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Runs the \meta{true code} if debugging is enabled, namely only in
-% \LaTeXe{} package mode with one of the options
-% \texttt{check-declarations}, \texttt{enable-debug}, or
-% \texttt{log-functions}. Otherwise runs the \meta{false code}. The
-% |T| and |F| variants are not provided for this low-level
-% conditional.
-% \end{function}
-%
-% \begin{function}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c}
-% \begin{syntax}
-% \cs{__kernel_chk_cs_exist:N} \meta{cs}
-% \end{syntax}
-% This function is only created if debugging is enabled. It checks
-% that \meta{cs} exists according to the criteria for
-% \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
-% \end{function}
-%
-% \begin{function}{\__kernel_chk_expr:nNnN}
-% \begin{syntax}
-% \cs{__kernel_chk_expr:nNnN} \Arg{expr} \meta{eval} \Arg{convert} \meta{caller}
-% \end{syntax}
-% This function is only created if debugging is enabled. By default
-% it is equivalent to \cs{use_i:nnnn}. When expression checking is
-% enabled, it leaves in the input stream the result of \cs{tex_the:D}
-% \meta{eval} \meta{expr} \cs{tex_relax:D} after checking that no
-% token was left over. If any token was not taken as part of the
-% expression, there is an error message displaying the result of the
-% evaluation as well as the \meta{caller}. For instance \meta{eval}
-% can be \cs{__int_eval:w} and \meta{caller} can be \cs{int_eval:n} or
-% \cs{int_set:Nn}. The argument \meta{convert} is empty except for mu
-% expressions where it is \cs{etex_mutoglue:D}, used for internal
-% purposes.
-% \end{function}
-%
-% \begin{function}{\__kernel_chk_var_exist:N}
-% \begin{syntax}
-% \cs{__kernel_chk_var_exist:N} \meta{var}
-% \end{syntax}
-% This function is only created if debugging is enabled. It checks
-% that \meta{var} is defined according to the criteria for
-% \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
-% \end{function}
-%
-% \begin{function}{\__kernel_chk_var_scope:NN}
-% \begin{syntax}
-% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}
-% \end{syntax}
-% Checks the \meta{var} has the correct \meta{scope}, and if not
-% raises a kernel-level error. This function is only created if
-% debugging is enabled. The \meta{scope} is a single letter |l|, |g|,
-% |c| denoting local variables, global variables, or constants. More
-% precisely, if the variable name starts with a letter and an
-% underscore (normal \pkg{expl3} convention) the function checks that
-% this single letter matches the \meta{scope}. Otherwise the function
-% cannot know the scope \meta{var} the first time: instead, it defines
-% |\__debug_chk_/|\meta{var name} to store that information for the
-% next call. Thus, if a given \meta{var} is subject to assignments of
-% different scopes a kernel error will result.
-% \end{function}
-%
-% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
-% \begin{syntax}
-% \cs{__kernel_chk_var_local:N} \meta{var}
-% \cs{__kernel_chk_var_global:N} \meta{var}
-% \end{syntax}
-% Applies \cs{__kernel_chk_var_exist:N} \meta{var}, then
-% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where
-% \meta{scope} is |l| or~|g|.
-% \end{function}
-%
-% \begin{function}{\__kernel_debug_log:x}
-% \begin{syntax}
-% \cs{__kernel_debug_log:x} \Arg{message text}
-% \end{syntax}
-% If the \texttt{log-functions} option is active, this function writes
-% the \meta{message text} to the log file using \cs{iow_log:x}.
-% Otherwise, the \meta{message text} is ignored using \cs{use_none:n}.
-% This function is only created if debugging is enabled.
-% \end{function}
-%
-% \begin{function}{\__kernel_patch:nnNNpn}
-% \begin{syntax}
-% \cs{__kernel_patch:nnNNpn} \Arg{before} \Arg{after}
-% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
-% \end{syntax}
-% If debugging is not enabled, this function ignores the \meta{before}
-% and \meta{after} code and performs the \meta{definition} with no
-% patching. Otherwise it replaces \meta{code} by \meta{before}
-% \meta{code} \meta{after} (which can involve |#1| and so on) in the
-% \meta{definition} that follows. The \meta{definition} must start
-% with \cs{cs_new:Npn} or \cs{cs_set:Npn} or \cs{cs_gset:Npn} or their
-% \texttt{_protected} counterparts. Other cases can be added as
-% needed.
-% \end{function}
-%
-% \begin{function}{\__kernel_patch_conditional:nNNpnn}
-% \begin{syntax}
-% \cs{__kernel_patch_conditional:nNNpnn} \Arg{before}
-% \meta{definition} \meta{conditional} \meta{parameters} \Arg{type} \Arg{code}
-% \end{syntax}
-% Similar to \cs{__kernel_patch:nnNNpn} for conditionals, namely
-% \meta{definition} must be \cs{prg_new_conditional:Npnn} or its
-% \texttt{_protected} counterpart. There is no \meta{after} code
-% because that would interfere with the action of the conditional.
-% \end{function}
-%
-% \begin{function}
-% {\__kernel_patch_args:nNNpn, \__kernel_patch_conditional_args:nNNpnn}
-% \begin{syntax}
-% \cs{__kernel_patch_args:nNNpn} \Arg{arguments}
-% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
-% \end{syntax}
-% Like \cs{__kernel_patch:nnNNpn}, this tweaks the following
-% definition, but from the \enquote{inside out} (and if debugging is
-% not enabled, the \meta{arguments} are ignored). It replaces |#1|,
-% |#2| and so on in the \meta{code} of the definition as indicated by
-% the \meta{arguments}. More precisely, a temporary function is
-% defined using the \meta{definition} with the \meta{parameters} and
-% \meta{code}, then the result of expanding that function once in
-% front of the \meta{arguments} is used instead of the \meta{code}
-% when defining the actual function. For instance,
-% \begin{quote}
-% \cs{__kernel_patch_args:nNNpn} |{ { (#1) } }| \\
-% \cs{cs_new:Npn} \cs{int_eval:n} |#1| \\
-% ~~|{ \__int_value:w \__int_eval:w #1 \__int_eval_end: }|
-% \end{quote}
-% would replace |#1| by |(#1)| in the definition of \cs{int_eval:n} when
-% debugging is enabled. This fails if the \meta{code} contains~|##|.
-% The \cs{__kernel_patch_conditional_args:nNNpnn} function is for use
-% before \cs{prg_new_conditional:Npnn} or its \texttt{_protected}
-% counterpart.
-% \end{function}
-%
-% \begin{function}
-% {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn}
-% \begin{syntax}
-% \cs{__kernel_patch_args:nnnNNpn} \Arg{before} \Arg{after} \Arg{arguments}
-% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
-% \end{syntax}
-% A combination of \cs{__kernel_patch:nnNNpn} and
-% \cs{__kernel_patch_args:nNNpn}.
-% \end{function}
-%
-% \begin{function}{\__kernel_check_defined:NT}
-% \begin{syntax}
-% \cs{__kernel_check_defined:NT} \meta{variable} \Arg{true code}
-% \end{syntax}
-% If \meta{variable} is not defined (according to
-% \cs{cs_if_exist:NTF}), this triggers an error, otherwise the
-% \meta{true code} is run.
-% \end{function}
-%
-% \begin{function}{\__kernel_register_show:N, \__kernel_register_show:c}
-% \begin{syntax}
-% \cs{__kernel_register_show:N} \meta{register}
-% \end{syntax}
-% Used to show the contents of a \TeX{} register at the terminal, formatted
-% such that internal parts of the mechanism are not visible.
-% \end{function}
-%
-% \begin{function}[updated = 2015-08-03]
-% {\__kernel_register_log:N, \__kernel_register_log:c}
-% \begin{syntax}
-% \cs{__kernel_register_log:N} \meta{register}
-% \end{syntax}
-% Used to write the contents of a \TeX{} register to the log file in a
-% form similar to \cs{__kernel_register_show:N}.
-% \end{function}
-%
-% \begin{function}[EXP]{\__prg_case_end:nw}
-% \begin{syntax}
-% \cs{__prg_case_end:nw} \Arg{code} \meta{tokens} \cs{q_mark} \Arg{true code} \cs{q_mark} \Arg{false code} \cs{q_stop}
-% \end{syntax}
-% Used to terminate case statements (\cs{int_case:nnTF}, \emph{etc.})
-% by removing trailing \meta{tokens} and the end marker
-% \cs{q_stop}, inserting the \meta{code} for the successful
-% case (if one is found) and either the \texttt{true code} or
-% \texttt{false code} for the over all outcome, as appropriate.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -1482,11 +1257,12 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\tl_to_str:n, \token_to_str:N}
+% \begin{macro}[EXP]{\tl_to_str:n, \token_to_str:N, \__kernel_tl_to_str:w}
% Making strings.
% \begin{macrocode}
-\tex_let:D \tl_to_str:n \etex_detokenize:D
-\tex_let:D \token_to_str:N \tex_string:D
+\tex_let:D \tl_to_str:n \etex_detokenize:D
+\tex_let:D \token_to_str:N \tex_string:D
+\tex_let:D \__kernel_tl_to_str:w \etex_detokenize:D
% \end{macrocode}
% \end{macro}
%
@@ -1674,8 +1450,24 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+%<@@=use>
+% \end{macrocode}
+%
+% \begin{macro}[EXP]{\use_x:n}
+% A candidate, but needed early as it links to string comparisons.
+% Currently \LuaTeX-only.
+% \begin{macrocode}
+\cs_set:Npn \use_x:n #1 { \luatex_expanded:D {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=exp>
+% \end{macrocode}
+%
% \begin{macro}[EXP]{\use:n, \use:nn, \use:nnn, \use:nnnn}
-% These macros grab their arguments and returns them back to the input
+% These macros grab their arguments and return them back to the input
% (with outer braces removed).
% \begin{macrocode}
\cs_set:Npn \use:n #1 {#1}
@@ -1738,7 +1530,8 @@
% \begin{macrocode}
\cs_set:Npn \use_i_delimit_by_q_nil:nw #1#2 \q_nil {#1}
\cs_set:Npn \use_i_delimit_by_q_stop:nw #1#2 \q_stop {#1}
-\cs_set:Npn \use_i_delimit_by_q_recursion_stop:nw #1#2 \q_recursion_stop {#1}
+\cs_set:Npn \use_i_delimit_by_q_recursion_stop:nw
+ #1#2 \q_recursion_stop {#1}
% \end{macrocode}
% \end{macro}
%
@@ -1782,7 +1575,7 @@
%<@@=debug>
% \end{macrocode}
%
-% \begin{macro}{\__kernel_debug:TF}
+% \begin{macro}{\__kernel_if_debug:TF}
% A more meaningful test of whether debugging is enabled than messing
% up with guards. We can also more easily change the logic in one
% place then. At present, debugging is disabled in the format and in
@@ -1790,10 +1583,10 @@
% options \texttt{enable-debug}, \texttt{log-functions} or
% \texttt{check-declarations} was given.
% \begin{macrocode}
-\cs_set_protected:Npn \__kernel_debug:TF #1#2 {#2}
+\cs_set_protected:Npn \__kernel_if_debug:TF #1#2 {#2}
%<*package>
\tex_ifodd:D \l at expl@enable at debug@bool
- \cs_set_protected:Npn \__kernel_debug:TF #1#2 {#1}
+ \cs_set_protected:Npn \__kernel_if_debug:TF #1#2 {#1}
\fi:
%</package>
% \end{macrocode}
@@ -1800,15 +1593,15 @@
% \end{macro}
%
% \begin{macro}{\debug_on:n, \debug_off:n}
-%
+%
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \debug_on:n #1
{
\exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
{
- \cs_if_exist_use:cF { __debug_##1_on: }
+ \cs_if_exist_use:cF { @@_ ##1 _on: }
{ \__kernel_msg_error:nnn { kernel } { debug } {##1} }
}
}
@@ -1816,7 +1609,7 @@
{
\exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
{
- \cs_if_exist_use:cF { __debug_##1_off: }
+ \cs_if_exist_use:cF { @@_ ##1 _off: }
{ \__kernel_msg_error:nnn { kernel } { debug } {##1} }
}
}
@@ -1837,32 +1630,32 @@
% \end{macro}
%
% \begin{macro}{\debug_suspend:, \debug_resume:}
-% \begin{macro}{\__debug_suspended:T}
-% \begin{macro}{\l__debug_suspended_tl}
+% \begin{macro}{\@@_suspended:T}
+% \begin{macro}{\l_@@_suspended_tl}
% Suspend and resume locally all debug-related errors and logging
% except deprecation errors. The \cs{debug_suspend:} and \cs{debug_resume:}
% pairs can be nested. We keep track of nesting in a token list
% containing a number of periods. At first begin with the
-% \enquote{non-suspended} version of \cs{__debug_suspended:T}.
+% \enquote{non-suspended} version of \cs{@@_suspended:T}.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
- \cs_set_nopar:Npn \l__debug_suspended_tl { }
+ \cs_set_nopar:Npn \l_@@_suspended_tl { }
\cs_set_protected:Npn \debug_suspend:
{
- \tl_put_right:Nn \l__debug_suspended_tl { . }
- \cs_set_eq:NN \__debug_suspended:T \use:n
+ \tl_put_right:Nn \l_@@_suspended_tl { . }
+ \cs_set_eq:NN \@@_suspended:T \use:n
}
\cs_set_protected:Npn \debug_resume:
{
- \tl_set:Nx \l__debug_suspended_tl
- { \tl_tail:N \l__debug_suspended_tl }
- \tl_if_empty:NT \l__debug_suspended_tl
+ \tl_set:Nx \l_@@_suspended_tl
+ { \tl_tail:N \l_@@_suspended_tl }
+ \tl_if_empty:NT \l_@@_suspended_tl
{
- \cs_set_eq:NN \__debug_suspended:T \use_none:n
+ \cs_set_eq:NN \@@_suspended:T \use_none:n
}
}
- \cs_set:Npn \__debug_suspended:T #1 { }
+ \cs_set:Npn \@@_suspended:T #1 { }
}
{
\cs_set_protected:Npn \debug_suspend: { }
@@ -1874,7 +1667,7 @@
% \end{macro}
%
% \begin{macro}
-% {\__debug_check-declarations_on:, \__debug_check-declarations_off:}
+% {\@@_check-declarations_on:, \@@_check-declarations_off:}
% \begin{macro}{\__kernel_chk_var_exist:N}
% \begin{macro}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c}
% \begin{macro}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
@@ -1890,13 +1683,13 @@
% perform both checks.
% \end{itemize}
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
- \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: }
+ \exp_args:Nc \cs_set_protected:Npn { @@_check-declarations_on: }
{
\cs_set_protected:Npn \__kernel_chk_var_exist:N ##1
{
- \__debug_suspended:T \use_none:nnn
+ \@@_suspended:T \use_none:nnn
\cs_if_exist:NF ##1
{
\__kernel_msg_error:nnx { kernel } { non-declared-variable }
@@ -1905,7 +1698,7 @@
}
\cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1
{
- \__debug_suspended:T \use_none:nnn
+ \@@_suspended:T \use_none:nnn
\cs_if_exist:NF ##1
{
\__kernel_msg_error:nnx { kernel } { command-not-defined }
@@ -1914,23 +1707,23 @@
}
\cs_set_protected:Npn \__kernel_chk_var_scope:NN
{
- \__debug_suspended:T \use_none:nnn
- \__debug_chk_var_scope_aux:NN
+ \@@_suspended:T \use_none:nnn
+ \@@_chk_var_scope_aux:NN
}
\cs_set_protected:Npn \__kernel_chk_var_local:N ##1
{
- \__debug_suspended:T \use_none:nnnnn
+ \@@_suspended:T \use_none:nnnnn
\__kernel_chk_var_exist:N ##1
- \__debug_chk_var_scope_aux:NN l ##1
+ \@@_chk_var_scope_aux:NN l ##1
}
\cs_set_protected:Npn \__kernel_chk_var_global:N ##1
{
- \__debug_suspended:T \use_none:nnnnn
+ \@@_suspended:T \use_none:nnnnn
\__kernel_chk_var_exist:N ##1
- \__debug_chk_var_scope_aux:NN g ##1
+ \@@_chk_var_scope_aux:NN g ##1
}
}
- \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: }
+ \exp_args:Nc \cs_set_protected:Npn { @@_check-declarations_off: }
{
\cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { }
\cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { }
@@ -1941,9 +1734,9 @@
\cs_set_protected:Npn \__kernel_chk_cs_exist:c
{ \exp_args:Nc \__kernel_chk_cs_exist:N }
\tex_ifodd:D \l at expl@check at declarations@bool
- \use:c { __debug_check-declarations_on: }
+ \use:c { @@_check-declarations_on: }
\else:
- \use:c { __debug_check-declarations_off: }
+ \use:c { @@_check-declarations_off: }
\fi:
}
{ }
@@ -1954,13 +1747,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\__debug_chk_var_scope_aux:NN}
-% \begin{macro}{\__debug_chk_var_scope_aux:Nn}
-% \begin{macro}{\__debug_chk_var_scope_aux:NNn}
+% \begin{macro}{\@@_chk_var_scope_aux:NN}
+% \begin{macro}{\@@_chk_var_scope_aux:Nn}
+% \begin{macro}{\@@_chk_var_scope_aux:NNn}
% First check whether the name of the variable |#2| starts with
% \meta{letter}|_|. If it does then pass that letter, the
% \meta{scope}, and the variable name to
-% \cs{__debug_chk_var_scope_aux:NNn}. That function compares the two
+% \cs{@@_chk_var_scope_aux:NNn}. That function compares the two
% letters and triggers an error if they differ (the \cs{scan_stop:}
% case is not reachable here). If the second character was not |_|
% then pass the same data to the same auxiliary, except for its first
@@ -1970,23 +1763,23 @@
% letter \meta{scope} according to what the first assignment to the
% given variable was.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
- \cs_set_protected:Npn \__debug_chk_var_scope_aux:NN #1#2
- { \exp_args:NNf \__debug_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
- \cs_set_protected:Npn \__debug_chk_var_scope_aux:Nn #1#2
+ \cs_set_protected:Npn \@@_chk_var_scope_aux:NN #1#2
+ { \exp_args:NNf \@@_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
+ \cs_set_protected:Npn \@@_chk_var_scope_aux:Nn #1#2
{
\if:w _ \use_i:nn \use_i_delimit_by_q_stop:nw #2 ? ? \q_stop
- \exp_after:wN \__debug_chk_var_scope_aux:NNn
+ \exp_after:wN \@@_chk_var_scope_aux:NNn
\use_i_delimit_by_q_stop:nw #2 ? \q_stop
#1 {#2}
\else:
- \exp_args:Nc \__debug_chk_var_scope_aux:NNn
- { __debug_chk_/ #2 }
+ \exp_args:Nc \@@_chk_var_scope_aux:NNn
+ { @@_chk_/ #2 }
#1 {#2}
\fi:
}
- \cs_set_protected:Npn \__debug_chk_var_scope_aux:NNn #1#2#3
+ \cs_set_protected:Npn \@@_chk_var_scope_aux:NNn #1#2#3
{
\if:w #1 #2
\else:
@@ -2006,9 +1799,9 @@
% \end{macro}
%
% \begin{macro}
-% {\__debug_check-expressions_on:, \__debug_check-expressions_off:}
+% {\@@_check-expressions_on:, \@@_check-expressions_off:}
% \begin{macro}{\__kernel_chk_expr:nNnN}
-% \begin{macro}{\__debug_chk_expr_aux:nNnN}
+% \begin{macro}{\@@_chk_expr_aux:nNnN}
% When debugging is enabled these two functions set
% \cs{__kernel_chk_expr:nNnN} to test or not whether the given
% expression is valid. The idea is to evaluate the expression within
@@ -2028,28 +1821,28 @@
% |1+2\relax+3| would incorrectly be accepted as a valid integer
% expression.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
- \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: }
+ \exp_args:Nc \cs_set_protected:Npn { @@_check-expressions_on: }
{
\cs_set:Npn \__kernel_chk_expr:nNnN ##1##2
{
- \__debug_suspended:T { ##1 \use_none:nnnnnnn }
- \exp_after:wN \__debug_chk_expr_aux:nNnN
- \exp_after:wN { \tex_the:D ##2 ##1 \tex_relax:D }
+ \@@_suspended:T { ##1 \use_none:nnnnnnn }
+ \exp_after:wN \@@_chk_expr_aux:nNnN
+ \exp_after:wN { \tex_the:D ##2 ##1 \scan_stop: }
##2
}
}
- \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_off: }
+ \exp_args:Nc \cs_set_protected:Npn { @@_check-expressions_off: }
{ \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2##3##4 {##1} }
- \use:c { __debug_check-expressions_off: }
- \cs_set:Npn \__debug_chk_expr_aux:nNnN #1#2#3#4
+ \use:c { @@_check-expressions_off: }
+ \cs_set:Npn \@@_chk_expr_aux:nNnN #1#2#3#4
{
\tl_if_empty:oF
{
\tex_romannumeral:D - 0
\exp_after:wN \use_none:n
- \__int_value:w #3 #2 #1 \tex_relax:D
+ \int_value:w #3 #2 #1 \scan_stop:
}
{
\__kernel_msg_expandable_error:nnnn
@@ -2064,7 +1857,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\__debug_log-functions_on:, \__debug_log-functions_off:}
+% \begin{macro}{\@@_log-functions_on:, \@@_log-functions_off:}
% \begin{macro}{\__kernel_debug_log:x}
% These two functions (corresponding to the \pkg{expl3} option
% \texttt{log-functions}) control whether \cs{__kernel_debug_log:x} writes to the
@@ -2074,19 +1867,19 @@
% option was given. When debugging is not enabled, simply produce an
% error.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
- \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: }
+ \exp_args:Nc \cs_set_protected:Npn { @@_log-functions_on: }
{
\cs_set_protected:Npn \__kernel_debug_log:x
- { \__debug_suspended:T \use_none:nn \iow_log:x }
+ { \@@_suspended:T \use_none:nn \iow_log:x }
}
- \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: }
+ \exp_args:Nc \cs_set_protected:Npn { @@_log-functions_off: }
{ \cs_set_protected:Npn \__kernel_debug_log:x { \use_none:n } }
\tex_ifodd:D \l at expl@log at functions@bool
- \use:c { __debug_log-functions_on: }
+ \use:c { @@_log-functions_on: }
\else:
- \use:c { __debug_log-functions_off: }
+ \use:c { @@_log-functions_off: }
\fi:
}
{ }
@@ -2094,26 +1887,26 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\__debug_deprecation_on:, \__debug_deprecation_off:}
+% \begin{macro}{\@@_deprecation_on:, \@@_deprecation_off:}
% \begin{macro}{\__kernel_deprecation_code:nn}
-% \begin{variable}{\g__debug_deprecation_on_tl, \g__debug_deprecation_off_tl}
+% \begin{variable}{\g_@@_deprecation_on_tl, \g_@@_deprecation_off_tl}
% Some commands were more recently deprecated and not yet removed;
% only make these into errors if the user requests it. This relies on
% two token lists, mostly filled up by calls to
% \cs{__kernel_patch_deprecation:nnNNpn} in each module.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
- \cs_set_protected:Npn \__debug_deprecation_on:
- { \g__debug_deprecation_on_tl }
- \cs_set_protected:Npn \__debug_deprecation_off:
- { \g__debug_deprecation_off_tl }
- \cs_set_nopar:Npn \g__debug_deprecation_on_tl { }
- \cs_set_nopar:Npn \g__debug_deprecation_off_tl { }
+ \cs_set_protected:Npn \@@_deprecation_on:
+ { \g_@@_deprecation_on_tl }
+ \cs_set_protected:Npn \@@_deprecation_off:
+ { \g_@@_deprecation_off_tl }
+ \cs_set_nopar:Npn \g_@@_deprecation_on_tl { }
+ \cs_set_nopar:Npn \g_@@_deprecation_off_tl { }
\cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2
{
- \tl_gput_right:Nn \g__debug_deprecation_on_tl {#1}
- \tl_gput_right:Nn \g__debug_deprecation_off_tl {#2}
+ \tl_gput_right:Nn \g_@@_deprecation_on_tl {#1}
+ \tl_gput_right:Nn \g_@@_deprecation_off_tl {#2}
}
}
{
@@ -2125,15 +1918,16 @@
% \end{macro}
%
% \begin{macro}{\__kernel_patch_deprecation:nnNNpn}
-% \begin{macro}{\__debug_deprecation_aux:nnNnn}
-% Grab a definition (at present, must be \cs{cs_new_protected:Npn}).
-% Add to \cs{g__debug_deprecation_on_tl} some code that makes the
+% \begin{macro}{\@@_deprecation_aux:nnNnn}
+% Grab a definition (at present, must be \cs{cs_new_protected:Npn} or \cs{cs_new:Npn}).
+% Add to \cs{g_@@_deprecation_on_tl} some code that makes the
% defined macro |#3| outer (and defines it as an error). Add to
-% \cs{g__debug_deprecation_off_tl} the definition itself. In both
+% \cs{g_@@_deprecation_off_tl} the definition itself. In both
% cases we undefine the token with \cs{tex_let:D} to avoid taking a
% potentially outer macro as the argument of some \pkg{expl3}
-% function. Finally define the macro itself to produce a warning then
-% redefine and call itself. The macro initially takes no parameters:
+% function. Finally, define the macro itself: if it is protected,
+% make it produce a warning then redefine and call itself. The macro
+% initially takes no parameters:
% together with the \texttt{x}-expanding assignment and \cs{exp_not:n}
% this gives a convenient way of storing the macro's definition in
% itself in order to only produce the warning once for each macro.
@@ -2140,25 +1934,32 @@
% If debugging is disabled, \cs{__kernel_patch_deprecation:nnNNpn} lets the
% definition happen.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5#
{
\if_meaning:w \cs_new_protected:Npn #3
+ \exp_after:wN \use_i:nn
\else:
- \__kernel_msg_error:nnx { kernel } { debug-unpatchable }
- { \token_to_str:N #3 ~(for~deprecation) }
+ \if_meaning:w \cs_new:Npn #3
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_ii:nn
+ \else:
+ \__kernel_msg_error:nnx { kernel } { debug-unpatchable }
+ { \token_to_str:N #3 ~(for~deprecation) }
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nn
+ \fi:
\fi:
- \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
+ { \@@_deprecation_aux:nnNnn {#1} {#2} #4 {#5} }
+ { \@@_deprecation_expandable:nnNnn {#1} {#2} #4 {#5} }
}
- \cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5
+ \cs_set_protected:Npn \@@_deprecation_aux:nnNnn #1#2#3#4#5
{
- \tl_gput_right:Nn \g__debug_deprecation_on_tl
+ \tl_gput_right:Nn \g_@@_deprecation_on_tl
{
\tex_let:D #3 \scan_stop:
- \__deprecation_error:Nnn #3 {#2} {#1}
+ \__kernel_deprecation_error:Nnn #3 {#2} {#1}
}
- \tl_gput_right:Nn \g__debug_deprecation_off_tl
+ \tl_gput_right:Nn \g_@@_deprecation_off_tl
{
\tex_let:D #3 \scan_stop:
\cs_set_protected:Npn #3 #4 {#5}
@@ -2172,6 +1973,20 @@
\exp_not:N #3
}
}
+ \cs_set_protected:Npn \@@_deprecation_expandable:nnNnn #1#2#3#4#5
+ {
+ \tl_gput_right:Nn \g_@@_deprecation_on_tl
+ {
+ \tex_let:D #3 \scan_stop:
+ \__kernel_deprecation_error:Nnn #3 {#2} {#1}
+ }
+ \tl_gput_right:Nn \g_@@_deprecation_off_tl
+ {
+ \tex_let:D #3 \scan_stop:
+ \cs_set:Npn #3 #4 {#5}
+ }
+ \cs_new:Npn #3 #4 {#5}
+ }
}
{ \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2 { } }
% \end{macrocode}
@@ -2181,7 +1996,7 @@
% \begin{macro}
% {\__kernel_patch:nnNNpn, \__kernel_patch_conditional:nNNpnn}
% \begin{macro}
-% {\__debug_patch_aux:nnnn, \__debug_patch_auxii:nnnn}
+% {\@@_patch_aux:nnnn, \@@_patch_auxii:nnnn}
% When debugging is not enabled, \cs{__kernel_patch:nnNNpn} and
% \cs{__kernel_patch_conditional:nNNpnn} throw the patch away.
% Otherwise they can be followed by \cs{cs_new:Npn} (or similar), and
@@ -2189,15 +2004,15 @@
% case, grab the name of the function to be defined and its parameters
% then insert tokens before and/or after the definition.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2#3#4#5#
- { \__debug_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } }
+ { \@@_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } }
\cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1#2#3#4#
- { \__debug_patch_auxii:nnnn {#1} { #2 #3 #4 } }
- \cs_set_protected:Npn \__debug_patch_aux:nnnn #1#2#3#4
+ { \@@_patch_auxii:nnnn {#1} { #2 #3 #4 } }
+ \cs_set_protected:Npn \@@_patch_aux:nnnn #1#2#3#4
{ #3 { #1 #4 #2 } }
- \cs_set_protected:Npn \__debug_patch_auxii:nnnn #1#2#3#4
+ \cs_set_protected:Npn \@@_patch_auxii:nnnn #1#2#3#4
{ #2 {#3} { #1 #4 } }
}
{
@@ -2214,10 +2029,10 @@
% {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn}
% \begin{macro}
% {
-% \__debug_tmp:w,
-% \__debug_patch_args_aux:nnnNNnn,
-% \__debug_patch_args_aux:nnnNNnnn,
-% \__debug_patch_args_aux:nnnn
+% \@@_tmp:w,
+% \@@_patch_args_aux:nnnNNnn,
+% \@@_patch_args_aux:nnnNNnnn,
+% \@@_patch_args_aux:nnnn
% }
% See \cs{__kernel_patch:nnNNpn}. The first argument is something like
% |{#1}{(#2)}|. Define a temporary macro using the \meta{parameters}
@@ -2230,30 +2045,32 @@
{ \__kernel_patch_args:nnnNNpn { } { } }
\cs_set_protected:Npn \__kernel_patch_conditional_args:nNNpnn
{ \__kernel_patch_conditional_args:nnnNNpnn { } { } }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3#4#5#6#
- { \__debug_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} }
- \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6#
- { \__debug_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} }
- \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7
+ { \@@_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} }
+ \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn
+ #1#2#3#4#5#6#
+ { \@@_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} }
+ \cs_set_protected:Npn \@@_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7
{
- \cs_set:Npn \__debug_tmp:w #6 {#7}
- \exp_after:wN \__debug_patch_args_aux:nnnn \exp_after:wN
- { \__debug_tmp:w #3 } { #4 #5 #6 } {#1} {#2}
+ \cs_set:Npn \@@_tmp:w #6 {#7}
+ \exp_after:wN \@@_patch_args_aux:nnnn \exp_after:wN
+ { \@@_tmp:w #3 } { #4 #5 #6 } {#1} {#2}
}
- \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8
+ \cs_set_protected:Npn \@@_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8
{
- \cs_set:Npn \__debug_tmp:w #6 {#8}
- \exp_after:wN \__debug_patch_args_aux:nnnn \exp_after:wN
- { \__debug_tmp:w #3 } { #4 #5 #6 {#7} } {#1} {#2}
+ \cs_set:Npn \@@_tmp:w #6 {#8}
+ \exp_after:wN \@@_patch_args_aux:nnnn \exp_after:wN
+ { \@@_tmp:w #3 } { #4 #5 #6 {#7} } {#1} {#2}
}
- \cs_set_protected:Npn \__debug_patch_args_aux:nnnn #1#2#3#4
+ \cs_set_protected:Npn \@@_patch_args_aux:nnnn #1#2#3#4
{ #2 { #3 #1 #4 } }
}
{
\cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3 { }
- \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3 { }
+ \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn
+ #1#2#3 { }
}
% \end{macrocode}
% \end{macro}
@@ -2335,8 +2152,12 @@
{ \@@_generate_conditional_parm:nnNpnn { new } { _protected } }
\cs_set_protected:Npn \@@_generate_conditional_parm:nnNpnn #1#2#3#4#
{
- \__cs_split_function:NN #3 \@@_generate_conditional:nnNnnnnn
- {#1} {#2} {#4}
+ \use:x
+ {
+ \@@_generate_conditional:nnNnnnnn
+ \cs_split_function:N #3
+ }
+ {#1} {#2} {#4}
}
% \end{macrocode}
% \end{macro}
@@ -2377,12 +2198,16 @@
{ \@@_generate_conditional_count:nnNnn { new } { _protected } }
\cs_set_protected:Npn \@@_generate_conditional_count:nnNnn #1#2#3
{
- \__cs_split_function:NN #3 \@@_generate_conditional_count:nnNnnnn
- {#1} {#2}
+ \use:x
+ {
+ \@@_generate_conditional_count:nnNnnnn
+ \cs_split_function:N #3
+ }
+ {#1} {#2}
}
\cs_set_protected:Npn \@@_generate_conditional_count:nnNnnnn #1#2#3#4#5
{
- \__cs_parm_from_arg_count:nnF
+ \__kernel_cs_parm_from_arg_count:nnF
{ \@@_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
{ \tl_count:n {#2} }
{
@@ -2529,8 +2354,8 @@
\use:x
{
\exp_not:N \@@_set_eq_conditional:nnNnnNNw
- \__cs_split_function:NN #2 \prg_do_nothing:
- \__cs_split_function:NN #3 \prg_do_nothing:
+ \cs_split_function:N #2
+ \cs_split_function:N #3
\exp_not:N #1
\tl_to_str:n {#4}
\exp_not:n { , \q_recursion_tail , \q_recursion_stop }
@@ -2637,6 +2462,44 @@
%<@@=cs>
% \end{macrocode}
%
+% \begin{function}{\@@_count_signature:N}
+% \begin{syntax}
+% \cs{@@_count_signature:N} \meta{function}
+% \end{syntax}
+% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
+% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
+% The \meta{number} of tokens in the \meta{signature} is then left in
+% the input stream. If there was no \meta{signature} then the result is
+% the marker value $-1$.
+% \end{function}
+%
+% \begin{function}[EXP]{\@@_get_function_name:N}
+% \begin{syntax}
+% \cs{@@_get_function_name:N} \meta{function}
+% \end{syntax}
+% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
+% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
+% The \meta{name} is then left in the input stream without the escape
+% character present made up of tokens with category code $12$
+% (other).
+% \end{function}
+%
+% \begin{function}[EXP]{\@@_get_function_signature:N}
+% \begin{syntax}
+% \cs{@@_get_function_signature:N} \meta{function}
+% \end{syntax}
+% Splits the \meta{function} into the \meta{name} (\emph{i.e.}~the part
+% before the colon) and the \meta{signature} (\emph{i.e.}~after the colon).
+% The \meta{signature} is then left in the input stream made up of
+% tokens with category code $12$ (other).
+% \end{function}
+%
+% \begin{function}{\@@_tmp:w}
+% Function used for various short-term usages, for instance defining
+% functions whose definition involves tokens which are hard to insert
+% normally (spaces, characters with category other).
+% \end{function}
+%
% \begin{macro}[EXP]{\cs_to_str:N}
% \begin{macro}[EXP]{\@@_to_str:N, \@@_to_str:w}
% This converts a control sequence into the character string of its
@@ -2670,7 +2533,7 @@
% \cs{token_to_str:N}, and stops the \cs{tex_romannumeral:D} with \cs{c_zero}.
% The last case is that the escape character is itself a space. In this
% case, the \cs{if:w} test is true, and the auxiliary \cs{@@_to_str:w}
-% comes into play, inserting |-\__int_value:w|, which expands \cs{c_zero}
+% comes into play, inserting |-\int_value:w|, which expands \cs{c_zero}
% to the character |0|. The initial \cs{tex_romannumeral:D} then sees
% |0|, which is not a terminated number, followed by the escape character,
% a space, which is removed, terminating the expansion of
@@ -2693,7 +2556,7 @@
}
\cs_set:Npn \@@_to_str:N #1 { \c_zero }
\cs_set:Npn \@@_to_str:w #1 \@@_to_str:N
- { - \__int_value:w \fi: \exp_after:wN \c_zero }
+ { - \int_value:w \fi: \exp_after:wN \c_zero }
% \end{macrocode}
% If speed is a concern we could use \tn{csstring} in \LuaTeX{}. For
% the empty csname that primitive gives an empty result while the
@@ -2702,7 +2565,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_split_function:NN}
+% \begin{macro}[EXP]{\cs_split_function:N}
% \begin{macro}[EXP]
% {\@@_split_function_auxi:w, \@@_split_function_auxii:w}
% This function takes a function name and splits it into name with
@@ -2709,12 +2572,7 @@
% the escape char removed and argument specification. In addition to
% this, a third argument, a boolean \meta{true} or \meta{false} is
% returned with \meta{true} for when there is a colon in the function
-% and \meta{false} if there is not. Lastly, the second argument of
-% \cs{@@_split_function:NN} is supposed to be a function
-% taking three variables, one for name, one for signature, and one
-% for the boolean. For example,
-% |\@@_split_function:NN \foo_bar:cnx \use_i:nnn| as input
-% becomes |\use_i:nnn {foo_bar} {cnx} \c_true_bool|.
+% and \meta{false} if there is not.
%
% We cannot use |:| directly as it has the wrong category code so
% an |x|-type expansion is used to force the conversion.
@@ -2726,41 +2584,30 @@
% then \cs{c_true_bool} as |#3|, and |#4| cleans up until \cs{q_stop}.
% Otherwise, the |#1| contains the function name and \cs{q_mark}
% \cs{c_true_bool}, |#2| is empty, |#3| is \cs{c_false_bool}, and |#4|
-% cleans up. In both cases, |#5| is the \meta{processor}. The second
+% cleans up. The second
% auxiliary trims the trailing \cs{q_mark} from the function name if
% present (that is, if the original function had no colon).
% \begin{macrocode}
-\cs_set:Npx \@@_split_function:NN #1
+\cs_set_protected:Npn \@@_tmp:w #1
{
- \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN
- \exp_not:N \exp_after:wN \exp_not:N \@@_split_function_auxi:w
- \exp_not:N \cs_to_str:N #1 \exp_not:N \q_mark \c_true_bool
- \token_to_str:N : \exp_not:N \q_mark \c_false_bool
- \exp_not:N \q_stop
+ \cs_set:Npn \cs_split_function:N ##1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \@@_split_function_auxi:w
+ \cs_to_str:N ##1 \q_mark \c_true_bool
+ #1 \q_mark \c_false_bool \q_stop
+ }
+ \cs_set:Npn \@@_split_function_auxi:w
+ ##1 #1 ##2 \q_mark ##3##4 \q_stop
+ { \@@_split_function_auxii:w ##1 \q_mark \q_stop {##2} ##3 }
+ \cs_set:Npn \@@_split_function_auxii:w ##1 \q_mark ##2 \q_stop
+ { {##1} }
}
-\use:x
- {
- \cs_set:Npn \exp_not:N \@@_split_function_auxi:w
- ##1 \token_to_str:N : ##2 \exp_not:N \q_mark ##3##4 \exp_not:N \q_stop ##5
- }
- { \@@_split_function_auxii:w #5 #1 \q_mark \q_stop {#2} #3 }
-\cs_set:Npn \@@_split_function_auxii:w #1#2 \q_mark #3 \q_stop
- { #1 {#2} }
+\exp_after:wN \@@_tmp:w \token_to_str:N :
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]
-% {\@@_get_function_name:N, \@@_get_function_signature:N}
-% Simple wrappers.
-% \begin{macrocode}
-\cs_set:Npn \@@_get_function_name:N #1
- { \@@_split_function:NN #1 \use_i:nnn }
-\cs_set:Npn \@@_get_function_signature:N #1
- { \@@_split_function:NN #1 \use_ii:nnn }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Exist or free}
%
% A control sequence is said to \emph{exist} (to be used) if has an entry in
@@ -2899,7 +2746,7 @@
% \begin{macrocode}
\cs_set_protected:Npn \__kernel_msg_error:nnxx #1#2#3#4
{
- \tex_newlinechar:D = `\^^J \tex_relax:D
+ \tex_newlinechar:D = `\^^J \scan_stop:
\tex_errmessage:D
{
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~! ^^J
@@ -2937,7 +2784,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\__chk_if_free_cs:N, \__chk_if_free_cs:c}
+% \begin{macro}{\__kernel_chk_if_free_cs:N, \__kernel_chk_if_free_cs:c}
% This command is called by \cs{cs_new_nopar:Npn} and \cs{cs_new_eq:NN}
% \emph{etc.}\
% to make sure that the argument sequence is not already in use. If
@@ -2947,9 +2794,12 @@
% conditional processing since it may be an |\if...| type function!
% \begin{macrocode}
\__kernel_patch:nnNNpn { }
- { \__kernel_debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
-\cs_set_protected:Npn \__chk_if_free_cs:N #1
{
+ \__kernel_debug_log:x
+ { Defining~\token_to_str:N #1~ \msg_line_context: }
+ }
+\cs_set_protected:Npn \__kernel_chk_if_free_cs:N #1
+ {
\cs_if_free:NF #1
{
\__kernel_msg_error:nnxx { kernel } { command-already-defined }
@@ -2956,8 +2806,8 @@
{ \token_to_str:N #1 } { \token_to_meaning:N #1 }
}
}
-\cs_set_protected:Npn \__chk_if_free_cs:c
- { \exp_args:Nc \__chk_if_free_cs:N }
+\cs_set_protected:Npn \__kernel_chk_if_free_cs:c
+ { \exp_args:Nc \__kernel_chk_if_free_cs:N }
% \end{macrocode}
% \end{macro}
%
@@ -2982,7 +2832,7 @@
{
\cs_set_protected:Npn #1 ##1
{
- \__chk_if_free_cs:N ##1
+ \__kernel_chk_if_free_cs:N ##1
#2 ##1
}
}
@@ -3111,7 +2961,7 @@
\cs_new_protected:Npn \cs_gset_eq:cc { \exp_args:Ncc \cs_gset_eq:NN }
\cs_new_protected:Npn \cs_new_eq:NN #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\tex_global:D \cs_set_eq:NN #1
}
\cs_new_protected:Npn \cs_new_eq:cN { \exp_args:Nc \cs_new_eq:NN }
@@ -3149,7 +2999,7 @@
%<@@=cs>
% \end{macrocode}
%
-% \begin{macro}{\@@_parm_from_arg_count:nnF}
+% \begin{macro}{\__kernel_cs_parm_from_arg_count:nnF}
% \begin{macro}{\@@_parm_from_arg_count_test:nnF}
% \LaTeX3 provides shorthands to define control sequences and
% conditionals with a simple parameter text, derived directly from the
@@ -3163,12 +3013,12 @@
% the functions use here are not defined yet, but will be defined
% before this function is called.
% \begin{macrocode}
-\cs_set_protected:Npn \@@_parm_from_arg_count:nnF #1#2
+\cs_set_protected:Npn \__kernel_cs_parm_from_arg_count:nnF #1#2
{
\exp_args:Nx \@@_parm_from_arg_count_test:nnF
{
\exp_after:wN \exp_not:n
- \if_case:w \__int_eval:n {#2}
+ \if_case:w \int_eval:n {#2}
{ }
\or: { ##1 }
\or: { ##1##2 }
@@ -3204,6 +3054,7 @@
% \end{macrocode}
%
% \begin{macro}[EXP]{\@@_count_signature:N, \@@_count_signature:c}
+% \begin{macro}[EXP]{\@@_count_signature:n}
% \begin{macro}[EXP]{\@@_count_signature:nnN}
% Counting the number of tokens in the signature, \emph{i.e.}, the
% number of arguments the function should take. Since this is not
@@ -3212,7 +3063,9 @@
% We need a variant form right away.
% \begin{macrocode}
\cs_new:Npn \@@_count_signature:N #1
- { \int_eval:n { \@@_split_function:NN #1 \@@_count_signature:nnN } }
+ { \exp_args:Nf \@@_count_signature:n { \cs_split_function:N #1 } }
+\cs_new:Npn \@@_count_signature:n #1
+ { \int_eval:n { \@@_count_signature:nnN #1 } }
\cs_new:Npn \@@_count_signature:nnN #1#2#3
{
\if_meaning:w \c_true_bool #3
@@ -3226,6 +3079,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
@@ -3246,7 +3100,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \cs_generate_from_arg_count:NNnn #1#2#3#4
{
- \@@_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
+ \__kernel_cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
{
\__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
{ \token_to_str:N #1 } { \int_eval:n {#3} }
@@ -3296,7 +3150,7 @@
% \cs_set_protected:Npn \cs_set:Nn #1#2
% {
% \cs_generate_from_arg_count:NNnn #1 \cs_set:Npn
-% { \__cs_count_signature:N #1 } {#2}
+% { \@@_count_signature:N #1 } {#2}
% }
% \end{verbatim}
% In short, to define \cs{cs_set:Nn} we need just use \cs{cs_set:Npn},
@@ -3314,8 +3168,12 @@
}
\cs_new_protected:Npn \@@_generate_from_signature:NNn #1#2
{
- \@@_split_function:NN #2 \@@_generate_from_signature:nnNNNn
- #1 #2
+ \use:x
+ {
+ \@@_generate_from_signature:nnNNNn
+ \cs_split_function:N #2
+ }
+ #1 #2
}
\cs_new_protected:Npn \@@_generate_from_signature:nnNNNn #1#2#3#4#5#6
{
@@ -3454,10 +3312,10 @@
%<@@=kernel>
% \end{macrocode}
%
-% \begin{macro}{\@@_check_defined:NT}
+% \begin{macro}{\@@_chk_defined:NT}
% Error if the variable |#1| is not defined.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_check_defined:NT #1#2
+\cs_new_protected:Npn \@@_chk_defined:NT #1#2
{
\cs_if_exist:NTF #1
{#2}
@@ -3490,7 +3348,7 @@
{ \exp_args:Nc \@@_register_log:N }
\cs_new_protected:Npn \@@_register_show_aux:NN #1#2
{
- \@@_check_defined:NT #2
+ \@@_chk_defined:NT #2
{
\exp_args:No \@@_register_show_aux:nNN
{ \tex_the:D #2 } #2 #1
@@ -3537,7 +3395,7 @@
% \begin{macro}[EXP]{\prg_do_nothing:}
% This does not fit anywhere else!
% \begin{macrocode}
-\cs_new_nopar:Npn \prg_do_nothing: { }
+\cs_new:Npn \prg_do_nothing: { }
% \end{macrocode}
% \end{macro}
%
@@ -3547,7 +3405,7 @@
%<@@=prg>
% \end{macrocode}
%
-% \begin{macro}[EXP]{\@@_break_point:Nn, \@@_map_break:Nn}
+% \begin{macro}[EXP]{\prg_break_point:Nn, \prg_map_break:Nn}
% In inline mappings, the nesting level must be reset
% at the end of the mapping, even when the user decides
% to break out. This is done by putting the code that
@@ -3557,28 +3415,28 @@
% before the user's code (if any). There is a check that we close the
% correct loop, otherwise we continue breaking.
% \begin{macrocode}
-\cs_new_eq:NN \@@_break_point:Nn \use_ii:nn
-\cs_new:Npn \@@_map_break:Nn #1#2#3 \@@_break_point:Nn #4#5
+\cs_new_eq:NN \prg_break_point:Nn \use_ii:nn
+\cs_new:Npn \prg_map_break:Nn #1#2#3 \prg_break_point:Nn #4#5
{
#5
\if_meaning:w #1 #4
\exp_after:wN \use_iii:nnn
\fi:
- \@@_map_break:Nn #1 {#2}
+ \prg_map_break:Nn #1 {#2}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_break_point:}
-% \begin{macro}{\@@_break:, \@@_break:n}
-% Very simple analogues of \cs{@@_break_point:Nn} and
-% \cs{@@_map_break:Nn}, for use in fast short-term recursions which
+% \begin{macro}{\prg_break_point:}
+% \begin{macro}{\prg_break:, \prg_break:n}
+% Very simple analogues of \cs{prg_break_point:Nn} and
+% \cs{prg_map_break:Nn}, for use in fast short-term recursions which
% are not mappings, do not need to support nesting, and in which
% nothing has to be done at the end of the loop.
% \begin{macrocode}
-\cs_new_eq:NN \@@_break_point: \prg_do_nothing:
-\cs_new:Npn \@@_break: #1 \@@_break_point: { }
-\cs_new:Npn \@@_break:n #1#2 \@@_break_point: {#1}
+\cs_new_eq:NN \prg_break_point: \prg_do_nothing:
+\cs_new:Npn \prg_break: #1 \prg_break_point: { }
+\cs_new:Npn \prg_break:n #1#2 \prg_break_point: {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -138,7 +138,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -211,14 +211,6 @@
% {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
% \end{verbatim}
%
-% \subsection{Internal functions and variables}
-%
-% \begin{variable}{\l__kernel_expl_bool}
-% A boolean which records the current code syntax status: \texttt{true} if
-% currently inside a code environment. This variable should only be
-% set by \cs{ExplSyntaxOn}/\cs{ExplSyntaxOff}.
-% \end{variable}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -505,7 +497,7 @@
\begingroup
% \end{macrocode}
% Lower case chars: map to themselves when lower casing and down by |"20| when
-% upper casing. (The characters |a|--|z| are set up correctly by Ini\TeX{}.)
+% upper casing. (The characters |a|--|z| are set up correctly by \IniTeX{}.)
% \begin{macrocode}
\def\temp{%
\ifnum\count0>\count2 %
@@ -525,7 +517,7 @@
% \end{macrocode}
% Upper case chars: map up by |"20| when lower casing, to themselves when upper
% casing and require an \tn{sfcode} of $999$. (The characters |A|--|Z| are set
-% up correctly by Ini\TeX{}.)
+% up correctly by \IniTeX{}.)
% \begin{macrocode}
\def\temp{%
\ifnum\count0>\count2 %
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -842,9 +842,28 @@
%<@@=box>
% \end{macrocode}
%
-% The code in this module is very straight forward so I'm not going to
-% comment it very extensively.
+% \subsection{Support code}
%
+% \begin{macro}{\@@_dim_eval:w}
+% \begin{macro}{\@@_dim_eval:n}
+% Evaluating a dimension expression expandably. The only
+% difference with \cs{dim_eval:n} is the lack of \cs{dim_use:N}, to
+% produce an internal dimension rather than expand it into characters.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_dim_eval:w \etex_dimexpr:D
+\__kernel_patch_args:nNNpn
+ {
+ {
+ \__kernel_chk_expr:nNnN {#1}
+ \@@_dim_eval:w { } \@@_dim_eval:n
+ }
+ }
+\cs_new:Npn \@@_dim_eval:n #1
+ { \@@_dim_eval:w #1 \scan_stop: }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Creating and initialising boxes}
%
% \TestFiles{m3box001.lvt}
@@ -856,7 +875,7 @@
%<*package>
\cs_new_protected:Npn \box_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs:w newbox \cs_end: #1
}
%</package>
@@ -978,11 +997,11 @@
% parentheses to catch early termination.
% \begin{macrocode}
\cs_new_protected:Npn \box_set_dp:Nn #1#2
- { \box_dp:N #1 \__dim_eval:n {#2} }
+ { \box_dp:N #1 \@@_dim_eval:n {#2} }
\cs_new_protected:Npn \box_set_ht:Nn #1#2
- { \box_ht:N #1 \__dim_eval:n {#2} }
+ { \box_ht:N #1 \@@_dim_eval:n {#2} }
\cs_new_protected:Npn \box_set_wd:Nn #1#2
- { \box_wd:N #1 \__dim_eval:n {#2} }
+ { \box_wd:N #1 \@@_dim_eval:n {#2} }
\cs_generate_variant:Nn \box_set_ht:Nn { c }
\cs_generate_variant:Nn \box_set_dp:Nn { c }
\cs_generate_variant:Nn \box_set_wd:Nn { c }
@@ -1014,13 +1033,13 @@
% parentheses to catch early termination.
% \begin{macrocode}
\cs_new_protected:Npn \box_move_left:nn #1#2
- { \tex_moveleft:D \__dim_eval:n {#1} #2 }
+ { \tex_moveleft:D \@@_dim_eval:n {#1} #2 }
\cs_new_protected:Npn \box_move_right:nn #1#2
- { \tex_moveright:D \__dim_eval:n {#1} #2 }
+ { \tex_moveright:D \@@_dim_eval:n {#1} #2 }
\cs_new_protected:Npn \box_move_up:nn #1#2
- { \tex_raise:D \__dim_eval:n {#1} #2 }
+ { \tex_raise:D \@@_dim_eval:n {#1} #2 }
\cs_new_protected:Npn \box_move_down:nn #1#2
- { \tex_lower:D \__dim_eval:n {#1} #2 }
+ { \tex_lower:D \@@_dim_eval:n {#1} #2 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1200,7 +1219,10 @@
% \begin{macrocode}
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \hbox_set:Nn #1#2
- { \tex_setbox:D #1 \tex_hbox:D { \color_group_begin: #2 \color_group_end: } }
+ {
+ \tex_setbox:D #1 \tex_hbox:D
+ { \color_group_begin: #2 \color_group_end: }
+ }
\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
\cs_new_protected:Npn \hbox_gset:Nn #1#2
{
@@ -1222,13 +1244,13 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3
{
- \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
+ \tex_setbox:D #1 \tex_hbox:D to \@@_dim_eval:n {#2}
{ \color_group_begin: #3 \color_group_end: }
}
\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
\cs_new_protected:Npn \hbox_gset_to_wd:Nnn #1#2#3
{
- \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
+ \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \@@_dim_eval:n {#2}
{ \color_group_begin: #3 \color_group_end: }
}
\cs_generate_variant:Nn \hbox_set_to_wd:Nnn { c }
@@ -1278,7 +1300,7 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
{
- \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
+ \tex_setbox:D #1 \tex_hbox:D to \@@_dim_eval:n {#2}
\c_group_begin_token
\color_group_begin:
}
@@ -1285,7 +1307,7 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
\cs_new_protected:Npn \hbox_gset_to_wd:Nnw #1#2
{
- \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
+ \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \@@_dim_eval:n {#2}
\c_group_begin_token
\color_group_begin:
}
@@ -1302,11 +1324,14 @@
% \begin{macrocode}
\cs_new_protected:Npn \hbox_to_wd:nn #1#2
{
- \tex_hbox:D to \__dim_eval:n {#1}
+ \tex_hbox:D to \@@_dim_eval:n {#1}
{ \color_group_begin: #2 \color_group_end: }
}
\cs_new_protected:Npn \hbox_to_zero:n #1
- { \tex_hbox:D to \c_zero_dim { \color_group_begin: #1 \color_group_end: } }
+ {
+ \tex_hbox:D to \c_zero_dim
+ { \color_group_begin: #1 \color_group_end: }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1362,7 +1387,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \vbox_to_ht:nn #1#2
{
- \tex_vbox:D to \__dim_eval:n {#1}
+ \tex_vbox:D to \@@_dim_eval:n {#1}
{ \color_group_begin: #2 \color_group_end: }
}
\cs_new_protected:Npn \vbox_to_zero:n #1
@@ -1429,13 +1454,13 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3
{
- \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
+ \tex_setbox:D #1 \tex_vbox:D to \@@_dim_eval:n {#2}
{ \color_group_begin: #3 \color_group_end: }
}
\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
\cs_new_protected:Npn \vbox_gset_to_ht:Nnn #1#2#3
{
- \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
+ \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \@@_dim_eval:n {#2}
{ \color_group_begin: #3 \color_group_end: }
}
\cs_generate_variant:Nn \vbox_set_to_ht:Nnn { c }
@@ -1485,7 +1510,7 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
{
- \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
+ \tex_setbox:D #1 \tex_vbox:D to \@@_dim_eval:n {#2}
\c_group_begin_token
\color_group_begin:
}
@@ -1492,7 +1517,7 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
\cs_new_protected:Npn \vbox_gset_to_ht:Nnw #1#2
{
- \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
+ \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \@@_dim_eval:n {#2}
\c_group_begin_token
\color_group_begin:
}
@@ -1521,7 +1546,7 @@
% \begin{macrocode}
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3
- { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:n {#3} }
+ { \tex_setbox:D #1 \tex_vsplit:D #2 to \@@_dim_eval:n {#3} }
% \end{macrocode}
% \end{macro}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -136,6 +136,19 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[EXP, added = 2018-04-17]{\use_x:n}
+% \begin{syntax}
+% \cs{use_x:n} \Arg{token list}
+% \end{syntax}
+% Fully expands the \meta{token list} in an \texttt{x}-type manner,
+% \emph{but} the function remains fully expandable, and parameter
+% character (usually~|#|) need not be doubled.
+% \begin{texnote}
+% \cs{use_x:n} the a wrapper around the primitive \tn{expanded}:
+% it requires two expansions to complete its action.
+% \end{texnote}
+% \end{function}
+%
% \section{Additions to \pkg{l3box}}
%
% \subsection{Viewing part of a box}
@@ -201,8 +214,8 @@
% \cs{clist_rand_item:n} \Arg{comma list}
% \end{syntax}
% Selects a pseudo-random item of the \meta{comma list}. If the
-% \meta{comma list} has no item, the result is empty. This is only
-% available in \pdfTeX{} and \LuaTeX{}.
+% \meta{comma list} has no item, the result is empty. This not
+% yet available in \XeTeX{}.
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
@@ -255,6 +268,19 @@
% should be defined.
% \end{function}
%
+% \begin{function}[added = 2018-04-04]{\exp_args_generate:n}
+% \begin{syntax}
+% \cs{exp_args_generate:n} \Arg{variant argument specifiers}
+% \end{syntax}
+% Defines \cs[no-index]{exp_args:N\meta{variant}} functions for each
+% \meta{variant} given in the comma list \Arg{variant argument
+% specifiers}. Each \meta{variant} should consist of the letters |N|,
+% |c|, |n|, |V|, |v|, |o|, |f|, |x|, |p| and the resulting function is
+% protected if the letter |x| appears in the \meta{variant}. This is
+% only useful for cases where \cs{cs_generate_variant:Nn} is not
+% applicable.
+% \end{function}
+%
% \section{Additions to \pkg{l3file}}
%
% \begin{function}[added = 2017-07-11]{\file_get_mdfive_hash:nN}
@@ -335,15 +361,14 @@
% \end{texnote}
% \end{function}
%
-% \section{Additions to \pkg{l3int}}
+% \section{Additions to \pkg{l3flag}}
%
-% \begin{function}[EXP, added = 2016-12-06]{\int_rand:nn}
+% \begin{function}[EXP, added = 2018-04-02]{\flag_raise_if_clear:n}
% \begin{syntax}
-% \cs{int_rand:nn} \Arg{intexpr_1} \Arg{intexpr_2}
+% \cs{flag_raise_if_clear:n} \Arg{flag name}
% \end{syntax}
-% Evaluates the two \meta{integer expressions} and produces a
-% pseudo-random number between the two (with bounds included). This
-% is only available in \pdfTeX{} and \LuaTeX{}.
+% Ensures the \meta{flag} is raised by making its height at least~$1$,
+% locally.
% \end{function}
%
% \section{Additions to \pkg{l3msg}}
@@ -478,10 +503,9 @@
% \begin{syntax}
% \cs{prop_rand_key_value:N} \meta{prop~var}
% \end{syntax}
-% Selects a pseudo-random key--value pair in the \meta{property list}
-% and returns \Arg{key}\Arg{value}. If the \meta{property list} is
-% empty the result is empty. This is only available in \pdfTeX{} and
-% \LuaTeX{}.
+% Selects a pseudo-random key--value pair from the \meta{property list}
+% and returns \Arg{key} and \Arg{value}. If the \meta{property list} is
+% empty the result is empty. This is not yet available in \XeTeX{}.
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{value}
@@ -578,8 +602,8 @@
% \cs{seq_rand_item:N} \meta{seq~var}
% \end{syntax}
% Selects a pseudo-random item of the \meta{sequence}. If the
-% \meta{sequence} is empty the result is empty. This is only
-% available in \pdfTeX{} and \LuaTeX{}.
+% \meta{sequence} is empty the result is empty. This is not yet
+% available in \XeTeX{}.
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
@@ -598,6 +622,61 @@
% items in the \meta{comma list}.
% \end{function}
%
+% \begin{function}[added = 2018-04-06]
+% {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
+% \begin{syntax}
+% \cs{seq_set_from_function:NnN} \meta{seq~var} \Arg{loop~code} \meta{function}
+% \end{syntax}
+% Sets the \meta{seq~var} equal to a sequence whose items are obtained
+% by \texttt{x}-expanding \meta{loop~code} \meta{function}. This
+% expansion must result in successive calls to the \meta{function}
+% with no nonexpandable tokens in between. More precisely the
+% \meta{function} is replaced by a wrapper function that inserts the
+% appropriate separators between items in the sequence. The
+% \meta{loop~code} must be expandable; it can be for example
+% \cs{tl_map_function:NN} \meta{tl~var} or \cs{clist_map_function:nN}
+% \Arg{clist} or \cs{int_step_function:nnnN} \Arg{initial value}
+% \Arg{step} \Arg{final value}.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-06]
+% {\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
+% \begin{syntax}
+% \cs{seq_set_from_inline_x:Nnn} \meta{seq~var} \Arg{loop~code} \Arg{inline~code}
+% \end{syntax}
+% Sets the \meta{seq~var} equal to a sequence whose items are obtained
+% by \texttt{x}-expanding \meta{loop~code} applied to a
+% \meta{function} derived from the \meta{inline~code}. A
+% \meta{function} is defined, that takes one argument,
+% \texttt{x}-expands the \meta{inline~code} with that argument
+% as~|#1|, then adds appropriate separators to turn the result into an
+% item of the sequence. The \texttt{x}-expansion of \meta{loop~code}
+% \meta{function} must result in successive calls to the
+% \meta{function} with no nonexpandable tokens in between. The
+% \meta{loop~code} must be expandable; it can be for example
+% \cs{tl_map_function:NN} \meta{tl~var} or \cs{clist_map_function:nN}
+% \Arg{clist} or \cs{int_step_function:nnnN} \Arg{initial value}
+% \Arg{step} \Arg{final value}, but not the analogous \enquote{inline}
+% mappings.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-29]{\seq_shuffle:N, \seq_gshuffle:N}
+% \begin{syntax}
+% \cs{seq_shuffle:N} \meta{seq~var}
+% \end{syntax}
+% Sets the \meta{seq~var} to the result of placing the items of the
+% \meta{seq~var} in a random order. Each item is (roughly) as likely
+% to end up in any given position.
+% \begin{texnote}
+% For sequences with more than $13$ items or so, only a small
+% proportion of all possible permutations can be reached, because
+% the random seed \cs{sys_rand_seed:} only has $28$-bits. The use
+% of \tn{toks} internally means that sequences with more than
+% $32767$ or $65535$ items (depending on the engine) cannot be
+% shuffled.
+% \end{texnote}
+% \end{function}
+%
% \section{Additions to \pkg{l3skip}}
%
% \begin{function}{\skip_split_finite_else_action:nnNN}
@@ -622,7 +701,7 @@
% \cs{sys_if_rand_exist:TF} \Arg{true code} \Arg{false code}
% \end{syntax}
% Tests if the engine has a pseudo-random number generator. Currently
-% this is the case in \pdfTeX{} and \LuaTeX{}.
+% this is the case in \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{}.
% \end{function}
%
% \begin{function}[added = 2017-05-27, EXP]{\sys_rand_seed:}
@@ -638,13 +717,18 @@
% \begin{syntax}
% \cs{sys_gset_rand_seed:n} \Arg{intexpr}
% \end{syntax}
-% Sets the seed for the engine's pseudo-random number generator to the
-% \meta{integer expression}. The assignment is global. This random
-% seed affects all \cs[no-index]{\ldots{}_rand} functions (such as
+% Globally sets the seed for the engine's pseudo-random number
+% generator to the \meta{integer expression}. This random seed
+% affects all \cs[no-index]{\ldots{}_rand} functions (such as
% \cs{int_rand:nn} or \cs{clist_rand_item:n}) as well as other
-% packages relying on the engine's random number generator. Currently
-% only the absolute value of the seed is used. In engines without
-% random number support this produces an error.
+% packages relying on the engine's random number generator. In
+% engines without random number support this produces an error.
+% \begin{texnote}
+% While a $32$-bit (signed) integer can be given as a seed, only the
+% absolute value is used and any number beyond $2^{28}$ is divided
+% by an appropriate power of~$2$. We recommend using an integer in
+% $[0,2^{28}-1]$.
+% \end{texnote}
% \end{function}
%
% \begin{variable}[added = 2017-05-27]{\c_sys_shell_escape_int}
@@ -974,8 +1058,8 @@
% \cs{tl_rand_item:n} \Arg{token list}
% \end{syntax}
% Selects a pseudo-random item of the \meta{token list}. If the
-% \meta{token list} is blank, the result is empty. This is only
-% available in \pdfTeX{} and \LuaTeX{}.
+% \meta{token list} is blank, the result is empty. This is not yet
+% available in \XeTeX{}.
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
@@ -984,7 +1068,8 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[EXP, added = 2017-02-17, updated = 2017-07-15]{\tl_range:nnn}
+% \begin{function}[EXP, added = 2017-02-17, updated = 2017-07-15]
+% {\tl_range:Nnn, \tl_range:nnn}
% \begin{syntax}
% \cs{tl_range:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
% \cs{tl_range:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
@@ -1067,6 +1152,73 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
+% \begin{syntax}
+% \cs{tl_build_begin:N} \meta{tl~var}
+% \end{syntax}
+% Clears the \meta{tl~var} and sets it up to support other
+% \cs[no-index]{tl_build_\ldots{}} functions, which allow accumulating
+% large numbers of tokens piece by piece much more efficiently than
+% standard \pkg{l3tl} functions. Until \cs{tl_build_end:N}
+% \meta{tl~var} is called, applying any function from \pkg{l3tl} other
+% than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
+% results. The |begin| and |gbegin| functions must be used for local
+% and global \meta{tl~var} respectively.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_clear:N, \tl_build_gclear:N}
+% \begin{syntax}
+% \cs{tl_build_clear:N} \meta{tl~var}
+% \end{syntax}
+% Clears the \meta{tl~var} and sets it up to support other
+% \cs[no-index]{tl_build_\ldots{}} functions. The |clear| and
+% |gclear| functions must be used for local and global \meta{tl~var}
+% respectively.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]
+% {
+% \tl_build_put_left:Nn, \tl_build_put_left:Nx,
+% \tl_build_gput_left:Nn, \tl_build_gput_left:Nx,
+% \tl_build_put_right:Nn, \tl_build_put_right:Nx,
+% \tl_build_gput_right:Nn, \tl_build_gput_right:Nx,
+% }
+% \begin{syntax}
+% \cs{tl_build_put_left:Nn} \meta{tl~var} \Arg{tokens}
+% \cs{tl_build_put_right:Nn} \meta{tl~var} \Arg{tokens}
+% \end{syntax}
+% Adds \meta{tokens} to the left or right side of the current contents
+% of \meta{tl~var}. The \meta{tl~var} must have been set up with
+% \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}. The |put| and
+% |gput| functions must be used for local and global \meta{tl~var}
+% respectively. The |right| functions are about twice faster than the
+% |left| functions.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_get:NN}
+% \begin{syntax}
+% \cs{tl_build_get:N} \meta{tl~var_1} \meta{tl~var_2}
+% \end{syntax}
+% Stores the contents of the \meta{tl~var_1} in the \meta{tl~var_2}.
+% The \meta{tl~var_1} must have been set up with \cs{tl_build_begin:N}
+% or \cs{tl_build_gbegin:N}. The \meta{tl~var_2} is a
+% \enquote{normal} token list variable, assigned locally using
+% \cs{tl_set:Nn}.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_end:N, \tl_build_gend:N}
+% \begin{syntax}
+% \cs{tl_build_end:N} \meta{tl~var}
+% \end{syntax}
+% Gets the contents of \meta{tl~var} and stores that into the
+% \meta{tl~var} using \cs{tl_set:Nn}. The \meta{tl~var} must have
+% been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
+% The |end| and |gend| functions must be used for local and global
+% \meta{tl~var} respectively. These functions completely remove the
+% setup code that enabled \meta{tl~var} to be used for other
+% \cs[no-index]{tl_build_\ldots{}} functions.
+% \end{function}
+%
% \section{Additions to \pkg{l3token}}
%
% \begin{variable}[added = 2017-08-07]{\c_catcode_active_space_tl}
@@ -1074,6 +1226,31 @@
% (\enquote{active}), and character code $32$ (space).
% \end{variable}
%
+% \begin{function}[added = 2018-04-06, EXP]
+% {
+% \char_lower_case:N, \char_upper_case:N,
+% \char_mixed_case:N, \char_fold_case:N
+% }
+% \begin{syntax}
+% \cs{char_lower_case:N} \meta{char}
+% \end{syntax}
+% Converts the \meta{char} to the equivalent case-changed character
+% as detailed by the function name (see \cs{str_fold_case:n}
+% and \cs{tl_mixed_case:n} for details of these terms). The case mapping
+% is carried out with no context-dependence (\emph{cf.}~\cs{tl_upper_case:n},
+% \emph{etc.})
+% \end{function}
+%
+% \begin{function}[added = 2018-04-02]{\char_codepoint_to_bytes:n}
+% \begin{syntax}
+% \cs{char_codepoint_to_bytes:n} \Arg{codepoint}
+% \end{syntax}
+% Converts the (Unicode) \meta{codepoint} to UTF-8 bytes. The expansion
+% of this function comprises a leading integer (|1|--|4|) followed by the
+% appropriate number of brace groups, each of which contains one byte of
+% the UTF-8 sequence for the codepoint.
+% \end{function}
+%
% \begin{function}[TF, updated = 2012-12-20]{\peek_N_type:}
% \begin{syntax}
% \cs{peek_N_type:TF} \Arg{true code} \Arg{false code}
@@ -1159,9 +1336,9 @@
{
\hbox_set:Nn \l_@@_internal_box
{
- \tex_kern:D - \__dim_eval:n {#2}
+ \tex_kern:D - \@@_dim_eval:n {#2}
\box_use:N #1
- \tex_kern:D - \__dim_eval:n {#4}
+ \tex_kern:D - \@@_dim_eval:n {#4}
}
% \end{macrocode}
% For the height and depth, there is a need to watch the baseline is
@@ -1225,9 +1402,9 @@
{
\hbox_set:Nn \l_@@_internal_box
{
- \tex_kern:D - \__dim_eval:n {#2}
+ \tex_kern:D - \@@_dim_eval:n {#2}
\box_use:N #1
- \tex_kern:D \__dim_eval:n { #4 - \box_wd:N #1 }
+ \tex_kern:D \@@_dim_eval:n { #4 - \box_wd:N #1 }
}
\dim_compare:nNnTF {#3} < \c_zero_dim
{
@@ -1236,7 +1413,7 @@
\box_move_down:nn \c_zero_dim
{ \box_use:N \l_@@_internal_box }
}
- \box_set_dp:Nn \l_@@_internal_box { - \__dim_eval:n {#3} }
+ \box_set_dp:Nn \l_@@_internal_box { - \@@_dim_eval:n {#3} }
}
{
\hbox_set:Nn \l_@@_internal_box
@@ -1260,7 +1437,7 @@
{
\hbox_set:Nn \l_@@_internal_box
{
- \box_move_up:nn { - \__dim_eval:n {#5} }
+ \box_move_up:nn { - \@@_dim_eval:n {#5} }
{ \box_use:N \l_@@_internal_box }
}
\box_set_ht:Nn \l_@@_internal_box \c_zero_dim
@@ -1369,9 +1546,9 @@
% The corners and poles of the coffin can now be rotated around the
% origin. This is best achieved using mapping functions.
% \begin{macrocode}
- \prop_map_inline:cn { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_corners_ \@@_to_value:N #1 _prop }
{ \@@_rotate_corner:Nnnn #1 {##1} ##2 }
- \prop_map_inline:cn { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_poles_ \@@_to_value:N #1 _prop }
{ \@@_rotate_pole:Nnnnnn #1 {##1} ##2 }
% \end{macrocode}
% The bounding box of the coffin needs to be rotated, and to do this
@@ -1400,8 +1577,9 @@
\hbox_set:Nn \l_@@_internal_box
{
\tex_kern:D
- \__dim_eval:n
+ \dim_eval:n
{ \l_@@_bounding_shift_dim - \l_@@_left_corner_dim }
+ \exp_stop_f:
\box_move_down:nn { \l_@@_bottom_corner_dim }
{ \box_use:N #1 }
}
@@ -1423,9 +1601,9 @@
% The final task is to move the poles and corners such that they are
% back in alignment with the box reference point.
% \begin{macrocode}
- \prop_map_inline:cn { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_corners_ \@@_to_value:N #1 _prop }
{ \@@_shift_corner:Nnnn #1 {##1} ##2 }
- \prop_map_inline:cn { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_poles_ \@@_to_value:N #1 _prop }
{ \@@_shift_pole:Nnnnnn #1 {##1} ##2 }
}
\cs_generate_variant:Nn \coffin_rotate:Nn { c }
@@ -1442,12 +1620,18 @@
\prop_put:Nnx \l_@@_bounding_prop { tl }
{ { 0 pt } { \dim_eval:n { \box_ht:N #1 } } }
\prop_put:Nnx \l_@@_bounding_prop { tr }
- { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { \box_ht:N #1 } } }
+ {
+ { \dim_eval:n { \box_wd:N #1 } }
+ { \dim_eval:n { \box_ht:N #1 } }
+ }
\dim_set:Nn \l_@@_internal_dim { -\box_dp:N #1 }
\prop_put:Nnx \l_@@_bounding_prop { bl }
{ { 0 pt } { \dim_use:N \l_@@_internal_dim } }
\prop_put:Nnx \l_@@_bounding_prop { br }
- { { \dim_eval:n { \box_wd:N #1 } } { \dim_use:N \l_@@_internal_dim } }
+ {
+ { \dim_eval:n { \box_wd:N #1 } }
+ { \dim_use:N \l_@@_internal_dim }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -1468,7 +1652,7 @@
\cs_new_protected:Npn \@@_rotate_corner:Nnnn #1#2#3#4
{
\@@_rotate_vector:nnNN {#3} {#4} \l_@@_x_dim \l_@@_y_dim
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } {#2}
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop } {#2}
{ { \dim_use:N \l_@@_x_dim } { \dim_use:N \l_@@_y_dim } }
}
% \end{macrocode}
@@ -1539,7 +1723,7 @@
\dim_set:Nn \l_@@_right_corner_dim { -\c_max_dim }
\dim_set:Nn \l_@@_bottom_corner_dim { \c_max_dim }
\dim_set:Nn \l_@@_left_corner_dim { \c_max_dim }
- \prop_map_inline:cn { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_corners_ \@@_to_value:N #1 _prop }
{ \@@_find_corner_maxima_aux:nn ##2 }
}
\cs_new_protected:Npn \@@_find_corner_maxima_aux:nn #1#2
@@ -1586,7 +1770,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_shift_corner:Nnnn #1#2#3#4
{
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _ prop } {#2}
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _ prop } {#2}
{
{ \dim_eval:n { #3 - \l_@@_left_corner_dim } }
{ \dim_eval:n { #4 - \l_@@_bottom_corner_dim } }
@@ -1594,7 +1778,7 @@
}
\cs_new_protected:Npn \@@_shift_pole:Nnnnnn #1#2#3#4#5#6
{
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _ prop } {#2}
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _ prop } {#2}
{
{ \dim_eval:n { #3 - \l_@@_left_corner_dim } }
{ \dim_eval:n { #4 - \l_@@_bottom_corner_dim } }
@@ -1656,9 +1840,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_resize_common:Nnn #1#2#3
{
- \prop_map_inline:cn { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_corners_ \@@_to_value:N #1 _prop }
{ \@@_scale_corner:Nnnn #1 {##1} ##2 }
- \prop_map_inline:cn { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_poles_ \@@_to_value:N #1 _prop }
{ \@@_scale_pole:Nnnnnn #1 {##1} ##2 }
% \end{macrocode}
% Negative $x$-scaling values place the poles in the wrong
@@ -1666,9 +1850,11 @@
% \begin{macrocode}
\fp_compare:nNnT \l_@@_scale_x_fp < \c_zero_fp
{
- \prop_map_inline:cn { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn
+ { l_@@_corners_ \@@_to_value:N #1 _prop }
{ \@@_x_shift_corner:Nnnn #1 {##1} ##2 }
- \prop_map_inline:cn { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn
+ { l_@@_poles_ \@@_to_value:N #1 _prop }
{ \@@_x_shift_pole:Nnnnnn #1 {##1} ##2 }
}
}
@@ -1723,7 +1909,7 @@
\cs_new_protected:Npn \@@_scale_corner:Nnnn #1#2#3#4
{
\@@_scale_vector:nnNN {#3} {#4} \l_@@_x_dim \l_@@_y_dim
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } {#2}
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop } {#2}
{ { \dim_use:N \l_@@_x_dim } { \dim_use:N \l_@@_y_dim } }
}
\cs_new_protected:Npn \@@_scale_pole:Nnnnnn #1#2#3#4#5#6
@@ -1746,7 +1932,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_x_shift_corner:Nnnn #1#2#3#4
{
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } {#2}
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop } {#2}
{
{ \dim_eval:n { #3 + \box_wd:N #1 } } {#4}
}
@@ -1753,7 +1939,7 @@
}
\cs_new_protected:Npn \@@_x_shift_pole:Nnnnnn #1#2#3#4#5#6
{
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } {#2}
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _prop } {#2}
{
{ \dim_eval:n { #3 + \box_wd:N #1 } } {#4}
{#5} {#6}
@@ -1795,7 +1981,7 @@
{ \l_@@_full_name_str }
}
}
-\cs_if_exist:NTF \luatex_directlua:D
+\sys_if_engine_luatex:TF
{
\cs_set_protected:Npn \@@_get_details:nnN #1#2#3
{
@@ -1820,7 +2006,7 @@
{ \l_@@_full_name_str }
}
}
- \cs_if_exist:NT \xetex_XeTeXversion:D
+ \sys_if_engine_xetex:T
{
\cs_set_protected:Npn \@@_get_details:nnN #1#2#3
{
@@ -1869,100 +2055,29 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Additions to \pkg{l3int}}
+% \subsection{Additions to \pkg{l3flag}}
%
% \begin{macrocode}
-%<@@=int>
+%<@@=flag>
% \end{macrocode}
%
-% \begin{macro}[EXP]{\int_rand:nn}
-% \begin{macro}[EXP]
-% {
-% \@@_rand:ww, \@@_rand_narrow:n,
-% \@@_rand_narrow:nnn, \@@_rand_narrow:nnnn
-% }
-% Evaluate the argument and filter out the case where the lower
-% bound~|#1| is more than the upper bound~|#2|. Then determine
-% whether the range is narrower than \cs{c__fp_rand_size_int}; |#2-#1|
-% may overflow for very large positive~|#2| and negative~|#1|. If the
-% range is wide, use slower code from \pkg{l3fp}. If the range is
-% narrow, call \cs{@@_rand_narrow:nn} \Arg{choices} |{#1}| where
-% \meta{choices} is the number of possible outcomes. Then
-% \cs{@@_rand_narrow:nnnn} receives a random number reduced modulo
-% \meta{choices}, the random number itself, \meta{choices} and |#1|.
-% To avoid bias, throw away the random number if it lies in the last,
-% incomplete, interval of size \meta{choices} in
-% $[0,\cs{c__fp_rand_size_int}-1]$, and try again.
+% \begin{macro}[EXP]{\flag_raise_if_clear:n}
+% It might be faster to just call the \enquote{trap} function in all
+% cases but conceptually the function name suggests we should only run
+% it if the flag is zero in case the \enquote{trap} made customizable
+% in the future.
% \begin{macrocode}
-\cs_if_exist:NTF \pdftex_uniformdeviate:D
+\__kernel_patch:nnNNpn { \@@_chk_exist:n {#1} } { }
+\cs_new:Npn \flag_raise_if_clear:n #1
{
- \__kernel_patch_args:nNNpn
- {
- { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_rand:nn }
- { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_rand:nn }
- }
- \cs_new:Npn \int_rand:nn #1#2
- {
- \exp_after:wN \@@_rand:ww
- \@@_value:w \@@_eval:w #1 \exp_after:wN ;
- \@@_value:w \@@_eval:w #2 ;
- }
- \cs_new:Npn \@@_rand:ww #1; #2;
- {
- \int_compare:nNnTF {#1} > {#2}
- {
- \__kernel_msg_expandable_error:nnnn
- { kernel } { backward-range } {#1} {#2}
- \@@_rand:ww #2; #1;
- }
- {
- \int_compare:nNnTF {#1} > 0
- { \int_compare:nNnTF { #2 - #1 } < \c__fp_rand_size_int }
- { \int_compare:nNnTF {#2} < { #1 + \c__fp_rand_size_int } }
- {
- \exp_args:Nf \@@_rand_narrow:nn
- { \int_eval:n { #2 - #1 + 1 } } {#1}
- }
- { \fp_to_int:n { randint(#1,#2) } }
- }
- }
- \cs_new:Npn \@@_rand_narrow:nn
- {
- \exp_args:No \@@_rand_narrow:nnn
- { \pdftex_uniformdeviate:D \c__fp_rand_size_int }
- }
- \cs_new:Npn \@@_rand_narrow:nnn #1#2
- {
- \exp_args:Nf \@@_rand_narrow:nnnn
- { \int_mod:nn {#1} {#2} } {#1} {#2}
- }
- \cs_new:Npn \@@_rand_narrow:nnnn #1#2#3#4
- {
- \int_compare:nNnTF { #2 - #1 + #3 } > \c__fp_rand_size_int
- { \@@_rand_narrow:nn {#3} {#4} }
- { \int_eval:n { #4 + #1 } }
- }
+ \if_cs_exist:w flag~#1~0 \cs_end:
+ \else:
+ \cs:w flag~#1 \cs_end: 0 ;
+ \fi:
}
- {
- \cs_new:Npn \int_rand:nn #1#2
- {
- \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
- \int_eval:n {#1}
- }
- }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% The following must be added to \pkg{l3msg}.
-% \begin{macrocode}
-\cs_if_exist:NT \pdftex_uniformdeviate:D
- {
- \__kernel_msg_new:nnn { kernel } { backward-range }
- { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. }
- }
-% \end{macrocode}
-%
% \subsection{Additions to \pkg{l3msg}}
%
% \begin{macrocode}
@@ -2075,7 +2190,7 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
\cs_new_protected:Npn \bool_const:Nn #1#2
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2}
}
\cs_generate_variant:Nn \bool_const:Nn { c }
@@ -2111,25 +2226,23 @@
%
% \begin{macro}[rEXP]{\prop_map_tokens:Nn, \prop_map_tokens:cn}
% \begin{macro}{\@@_map_tokens:nwwn}
-% The mapping is very similar to \cs{prop_map_function:NN}. It grabs
-% one key--value pair at a time, and stops when reaching the marker
-% key \cs{q_recursion_tail}, which cannot appear in normal keys since
-% those are strings. The odd construction |\use:n {#1}| allows |#1|
-% to contain any token without interfering with \cs{prop_map_break:}.
-% Argument |#2| of \cs{@@_map_tokens:nwwn} is \cs{s_@@} the first
-% time, and is otherwise empty.
+% The mapping is very similar to \cs{prop_map_function:NN}. The
+% \cs{use_i:nn} removes the leading \cs{s_@@}. The odd construction
+% |\use:n {#1}| allows |#1| to contain any token without interfering
+% with \cs{prop_map_break:}. The loop stops when the argument
+% delimited by \cs{@@_pair:wn} is \cs{prg_break:} instead of being
+% empty.
% \begin{macrocode}
\cs_new:Npn \prop_map_tokens:Nn #1#2
{
- \exp_last_unbraced:Nno \@@_map_tokens:nwwn {#2} #1
- \@@_pair:wn \q_recursion_tail \s_@@ { }
- \__prg_break_point:Nn \prop_map_break: { }
+ \exp_last_unbraced:Nno
+ \use_i:nn { \@@_map_tokens:nwwn {#2} } #1
+ \prg_break: \@@_pair:wn \s_@@ { } \prg_break_point:
+ \prg_break_point:Nn \prop_map_break: { }
}
\cs_new:Npn \@@_map_tokens:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
{
- \if_meaning:w \q_recursion_tail #3
- \exp_after:wN \prop_map_break:
- \fi:
+ #2
\use:n {#1} {#3} {#4}
\@@_map_tokens:nwwn {#1}
}
@@ -2140,33 +2253,30 @@
%
% \begin{macro}[EXP]
% {\prop_rand_key_value:N, \prop_rand_key_value:c}
-% \begin{macro}[EXP]{\@@_rand:NN, \@@_rand_item:Nw}
+% \begin{macro}[EXP]{\@@_rand_item:w}
% Contrarily to |clist|, |seq| and |tl|, there is no function to get
% an item of a |prop| given an integer between $1$ and the number of
% items, so we write the appropriate code. There is no bounds
-% checking because \cs{int_rand:nn} is always within bounds. At the
-% end, leave either the key |#3| or the value |#4| in the input
-% stream.
+% checking because \cs{int_rand:nn} is always within bounds. The
+% initial \cs{int_value:w} is stopped by the first \cs{s_@@} in~|#1|.
% \begin{macrocode}
-\cs_new:Npn \prop_rand_key_value:N { \@@_rand:NN \@@_rand:nNn }
-\cs_new:Npn \@@_rand:nNn #1#2#3 { \exp_not:n { {#1} {#3} } }
-\cs_new:Npn \@@_rand:NN #1#2
+\cs_new:Npn \prop_rand_key_value:N #1
{
- \prop_if_empty:NTF #2 { }
+ \prop_if_empty:NF #1
{
- \exp_after:wN \@@_rand_item:Nw \exp_after:wN #1
- \__int_value:w \int_rand:nn { 1 } { \prop_count:N #2 } #2
- \q_stop
+ \exp_after:wN \@@_rand_item:w
+ \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
+ #1 \q_stop
}
}
-\cs_new:Npn \@@_rand_item:Nw #1#2 \s_@@ \@@_pair:wn #3 \s_@@ #4
+\cs_generate_variant:Nn \prop_rand_key_value:N { c }
+\cs_new:Npn \@@_rand_item:w #1 \s_@@ \@@_pair:wn #2 \s_@@ #3
{
- \int_compare:nNnF {#2} > 1
- { \use_i_delimit_by_q_stop:nw { #1 {#3} \exp_not:n {#4} } }
- \exp_after:wN \@@_rand_item:Nw \exp_after:wN #1
- \__int_value:w \int_eval:n { #2 - 1 } \s_@@
+ \int_compare:nNnF {#1} > 1
+ { \use_i_delimit_by_q_stop:nw { \exp_not:n { {#2} {#3} } } }
+ \exp_after:wN \@@_rand_item:w
+ \int_value:w \int_eval:n { #1 - 1 } \s_@@
}
-\cs_generate_variant:Nn \prop_rand_key_value:N { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2188,7 +2298,7 @@
% \@@_mapthread_function:Nnnwnn
% }
% The idea is to first expand both sequences, adding the
-% usual |{ ? \__prg_break: } { }| to the end of each one. This is
+% usual |{ ? \prg_break: } { }| to the end of each one. This is
% most conveniently done in two steps using an auxiliary function.
% The mapping then throws away the first tokens of |#2| and |#5|,
% which for items in both sequences are \cs{s_@@}
@@ -2203,13 +2313,13 @@
\cs_new:Npn \@@_mapthread_function:wNN \s_@@ #1 \q_stop #2#3
{
\exp_after:wN \@@_mapthread_function:wNw #2 \q_stop #3
- #1 { ? \__prg_break: } { }
- \__prg_break_point:
+ #1 { ? \prg_break: } { }
+ \prg_break_point:
}
\cs_new:Npn \@@_mapthread_function:wNw \s_@@ #1 \q_stop #2
{
\@@_mapthread_function:Nnnwnn #2
- #1 { ? \__prg_break: } { }
+ #1 { ? \prg_break: } { }
\q_stop
}
\cs_new:Npn \@@_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6
@@ -2227,7 +2337,7 @@
% \begin{macro}{\seq_set_filter:NNn, \seq_gset_filter:NNn}
% \begin{macro}{\@@_set_filter:NNNn}
% Similar to \cs{seq_map_inline:Nn}, without a
-% \cs{__prg_break_point:} because the user's code
+% \cs{prg_break_point:} because the user's code
% is performed within the evaluation of a boolean expression,
% and skipping out of that would break horribly.
% The \cs{@@_wrap_item:n} function inserts the relevant
@@ -2268,6 +2378,34 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
+% \begin{macro}{\@@_set_from_inline_x:NNnn}
+% Set \cs{@@_item:n} then map it using the loop code.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_from_inline_x:Nnn
+ { \@@_set_from_inline_x:NNnn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
+ { \@@_set_from_inline_x:NNnn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_from_inline_x:NNnn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
+ #1 #2 { \s_@@ #3 \@@_item:n }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
+% Reuse \cs{seq_set_from_inline_x:Nnn}.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3
+ { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
+\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3
+ { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\seq_rand_item:N, \seq_rand_item:c}
% Importantly, \cs{seq_item:Nn} only evaluates its argument once.
% \begin{macrocode}
@@ -2292,6 +2430,70 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\seq_shuffle:N, \seq_gshuffle:N, \@@_shuffle:NN, \@@_shuffle_item:n}
+% \begin{variable}{\g_@@_internal_seq, \l_@@_internal_a_int, \l_@@_internal_b_int}
+% We apply the Fisher–Yates shuffle, storing items in \tn{toks}
+% registers. We use the primitive \cs{pdftex_uniformdeviate:D} for
+% speed reasons. Its non-uniformity is of order its argument divided
+% by $2^{28}$, not too bad for small lists. For sequences with more
+% than $13$ elements there are more possible permutations than
+% possible seeds ($13!>2^{28}$) so the question of uniformity is
+% somewhat moot.
+% \begin{macrocode}
+\cs_if_exist:NTF \pdftex_uniformdeviate:D
+ {
+ \int_new:N \l_@@_internal_a_int
+ \int_new:N \l_@@_internal_b_int
+ \seq_new:N \g_@@_internal_seq
+ \cs_new_protected:Npn \seq_shuffle:N { \@@_shuffle:NN \seq_set_eq:NN }
+ \cs_new_protected:Npn \seq_gshuffle:N { \@@_shuffle:NN \seq_gset_eq:NN }
+ \cs_new_protected:Npn \@@_shuffle:NN #1#2
+ {
+ \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
+ {
+ \__kernel_msg_error:nnx { kernel } { shuffle-too-large }
+ { \token_to_str:N #2 }
+ }
+ {
+ \group_begin:
+ \cs_set_eq:NN \@@_item:n \@@_shuffle_item:n
+ \int_zero:N \l_@@_internal_a_int
+ #2
+ \seq_gset_from_inline_x:Nnn \g_@@_internal_seq
+ { \int_step_function:nN { \l_@@_internal_a_int } }
+ { \tex_the:D \tex_toks:D ##1 }
+ \group_end:
+ #1 #2 \g_@@_internal_seq
+ \seq_gclear:N \g_@@_internal_seq
+ }
+ }
+ \cs_new_protected:Npn \@@_shuffle_item:n
+ {
+ \int_incr:N \l_@@_internal_a_int
+ \int_set:Nn \l_@@_internal_b_int
+ { 1 + \pdftex_uniformdeviate:D \l_@@_internal_a_int }
+ \tex_toks:D \l_@@_internal_a_int
+ = \tex_toks:D \l_@@_internal_b_int
+ \tex_toks:D \l_@@_internal_b_int
+ }
+ \__kernel_msg_new:nnnn { kernel } { shuffle-too-large }
+ { The~sequence~#1~is~too~long~to~be~shuffled~by~TeX. }
+ {
+ TeX~has~ \int_eval:n { \c_max_register_int + 1 } ~
+ toks~registers:~this~only~allows~to~shuffle~up~to~
+ \int_use:N \c_max_register_int \ items.~
+ The~list~will~not~be~shuffled.
+ }
+ }
+ {
+ \cs_new_protected:Npn \seq_shuffle:N #1
+ { \__kernel_msg_error:nn { kernel } { fp-no-random } }
+ \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
+ }
+% \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
% \subsection{Additions to \pkg{l3skip}}
%
% \begin{macrocode}
@@ -2329,17 +2531,10 @@
% \end{macrocode}
%
% \begin{macro}[EXP, pTF]{\sys_if_rand_exist:}
-% Currently, randomness exists under \pdfTeX{} and \LuaTeX{}.
+% Currently, randomness exists under \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{}.
% \begin{macrocode}
-\cs_if_exist:NTF \pdftex_uniformdeviate:D
- {
- \prg_new_conditional:Npnn \sys_if_rand_exist: { p , T , F , TF }
- { \prg_return_true: }
- }
- {
- \prg_new_conditional:Npnn \sys_if_rand_exist: { p , T , F , TF }
- { \prg_return_false: }
- }
+\@@_const:nn { sys_if_rand_exist }
+ { \cs_if_exist_p:N \pdftex_uniformdeviate:D }
% \end{macrocode}
% \end{macro}
%
@@ -2356,7 +2551,7 @@
% The primitive always assigns the seed globally.
% \begin{macrocode}
\cs_new_protected:Npn \sys_gset_rand_seed:n #1
- { \pdftex_setrandomseed:D \__int_eval:n {#1} }
+ { \pdftex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
% \end{macrocode}
% \end{macro}
%
@@ -2368,9 +2563,7 @@
\sys_if_engine_luatex:TF
{
\luatex_directlua:D
- {
- tex.sprint((status.shell_escape~or~os.execute()) .. " ")
- }
+ { tex.sprint(status.shell_escape~or~os.execute()) }
}
{
\pdftex_shellescape:D
@@ -2379,55 +2572,21 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}[EXP, pTF]{\sys_if_shell:}
-% Performs a check for whether shell escape is enabled. This
-% returns true if either of restricted or unrestricted shell escape
-% is enabled.
+% \begin{macro}[EXP, pTF]{\sys_if_shell:, \sys_if_shell_unrestricted:, \sys_if_shell_restricted:}
+% Performs a check for whether shell escape is enabled. The first set
+% of functions returns true if either of restricted or unrestricted
+% shell escape is enabled, while the other two sets of functions
+% return true in only one of these two cases.
% \begin{macrocode}
-\prg_new_conditional:Nnn \sys_if_shell: { p , T , F , TF }
- {
- \if_int_compare:w \c_sys_shell_escape_int = 0 ~
- \prg_return_false:
- \else:
- \prg_return_true:
- \fi:
- }
+\@@_const:nn { sys_if_shell }
+ { \int_compare_p:nNn \c_sys_shell_escape_int > 0 }
+\@@_const:nn { sys_if_shell_unrestricted }
+ { \int_compare_p:nNn \c_sys_shell_escape_int = 1 }
+\@@_const:nn { sys_if_shell_restricted }
+ { \int_compare_p:nNn \c_sys_shell_escape_int = 2 }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP, pTF]{\sys_if_shell_unrestricted:}
-% Performs a check for whether \emph{unrestricted} shell escape is
-% enabled.
-% \begin{macrocode}
-\prg_new_conditional:Nnn \sys_if_shell_unrestricted: { p , T , F , TF }
- {
- \if_int_compare:w \c_sys_shell_escape_int = 1 ~
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP, pTF]{\sys_if_shell_restricted:}
-% Performs a check for whether \emph{restricted} shell escape is
-% enabled. This returns false if unrestricted shell escape is
-% enabled. Unrestricted shell escape is not considered a superset
-% of restricted shell escape in this case. To find whether any
-% shell escape is enabled use \cs{sys_if_shell:}.
-% \begin{macrocode}
-\prg_new_conditional:Nnn \sys_if_shell_restricted: { p , T , F , TF }
- {
- \if_int_compare:w \c_sys_shell_escape_int = 2 ~
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{variable}{\c_@@_shell_stream_int}
% This is not needed for \LuaTeX{}: shell escape there isn't done using
% a \TeX{} interface
@@ -2444,19 +2603,13 @@
{
\cs_new_protected:Npn \sys_shell_now:n #1
{
- \luatex_directlua:D
- {
- os.execute("
- \luatex_luaescapestring:D { \etex_detokenize:D {#1} }
- ")
- }
+ \lua_now_x:n
+ { os.execute(" \lua_escape_x:n { \tl_to_str:n {#1} } ") }
}
}
{
\cs_new_protected:Npn \sys_shell_now:n #1
- {
- \iow_now:Nn \c_@@_shell_stream_int { #1 }
- }
+ { \iow_now:Nn \c_@@_shell_stream_int {#1} }
}
\cs_generate_variant:Nn \sys_shell_now:n { x }
% \end{macrocode}
@@ -2469,19 +2622,13 @@
{
\cs_new_protected:Npn \sys_shell_shipout:n #1
{
- \luatex_latelua:D
- {
- os.execute("
- \luatex_luaescapestring:D { \etex_detokenize:D {#1} }
- ")
- }
+ \lua_shipout_x:n
+ { os.execute(" \lua_escape_x:n { \tl_to_str:n {#1} } ") }
}
}
{
\cs_new_protected:Npn \sys_shell_shipout:n #1
- {
- \iow_shipout:Nn \c_@@_shell_stream_int { #1 }
- }
+ { \iow_shipout:Nn \c_@@_shell_stream_int {#1} }
}
\cs_generate_variant:Nn \sys_shell_shipout:n { x }
% \end{macrocode}
@@ -2521,7 +2668,7 @@
% \begin{macrocode}
\cs_new:Npn \tl_reverse_tokens:n #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{
\exp:w
\@@_act:NNNnn
@@ -2605,9 +2752,9 @@
\cs_generate_variant:Nn \tl_gset_from_file:Nnn { c }
\cs_new_protected:Npn \@@_set_from_file:NNnn #1#2#3#4
{
- \file_get_full_name:nN {#4} \l__file_full_name_str
- \str_if_empty:NTF \l__file_full_name_str
- { \__file_missing:n {#4} }
+ \file_get_full_name:nN {#4} \l_@@_file_name_str
+ \str_if_empty:NTF \l_@@_file_name_str
+ { \__kernel_file_missing:n {#4} }
{
\group_begin:
\exp_args:No \etex_everyeof:D
@@ -2615,7 +2762,7 @@
#3 \scan_stop:
\exp_after:wN \@@_from_file_do:w
\exp_after:wN \prg_do_nothing:
- \tex_input:D \l__file_full_name_str \scan_stop:
+ \tex_input:D \l_@@_file_name_str \scan_stop:
\exp_args:NNNo \group_end:
#1 #2 \l_@@_internal_a_tl
}
@@ -2649,15 +2796,15 @@
\cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }
\cs_new_protected:Npn \@@_set_from_file_x:NNnn #1#2#3#4
{
- \file_get_full_name:nN {#4} \l__file_full_name_str
- \str_if_empty:NTF \l__file_full_name_str
- { \__file_missing:n {#4} }
+ \file_get_full_name:nN {#4} \l_@@_file_name_str
+ \str_if_empty:NTF \l_@@_file_name_str
+ { \__kernel_file_missing:n {#4} }
{
\group_begin:
\etex_everyeof:D { \exp_not:N }
#3 \scan_stop:
\tl_set:Nx \l_@@_internal_a_tl
- { \tex_input:D \l__file_full_name_str \c_space_token }
+ { \tex_input:D \l_@@_file_name_str \c_space_token }
\exp_args:NNNo \group_end:
#1 #2 \l_@@_internal_a_tl
}
@@ -2665,6 +2812,11 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \begin{variable}{\l_@@_file_name_str}
+% \begin{macrocode}
+\str_new:N \l_@@_file_name_str
+% \end{macrocode}
+% \end{variable}
%
% \subsubsection{Unicode case changing}
%
@@ -2673,6 +2825,119 @@
% appropriate data extracted from the Unicode documentation (either manually
% or automatically).
%
+% First, some code which \enquote{belongs} in \pkg{l3tokens} but has to come
+% here.
+% \begin{macrocode}
+%<@@=char>
+% \end{macrocode}
+%
+% \begin{macro}
+% {
+% \char_lower_case:N, \char_upper_case:N,
+% \char_mixed_case:N, \char_fold_case:N
+% }
+% \begin{macro}{\@@_change_case:nNN}
+% \begin{macro}{\@@_change_case:nN}
+% Expandable character generation is done using a two-part approach.
+% First, see if the current character has a special mapping for the current
+% transformation. If it does, insert that. Otherwise, use the \TeX{} data
+% to look up the one-to-one mapping, and generate the appropriate character
+% with the appropriate category code. Mixed case needs an extra step as it
+% may be special-cased or might be a special upper case outcome. The internal
+% when using non-Unicode engines has to be set up to only do anything
+% with ASCII characters.
+% \begin{macrocode}
+\cs_new:Npn \char_lower_case:N #1
+ { \@@_change_case:nNN { lower } \char_value_lccode:n #1 }
+\cs_new:Npn \char_upper_case:N #1
+ { \@@_change_case:nNN { upper } \char_value_uccode:n #1 }
+\cs_new:Npn \char_mixed_case:N #1
+ {
+ \tl_if_exist:cTF { c_@@_mixed_case_ \token_to_str:N #1 _tl }
+ { \tl_use:c { c_@@_mixed_case_ \token_to_str:N #1 _tl } }
+ { \char_upper_case:N #1 }
+ }
+\cs_new:Npn \char_fold_case:N #1
+ { \@@_change_case:nNN { fold } \char_value_lccode:n #1 }
+\cs_new:Npn \@@_change_case:nNN #1#2#3
+ {
+ \tl_if_exist:cTF { c_@@_ #1 _case_ \token_to_str:N #3 _tl }
+ { \tl_use:c { c_@@_ #1 _case_ \token_to_str:N #3 _tl } }
+ { \exp_args:Nf \@@_change_case:nN { #2 { `#3 } } #3 }
+ }
+\cs_new:Npn \@@_change_case:nN #1#2
+ {
+ \int_compare:nNnTF {#1} = 0
+ {#2}
+ { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ }
+\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
+ {
+ \cs_set_eq:NN \@@_change_case:nN \use_ii:nn
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\char_codepoint_to_bytes:n}
+% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxi:n}
+% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxii:Nnn}
+% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxiii:n}
+% This code converts a codepoint into the correct UTF-8 representation.
+% As there are a variable number of octets, the result starts with the
+% numeral |1|--|4| to indicate the nature of the returned value.
+% In terms of the algorithm itself, see
+% \url{https://en.wikipedia.org/wiki/UTF-8} for the octet pattern.
+% \begin{macrocode}
+\cs_new:Npn \char_codepoint_to_bytes:n #1
+ {
+ \exp_args:Nf \@@_codepoint_to_bytes_auxi:n
+ { \int_eval:n {#1} }
+ }
+\cs_new:Npn \@@_codepoint_to_bytes_auxi:n #1
+ {
+ \if_int_compare:w #1 > "80 \exp_stop_f:
+ \if_int_compare:w #1 < "800 \exp_stop_f:
+ 2
+ \@@_codepoint_to_bytes_auxii:Nnn C {#1} { 64 }
+ \@@_codepoint_to_bytes_auxiii:n {#1}
+ \else:
+ \if_int_compare:w #1 < "10000 \exp_stop_f:
+ 3
+ \@@_codepoint_to_bytes_auxii:Nnn E {#1} { 64 * 64 }
+ \@@_codepoint_to_bytes_auxiii:n
+ { \int_div_truncate:nn {#1} { 64 } }
+ \@@_codepoint_to_bytes_auxiii:n {#1}
+ \else:
+ 4
+ \@@_codepoint_to_bytes_auxii:Nnn F
+ {#1} { 64 * 64 * 64 }
+ \@@_codepoint_to_bytes_auxiii:n
+ { \int_div_truncate:nn {#1} { 64 * 64 } }
+ \@@_codepoint_to_bytes_auxiii:n
+ { \int_div_truncate:nn {#1} { 64 } }
+ \@@_codepoint_to_bytes_auxiii:n {#1}
+ \fi:
+ \fi:
+ \else:
+ 1 {#1}
+ \fi:
+ }
+\cs_new:Npn \@@_codepoint_to_bytes_auxii:Nnn #1#2#3
+ { { \int_eval:n { "#10 + \int_div_truncate:nn {#2} {#3} } } }
+\cs_new:Npn \@@_codepoint_to_bytes_auxiii:n #1
+ { { \int_eval:n { \int_mod:nn {#1} { 64 } + 128 } } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=tl>
+% \end{macrocode}
+%
% \begin{macro}[EXP, documented-as=\tl_if_head_eq_catcode:nNTF]
% {\tl_if_head_eq_catcode:oNTF}
% Extra variants.
@@ -2731,16 +2996,6 @@
% \@@_change_case_char_mixed:Nnn
% }
% \begin{macro}[EXP]{\@@_change_case_char:nN}
-% \begin{macro}[EXP]
-% {\@@_change_case_char_auxi:nN, \@@_change_case_char_auxii:nN}
-% \begin{macro}[EXP]
-% {
-% \@@_change_case_char_mixed:N,
-% \@@_change_case_char_lower:N,
-% \@@_change_case_char_upper:N
-% }
-% \begin{macro}
-% {\@@_lookup_mixed:N, \@@_lookup_lower:N, \@@_lookup_upper:N}
% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNN}
% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNN}
% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNNN}
@@ -2769,7 +3024,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_change_case:nnn #1#2#3
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{
\exp:w
\@@_change_case_aux:nnn {#1} {#2} {#3}
@@ -3005,10 +3260,15 @@
% Unicode character, which is then used in a lookup. (As will become
% obvious below, there is no intention here of covering all of Unicode.)
% \begin{macrocode}
-\cs_if_exist:NTF \utex_char:D
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
\cs_new:Npn \@@_change_case_char:nN #1#2
- { \@@_change_case_char_auxi:nN {#1} #2 }
+ {
+ \@@_change_case_output:fwn
+ { \use:c { char_ #1 _case:N } #2 }
+ }
}
{
\cs_new:Npn \@@_change_case_char:nN #1#2
@@ -3023,7 +3283,10 @@
{ \@@_change_case_char_UTFviii:nNNNNN {#1} #2 }
}
}
- { \@@_change_case_char_auxi:nN {#1} #2 }
+ {
+ \@@_change_case_output:fwn
+ { \use:c { char_ #1 _case:N } #2 }
+ }
}
}
% \end{macrocode}
@@ -3030,51 +3293,10 @@
% To allow for the special case of mixed case, we insert here a
% action-dependent auxiliary.
% \begin{macrocode}
-\cs_new:Npn \@@_change_case_char_auxi:nN #1#2
- { \use:c { @@_change_case_char_ #1 :N } #2 }
-\cs_new:Npn \@@_change_case_char_lower:N #1
+\bool_lazy_or:nnF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
- \@@_change_case_output:fwn
- {
- \cs_if_exist_use:cF { c__unicode_lower_ \token_to_str:N #1 _tl }
- { \@@_change_case_char_auxii:nN { lower } #1 }
- }
- }
-\cs_new:Npn \@@_change_case_char_upper:N #1
- {
- \@@_change_case_output:fwn
- {
- \cs_if_exist_use:cF { c__unicode_upper_ \token_to_str:N #1 _tl }
- { \@@_change_case_char_auxii:nN { upper } #1 }
- }
- }
-\cs_new:Npn \@@_change_case_char_mixed:N #1
- {
- \cs_if_exist:cTF { c__unicode_mixed_ \token_to_str:N #1 _tl }
- {
- \@@_change_case_output:fwn
- { \tl_use:c { c__unicode_mixed_ \token_to_str:N #1 _tl } }
- }
- { \@@_change_case_char_upper:N #1 }
- }
-\cs_if_exist:NTF \utex_char:D
- {
- \cs_new:Npn \@@_change_case_char_auxii:nN #1#2
- {
- \int_compare:nNnTF { \use:c { @@_lookup_ #1 :N } #2 } = { 0 }
- { \exp_stop_f: #2 }
- {
- \char_generate:nn
- { \use:c { @@_lookup_ #1 :N } #2 }
- { \char_value_catcode:n { \use:c { @@_lookup_ #1 :N } #2 } }
- }
- }
- \cs_new_protected:Npn \@@_lookup_lower:N #1 { \tex_lccode:D `#1 }
- \cs_new_protected:Npn \@@_lookup_upper:N #1 { \tex_uccode:D `#1 }
- \cs_new_eq:NN \@@_lookup_mixed:N \@@_lookup_upper:N
- }
- {
- \cs_new:Npn \@@_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 }
\cs_new:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4
{ \@@_change_case_char_UTFviii:nnN {#1} {#2#4} #3 }
\cs_new:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5
@@ -3083,10 +3305,10 @@
{ \@@_change_case_char_UTFviii:nnN {#1} {#2#4#5#6} #3 }
\cs_new:Npn \@@_change_case_char_UTFviii:nnN #1#2#3
{
- \cs_if_exist:cTF { c__unicode_ #1 _ \tl_to_str:n {#2} _tl }
+ \cs_if_exist:cTF { c_@@_ #1 _case_ \tl_to_str:n {#2} _tl }
{
\@@_change_case_output:vwn
- { c__unicode_ #1 _ \tl_to_str:n {#2} _tl }
+ { c_@@_ #1 _case_ \tl_to_str:n {#2} _tl }
}
{ \@@_change_case_output:nwn {#2} }
#3
@@ -3294,9 +3516,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:Nnw}
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:w}
@@ -3320,7 +3539,7 @@
{
\tl_if_head_is_N_type:nTF {#1}
{ \@@_change_case_lower_sigma:Nw #1 \q_recursion_stop }
- { \c__unicode_final_sigma_tl }
+ { \c_@@_final_sigma_tl }
}
\cs_new:Npn \@@_change_case_lower_sigma:Nw #1#2 \q_recursion_stop
{
@@ -3331,8 +3550,8 @@
}
{
\token_if_letter:NTF #1
- { \c__unicode_std_sigma_tl }
- { \c__unicode_final_sigma_tl }
+ { \c_@@_std_sigma_tl }
+ { \c_@@_final_sigma_tl }
}
}
% \end{macrocode}
@@ -3356,7 +3575,9 @@
% either a dotless-I or a dotted-I. In the latter case the mapping is
% easy, but in the former there is a second stage search.
% \begin{macrocode}
-\cs_if_exist:NTF \utex_char:D
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
\cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
{
@@ -3380,7 +3601,7 @@
{
\tl_if_head_is_N_type:nTF {#2}
{ \@@_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop }
- { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
+ { \@@_change_case_output:Vwn \c_@@_dotless_i_tl }
#1 #2 \q_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop
@@ -3394,7 +3615,7 @@
\bool_lazy_or:nnTF
{ \token_if_cs_p:N #1 }
{ ! \int_compare_p:nNn { `#1 } = { "0307 } }
- { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
+ { \@@_change_case_output:Vwn \c_@@_dotless_i_tl }
{
\@@_change_case_output:nwn { i }
\use_i:nn
@@ -3412,7 +3633,7 @@
\cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
{
\int_compare:nNnTF { `#1 } = { "0049 }
- { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
+ { \@@_change_case_output:Vwn \c_@@_dotless_i_tl }
{
\int_compare:nNnTF { `#1 } = { 196 }
{ \@@_change_case_lower_tr_auxi:Nw #1 {#2} }
@@ -3438,7 +3659,7 @@
\cs_new:Npn \@@_change_case_upper_tr:Nnw #1#2
{
\int_compare:nNnTF { `#1 } = { "0069 }
- { \@@_change_case_output:Vwn \c__unicode_dotted_I_tl }
+ { \@@_change_case_output:Vwn \c_@@_dotted_I_tl }
{#2}
}
% \end{macrocode}
@@ -3476,7 +3697,7 @@
\cs_new:Npn \@@_change_case_lower_lt:Nnw #1
{
\exp_args:Nf \@@_change_case_lower_lt:nNnw
- { \str_case:nVF #1 \c__unicode_accents_lt_tl \exp_stop_f: }
+ { \str_case:nVF #1 \c_@@_accents_lt_tl \exp_stop_f: }
#1
}
\cs_new:Npn \@@_change_case_lower_lt:nNnw #1#2
@@ -3489,7 +3710,7 @@
{
{ "0049 } i
{ "004A } j
- { "012E } \c__unicode_i_ogonek_tl
+ { "012E } \c_@@_i_ogonek_tl
}
\exp_stop_f:
}
@@ -3536,7 +3757,7 @@
{ \int_compare_p:nNn { `#2 } = { "0303 } }
}
}
- { \@@_change_case_output:Vwn \c__unicode_dot_above_tl }
+ { \@@_change_case_output:Vwn \c_@@_dot_above_tl }
#1 #2#3 \q_recursion_stop
}
}
@@ -3553,7 +3774,7 @@
{
{ "0069 } I
{ "006A } J
- { "012F } \c__unicode_I_ogonek_tl
+ { "012F } \c_@@_I_ogonek_tl
}
\exp_stop_f:
}
@@ -3606,122 +3827,87 @@
\cs_new:cpn { @@_change_case_upper_de-alt:Nnw } #1#2
{
\int_compare:nNnTF { `#1 } = { 223 }
- { \@@_change_case_output:Vwn \c__unicode_upper_Eszett_tl }
+ { \@@_change_case_output:Vwn \c_@@_upper_Eszett_tl }
{#2}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\__unicode_codepoint_to_UTFviii:n}
-% \begin{macro}[EXP]{\__unicode_codepoint_to_UTFviii_auxi:n}
-% \begin{macro}[EXP]{\__unicode_codepoint_to_UTFviii_auxii:Nnn}
-% \begin{macro}[EXP]{\__unicode_codepoint_to_UTFviii_auxiii:n}
-% This code converts a codepoint into the correct UTF-8 representation.
-% As there are a variable number of octets, the result starts with the
-% numeral |1|--|4| to indicate the nature of the returned value. Note that
-% this code covers the full range even though at this stage it is not
-% required here. Also note that longer-term this is likely to need a public
-% interface and/or moving to \pkg{l3str} (see experimental string
-% conversions). In terms of the algorithm itself, see
-% \url{https://en.wikipedia.org/wiki/UTF-8} for the octet pattern.
-% \begin{macrocode}
-\cs_new:Npn \__unicode_codepoint_to_UTFviii:n #1
- {
- \exp_args:Nf \__unicode_codepoint_to_UTFviii_auxi:n
- { \int_eval:n {#1} }
- }
-\cs_new:Npn \__unicode_codepoint_to_UTFviii_auxi:n #1
- {
- \if_int_compare:w #1 > "80 ~
- \if_int_compare:w #1 < "800 ~
- 2
- \__unicode_codepoint_to_UTFviii_auxii:Nnn C {#1} { 64 }
- \__unicode_codepoint_to_UTFviii_auxiii:n {#1}
- \else:
- \if_int_compare:w #1 < "10000 ~
- 3
- \__unicode_codepoint_to_UTFviii_auxii:Nnn E {#1} { 64 * 64 }
- \__unicode_codepoint_to_UTFviii_auxiii:n {#1}
- \__unicode_codepoint_to_UTFviii_auxiii:n
- { \int_div_truncate:nn {#1} { 64 } }
- \else:
- 4
- \__unicode_codepoint_to_UTFviii_auxii:Nnn F
- {#1} { 64 * 64 * 64 }
- \__unicode_codepoint_to_UTFviii_auxiii:n
- { \int_div_truncate:nn {#1} { 64 * 64 } }
- \__unicode_codepoint_to_UTFviii_auxiii:n
- { \int_div_truncate:nn {#1} { 64 } }
- \__unicode_codepoint_to_UTFviii_auxiii:n {#1}
-
- \fi:
- \fi:
- \else:
- 1 {#1}
- \fi:
- }
-\cs_new:Npn \__unicode_codepoint_to_UTFviii_auxii:Nnn #1#2#3
- { { \int_eval:n { "#10 + \int_div_truncate:nn {#2} {#3} } } }
-\cs_new:Npn \__unicode_codepoint_to_UTFviii_auxiii:n #1
- { { \int_eval:n { \int_mod:nn {#1} { 64 } + 128 } } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \begin{variable}
% {
-% \c__unicode_std_sigma_tl ,
-% \c__unicode_final_sigma_tl ,
-% \c__unicode_accents_lt_tl ,
-% \c__unicode_dot_above_tl ,
-% \c__unicode_upper_Eszett_tl
+% \c_@@_std_sigma_tl ,
+% \c_@@_final_sigma_tl ,
+% \c_@@_accents_lt_tl ,
+% \c_@@_dot_above_tl ,
+% \c_@@_upper_Eszett_tl
% }
-% The above needs various special token lists containg pre-formed characters.
+% The above needs various special token lists containing pre-formed characters.
% This set are only available in Unicode engines, with no-op definitions
% for $8$-bit use.
% \begin{macrocode}
-\cs_if_exist:NTF \utex_char:D
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
- \tl_const:Nx \c__unicode_std_sigma_tl { \utex_char:D "03C3 ~ }
- \tl_const:Nx \c__unicode_final_sigma_tl { \utex_char:D "03C2 ~ }
- \tl_const:Nx \c__unicode_accents_lt_tl
- {
- \utex_char:D "00CC ~
- { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0300 ~ }
- \utex_char:D "00CD ~
- { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0301 ~ }
- \utex_char:D "0128 ~
- { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0303 ~ }
- }
- \tl_const:Nx \c__unicode_dot_above_tl { \utex_char:D "0307 ~ }
- \tl_const:Nx \c__unicode_upper_Eszett_tl { \utex_char:D "1E9E ~ }
+ \group_begin:
+ \cs_set:Npn \@@_tmp:n #1
+ { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ \tl_const:Nx \c_@@_std_sigma_tl { \@@_tmp:n { "03C3 } }
+ \tl_const:Nx \c_@@_final_sigma_tl { \@@_tmp:n { "03C2 } }
+ \tl_const:Nx \c_@@_accents_lt_tl
+ {
+ \@@_tmp:n { "00CC }
+ {
+ \@@_tmp:n { "0069 }
+ \@@_tmp:n { "0307 }
+ \@@_tmp:n { "0300 }
+ }
+ \@@_tmp:n { "00CD }
+ {
+ \@@_tmp:n { "0069 }
+ \@@_tmp:n { "0307 }
+ \@@_tmp:n { "0301 }
+ }
+ \@@_tmp:n { "0128 }
+ {
+ \@@_tmp:n { "0069 }
+ \@@_tmp:n { "0307 }
+ \@@_tmp:n { "0303 }
+ }
+ }
+ \tl_const:Nx \c_@@_dot_above_tl { \@@_tmp:n { "0307 } }
+ \tl_const:Nx \c_@@_upper_Eszett_tl { \@@_tmp:n { "1E9E } }
+ \group_end:
}
{
- \tl_const:Nn \c__unicode_std_sigma_tl { }
- \tl_const:Nn \c__unicode_final_sigma_tl { }
- \tl_const:Nn \c__unicode_accents_lt_tl { }
- \tl_const:Nn \c__unicode_dot_above_tl { }
- \tl_const:Nn \c__unicode_upper_Eszett_tl { }
+ \tl_const:Nn \c_@@_std_sigma_tl { }
+ \tl_const:Nn \c_@@_final_sigma_tl { }
+ \tl_const:Nn \c_@@_accents_lt_tl { }
+ \tl_const:Nn \c_@@_dot_above_tl { }
+ \tl_const:Nn \c_@@_upper_Eszett_tl { }
}
% \end{macrocode}
% \end{variable}
% \begin{variable}
% {
-% \c__unicode_dotless_i_tl ,
-% \c__unicode_dotted_I_tl ,
-% \c__unicode_i_ogonek_tl ,
-% \c__unicode_I_ogonek_tl ,
+% \c_@@_dotless_i_tl ,
+% \c_@@_dotted_I_tl ,
+% \c_@@_i_ogonek_tl ,
+% \c_@@_I_ogonek_tl ,
% }
% For cases where there is an $8$-bit option in the |T1| font set up,
% a variant is provided in both cases.
% \begin{macrocode}
\group_begin:
- \cs_if_exist:NTF \utex_char:D
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
\cs_set_protected:Npn \@@_tmp:w #1#2
- { \tl_const:Nx #1 { \utex_char:D "#2 ~ } }
+ {
+ \tl_const:Nx #1
+ { \char_generate:nn {"#2} { \char_value_catcode:n {"#2} } }
+ }
}
{
\cs_set_protected:Npn \@@_tmp:w #1#2
@@ -3732,21 +3918,21 @@
\tl_const:Nx #1
{
\exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \__char_generate:nn {##2} { 13 }
+ \exp_not:N \char_generate:nn {##2} { 13 }
\exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \__char_generate:nn {##3} { 13 }
+ \exp_not:N \char_generate:nn {##3} { 13 }
}
}
\tl_set:Nx \l_@@_internal_a_tl
- { \__unicode_codepoint_to_UTFviii:n {"#2} }
+ { \char_codepoint_to_bytes:n {"#2} }
\exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
\group_end:
}
}
- \@@_tmp:w \c__unicode_dotless_i_tl { 0131 }
- \@@_tmp:w \c__unicode_dotted_I_tl { 0130 }
- \@@_tmp:w \c__unicode_i_ogonek_tl { 012F }
- \@@_tmp:w \c__unicode_I_ogonek_tl { 012E }
+ \@@_tmp:w \c_@@_dotless_i_tl { 0131 }
+ \@@_tmp:w \c_@@_dotted_I_tl { 0130 }
+ \@@_tmp:w \c_@@_i_ogonek_tl { 012F }
+ \@@_tmp:w \c_@@_I_ogonek_tl { 012E }
\group_end:
% \end{macrocode}
% \end{variable}
@@ -3767,8 +3953,8 @@
\quark_if_recursion_tail_stop:n {#1}
\tl_set:Nx \l_@@_internal_a_tl
{
- \__unicode_codepoint_to_UTFviii:n {"#1}
- \__unicode_codepoint_to_UTFviii:n {"#2}
+ \char_codepoint_to_bytes:n {"#1}
+ \char_codepoint_to_bytes:n {"#2}
}
\exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
\@@_loop:nn
@@ -3777,7 +3963,7 @@
{
\tl_const:cx
{
- c__unicode_lower_
+ c_@@_lower_case_
\char_generate:nn {#2} { 12 }
\char_generate:nn {#3} { 12 }
_tl
@@ -3784,13 +3970,13 @@
}
{
\exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \__char_generate:nn {#5} { 13 }
+ \exp_not:N \char_generate:nn {#5} { 13 }
\exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \__char_generate:nn {#6} { 13 }
+ \exp_not:N \char_generate:nn {#6} { 13 }
}
\tl_const:cx
{
- c__unicode_upper_
+ c_@@_upper_case_
\char_generate:nn {#5} { 12 }
\char_generate:nn {#6} { 12 }
_tl
@@ -3797,9 +3983,9 @@
}
{
\exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \__char_generate:nn {#2} { 13 }
+ \exp_not:N \char_generate:nn {#2} { 13 }
\exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \__char_generate:nn {#3} { 13 }
+ \exp_not:N \char_generate:nn {#3} { 13 }
}
}
\@@_loop:nn
@@ -3911,7 +4097,7 @@
{
\tl_const:cx
{
- c__unicode_ #3 _
+ c_@@_ #3 _case_
\char_generate:nn {##2} { 12 }
\char_generate:nn {##3} { 12 }
_tl
@@ -3919,7 +4105,7 @@
{#2}
}
\tl_set:Nx \l_@@_internal_a_tl
- { \__unicode_codepoint_to_UTFviii:n { "#1 } }
+ { \char_codepoint_to_bytes:n { "#1 } }
\exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
\group_end:
}
@@ -3936,8 +4122,10 @@
\cs_set_protected:Npn \@@_change_case_setup:NN #1#2
{
\quark_if_recursion_tail_stop:N #1
- \tl_const:cn { c_@@_change_case_lower_ \token_to_str:N #1 _tl } { #2 }
- \tl_const:cn { c_@@_change_case_upper_ \token_to_str:N #2 _tl } { #1 }
+ \tl_const:cn { c_@@_change_case_lower_ \token_to_str:N #1 _tl }
+ { #2 }
+ \tl_const:cn { c_@@_change_case_upper_ \token_to_str:N #2 _tl }
+ { #1 }
\@@_change_case_setup:NN
}
\@@_change_case_setup:NN
@@ -4058,6 +4246,230 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Building a token list}
+%
+% Between \cs{tl_build_begin:N} \meta{tl~var} and \cs{tl_build_end:N}
+% \meta{tl~var}, the \meta{tl~var} has the structure
+% \begin{quote}
+% \cs{exp_end:} \ldots{} \cs{exp_end:} \cs{@@_build_last:NNn}
+% \meta{assignment} \meta{next~tl} \Arg{left} \meta{right}
+% \end{quote}
+% where \meta{right} is not braced. The \enquote{data} it represents is
+% \meta{left} followed by the \enquote{data} of \meta{next~tl} followed
+% by \meta{right}. The \meta{next~tl} is a token list variable whose
+% name is that of \meta{tl~var} followed by~|'|. There are between $0$
+% and $4$ \cs{exp_end:} to keep track of when \meta{left} and
+% \meta{right} should be put into the \meta{next~tl}. The
+% \meta{assignment} is \cs{cs_set_nopar:Npx} if the variable is local,
+% and \cs{cs_gset_nopar:Npx} if it is global.
+%
+% \begin{macro}{\tl_build_begin:N, \tl_build_gbegin:N}
+% \begin{macro}{\@@_build_begin:NN, \@@_build_begin:NNN}
+% First construct the \meta{next~tl}: using a prime here conflicts
+% with the usual \pkg{expl3} convention but we need a name that can be
+% derived from |#1| without any external data such as a counter.
+% Empty that \meta{next~tl} and setup the structure. The local and
+% global versions only differ by a single function
+% \cs[no-index]{cs_(g)set_nopar:Npx} used for all assignments: this is
+% important because only that function is stored in the \meta{tl~var}
+% and \meta{next~tl} for subsequent assignments. In principle
+% \cs{@@_build_begin:NNN} could use \cs[no-index]{tl_(g)clear_new:N}
+% to empty |#1| and make sure it is defined, but logging the
+% definition does not seem useful so we just do |#3| |#1| |{}| to
+% clear it locally or globally as appropriate.
+% \begin{macrocode}
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
+\cs_new_protected:Npn \tl_build_begin:N #1
+ { \@@_build_begin:NN \cs_set_nopar:Npx #1 }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
+\cs_new_protected:Npn \tl_build_gbegin:N #1
+ { \@@_build_begin:NN \cs_gset_nopar:Npx #1 }
+\cs_new_protected:Npn \@@_build_begin:NN #1#2
+ { \exp_args:Nc \@@_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
+\cs_new_protected:Npn \@@_build_begin:NNN #1#2#3
+ {
+ #3 #1 { }
+ #3 #2
+ {
+ \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
+ \exp_not:n { \@@_build_last:NNn #3 #1 { } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
+% The |begin| and |gbegin| functions already clear enough to make the
+% token list variable effectively empty. Eventually the |begin| and
+% |gbegin| functions should check that |#1'| is empty or undefined,
+% while the |clear| and |gclear| functions ought to empty |#1'|,
+% |#1''| and so on, similar to \cs{tl_build_end:N}. This only affects
+% memory usage.
+% \begin{macrocode}
+\cs_new_eq:NN \tl_build_clear:N \tl_build_begin:N
+\cs_new_eq:NN \tl_build_gclear:N \tl_build_gbegin:N
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \tl_build_put_right:Nn, \tl_build_put_right:Nx,
+% \tl_build_gput_right:Nn, \tl_build_gput_right:Nx,
+% \@@_build_last:NNn, \@@_build_put:nn, \@@_build_put:nw
+% }
+% Similar to \cs{tl_put_right:Nn}, but apply \cs{exp:w} to |#1|. Most
+% of the time this just removes one \cs{exp_end:}. When there are
+% none left, \cs{@@_build_last:NNn} is expanded instead. It resets
+% the definition of the \meta{tl~var} by ending the \cs{exp_not:n} and
+% the definition early. Then it makes sure the \meta{next~tl} (its
+% argument |#1|) is set-up and starts a new definition. Then
+% \cs{@@_build_put:nn} and \cs{@@_build_put:nw} place the \meta{left}
+% part of the original \meta{tl~var} as appropriate for the definition
+% of the \meta{next~tl} (the \meta{right} part is left in the right
+% place without ever becoming a macro argument). We use
+% \cs{exp_after:wN} rather than some \cs{exp_args:No} to avoid reading
+% arguments that are likely very long token lists. We use
+% \cs[no-index]{cs_(g)set_nopar:Npx} rather than
+% \cs[no-index]{tl_(g)set:Nx} partly for the same reason and partly
+% because the assignments are interrupted by brace tricks, which
+% implies that the assignment does not simply set the token list to an
+% |x|-expansion of the second argument.
+% \begin{macrocode}
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
+\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
+ {
+ \cs_set_nopar:Npx #1
+ { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
+ }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
+\cs_new_protected:Npn \tl_build_put_right:Nx #1#2
+ {
+ \cs_set_nopar:Npx #1
+ { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 } #2 }
+ }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
+\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
+ {
+ \cs_gset_nopar:Npx #1
+ { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
+ }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
+\cs_new_protected:Npn \tl_build_gput_right:Nx #1#2
+ {
+ \cs_gset_nopar:Npx #1
+ { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 } #2 }
+ }
+\cs_new_protected:Npn \@@_build_last:NNn #1#2
+ {
+ \if_false: { { \fi:
+ \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
+ \@@_build_last:NNn #1 #2 { }
+ }
+ }
+ \if_meaning:w \c_empty_tl #2
+ \@@_build_begin:NN #1 #2
+ \fi:
+ #1 #2
+ {
+ \exp_after:wN \exp_not:n \exp_after:wN
+ {
+ \exp:w \if_false: } } \fi:
+ \exp_after:wN \@@_build_put:nn \exp_after:wN {#2}
+ }
+\cs_new_protected:Npn \@@_build_put:nn #1#2 { \@@_build_put:nw {#2} #1 }
+\cs_new_protected:Npn \@@_build_put:nw #1#2 \@@_build_last:NNn #3#4#5
+ { #2 \@@_build_last:NNn #3 #4 { #1 #5 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \tl_build_put_left:Nn, \tl_build_put_left:Nx,
+% \tl_build_gput_left:Nn, \tl_build_gput_left:Nx, \@@_build_put_left:NNn
+% }
+% See \cs{tl_build_put_right:Nn} for all the machinery. We could
+% easily provide \cs[no-index]{tl_build_put_left_right:Nnn}, by just
+% add the \meta{right} material after the \Arg{left} in the
+% |x|-expanding assignment.
+% \begin{macrocode}
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
+\cs_new_protected:Npn \tl_build_put_left:Nn #1
+ { \@@_build_put_left:NNn \cs_set_nopar:Npx #1 }
+\cs_generate_variant:Nn \tl_build_put_left:Nn { Nx }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
+\cs_new_protected:Npn \tl_build_gput_left:Nn #1
+ { \@@_build_put_left:NNn \cs_gset_nopar:Npx #1 }
+\cs_generate_variant:Nn \tl_build_gput_left:Nn { Nx }
+\cs_new_protected:Npn \@@_build_put_left:NNn #1#2#3
+ {
+ #1 #2
+ {
+ \exp_after:wN \exp_not:n \exp_after:wN
+ {
+ \exp:w \exp_after:wN \@@_build_put:nn
+ \exp_after:wN {#2} {#3}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tl_build_get:NN}
+% \begin{macro}{\@@_build_get:NNN, \@@_build_get:w, \@@_build_get_end:w}
+% The idea is to expand the \meta{tl~var} then the \meta{next~tl} and
+% so on, all within an |x|-expanding assignment, and wrap as
+% appropriate in \cs{exp_not:n}. The various \meta{left} parts are
+% left in the assignment as we go, which enables us to expand the
+% \meta{next~tl} at the right place. The various \meta{right} parts
+% are eventually picked up in one last \cs{exp_not:n}, with a brace
+% trick to wrap all the \meta{right} parts together.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_build_get:NN
+ { \@@_build_get:NNN \tl_set:Nx }
+\cs_new_protected:Npn \@@_build_get:NNN #1#2#3
+ { #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
+\cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
+ {
+ \exp_not:n {#4}
+ \if_meaning:w \c_empty_tl #3
+ \exp_after:wN \@@_build_get_end:w
+ \fi:
+ \exp_after:wN \@@_build_get:w #3
+ }
+\cs_new:Npn \@@_build_get_end:w #1#2#3
+ { \exp_after:wN \exp_not:n \exp_after:wN { \if_false: } \fi: }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tl_build_end:N, \tl_build_gend:N, \@@_build_end_loop:NN}
+% Get the data then clear the \meta{next~tl} recursively until finding
+% an empty one. It is perhaps wasteful to repeatedly use
+% \cs{cs_to_sr:N}. The local/global scope is checked by
+% \cs{tl_set:Nx} or \cs{tl_gset:Nx}.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_build_end:N #1
+ {
+ \@@_build_get:NNN \tl_set:Nx #1 #1
+ \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
+ }
+\cs_new_protected:Npn \tl_build_gend:N #1
+ {
+ \@@_build_get:NNN \tl_gset:Nx #1 #1
+ \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
+ }
+\cs_new_protected:Npn \@@_build_end_loop:NN #1#2
+ {
+ \if_meaning:w \c_empty_tl #1
+ \exp_after:wN \use_none:nnnnnn
+ \fi:
+ #2 #1
+ \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } #2
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Other additions to \pkg{l3tl}}
%
% \begin{macro}{\tl_rand_item:n, \tl_rand_item:N, \tl_rand_item:c}
@@ -4121,9 +4533,11 @@
\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
\cs_new:Npn \tl_range_braced:nnn { \@@_range:Nnnn \@@_range_braced:w }
-\cs_new:Npn \tl_range_unbraced:Nnn { \exp_args:No \tl_range_unbraced:nnn }
+\cs_new:Npn \tl_range_unbraced:Nnn
+ { \exp_args:No \tl_range_unbraced:nnn }
\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
-\cs_new:Npn \tl_range_unbraced:nnn { \@@_range:Nnnn \@@_range_unbraced:w }
+\cs_new:Npn \tl_range_unbraced:nnn
+ { \@@_range:Nnnn \@@_range_unbraced:w }
\cs_new:Npn \@@_range:Nnnn #1#2#3#4
{
\tl_head:f
@@ -4150,7 +4564,7 @@
\exp_after:wN { \exp_after:wN }
\fi:
\exp_after:wN #3
- \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
+ \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
\exp_after:wN { \exp:w \@@_range_skip:w #1 ; { } #4 }
}
\cs_new:Npn \@@_range_skip:w #1 ; #2
@@ -4157,7 +4571,7 @@
{
\if_int_compare:w #1 > 0 \exp_stop_f:
\exp_after:wN \@@_range_skip:w
- \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
+ \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
\else:
\exp_after:wN \exp_end:
\fi:
@@ -4170,7 +4584,7 @@
{
\if_int_compare:w #1 > 1 \exp_stop_f:
\exp_after:wN \@@_range_collect_braced:w
- \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
+ \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
\fi:
{ #2 {#3} }
}
@@ -4178,7 +4592,7 @@
{
\if_int_compare:w #1 > 1 \exp_stop_f:
\exp_after:wN \@@_range_collect_unbraced:w
- \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
+ \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
\fi:
{ #2 #3 }
}
@@ -4258,7 +4672,7 @@
% \subsection{Additions to \pkg{l3token}}
%
% \begin{variable}{\c_catcode_active_space_tl}
-% While \cs{__char_generate:nn} can produce active characters in some
+% While \cs{char_generate:nn} can produce active characters in some
% engines it cannot in general. It would be possible to simply change
% the catcode of space but then the code would need to avoid all
% spaces, making it quite unreadable. Instead we use the primitive
@@ -4335,7 +4749,10 @@
{ \tl_if_empty:nTF {#2} { \@@_true:w } { \@@_false:w } }
}
\cs_new_protected:Npn \peek_N_type:TF
- { \@@_token_generic:NNTF \@@_execute_branches_N_type: \scan_stop: }
+ {
+ \@@_token_generic:NNTF
+ \@@_execute_branches_N_type: \scan_stop:
+ }
\cs_new_protected:Npn \peek_N_type:T
{ \@@_token_generic:NNT \@@_execute_branches_N_type: \scan_stop: }
\cs_new_protected:Npn \peek_N_type:F
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -2,7 +2,7 @@
%
%% File: l3clist.dtx Copyright (C) 2004-2011 Frank Mittelbach,
%% The LaTeX3 project
-%% (C) 2012-2017 The LaTeX3 Project
+%% (C) 2012-2018 The 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
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -50,28 +50,52 @@
% \begin{documentation}
%
% Comma lists contain ordered data where items can be added to the left
-% or right end of the list. The resulting ordered list can then
-% be mapped over using \cs{clist_map_function:NN}. Several items can
-% be added at once, and spaces are removed from both sides of each item
-% on input. Hence,
+% or right end of the list. The features of this data type largely
+% overlap with those of the sequence data type, for instance applying a
+% function to every item, removing duplicate items, extracting a given
+% item, using the comma list with specified separators, and so on.
+%
+% Several items can be added at once. To ease input of comma lists from
+% data provided by a user outside an \cs{ExplSyntaxOn} \ldots{}
+% \cs{ExplSyntaxOff} block, spaces are removed from both sides of each
+% comma-delimited argument upon input. Blank arguments are ignored, to
+% allow for trailing commas or repeated commas (which may otherwise
+% arise when concatenating comma lists \enquote{by hand}). In addition,
+% a set of braces is removed if the result of space-trimming is braced:
+% this allows the storage of any item in a comma list. For instance,
% \begin{verbatim}
% \clist_new:N \l_my_clist
-% \clist_put_left:Nn \l_my_clist { ~ a ~ , ~ {b} ~ }
-% \clist_put_right:Nn \l_my_clist { ~ { c ~ } , d }
+% \clist_put_left:Nn \l_my_clist { ~a~ , ~{b}~ , c~\d }
+% \clist_put_right:Nn \l_my_clist { ~{e~} , , {{f}} , }
% \end{verbatim}
-% results in |\l_my_clist| containing |a,{b},{c~},d|.
-% Comma lists cannot contain empty items, thus
+% results in |\l_my_clist| containing |a,b,c~\d,{e~},{{f}}| namely the
+% five items |a|, |b|, |c~\d|, |e~| and~|{f}|. Comma lists normally do
+% not contain empty items so the following gives an empty comma list:
% \begin{verbatim}
% \clist_clear_new:N \l_my_clist
% \clist_put_right:Nn \l_my_clist { , ~ , , }
% \clist_if_empty:NTF \l_my_clist { true } { false }
% \end{verbatim}
-% leaves \texttt{true} in the input stream. To include an item
-% which contains a comma, or starts or ends with a space,
-% surround it with braces. The sequence data type should be preferred
-% to comma lists if items are to contain |{|, |}|, or |#| (assuming the
-% usual \TeX{} category codes apply).
+% and it leaves \texttt{true} in the input stream. To include an
+% \enquote{unsafe} item (empty, or one that contains a comma, or starts
+% or ends with a space, or is a single brace group), surround it with
+% braces.
%
+% Comma lists are particularly useful when implementing user interfaces,
+% or when interfacing with \LaTeXe{} or other code that expects or
+% provides comma list data. Almost all operations on comma lists are
+% noticeably slower than those on sequences so converting the data to
+% sequences using \cs{seq_set_from_clist:Nn} (see \pkg{l3seq}) may be
+% advisable if speed is important. The exception is that
+% \cs{clist_if_in:NnTF} and \cs{clist_remove_duplicates:N} may be faster
+% than their sequence analogues for large lists. However, these
+% functions work slowly for \enquote{unsafe} items that must be braced,
+% and may produce errors when their argument contains |{|, |}| or |#|
+% (assuming the usual \TeX{} category codes apply). In addition, comma
+% lists cannot store quarks \cs{q_mark} or \cs{q_stop}. The sequence
+% data type should thus certainly be preferred to comma lists to store
+% such items.
+%
% \section{Creating and initialising comma lists}
%
% \begin{function}{\clist_new:N, \clist_new:c}
@@ -189,7 +213,12 @@
% \end{syntax}
% Sets \meta{comma list} to contain the \meta{items},
% removing any previous content from the variable.
-% Spaces are removed from both sides of each item.
+% Blank items are omitted, spaces are removed from both sides of each
+% item, then a set of braces is removed if the resulting space-trimmed
+% item is braced.
+% To store some \meta{tokens} as a single \meta{item} even if the
+% \meta{tokens} contain commas or spaces, add a set of braces:
+% \cs{clist_set:Nn} \meta{comma list} |{| \Arg{tokens} |}|.
% \end{function}
%
% \begin{function}[updated = 2011-09-05]
@@ -207,7 +236,12 @@
% \cs{clist_put_left:Nn} \meta{comma list} |{|\meta{item_1},\ldots{},\meta{item_n}|}|
% \end{syntax}
% Appends the \meta{items} to the left of the \meta{comma list}.
-% Spaces are removed from both sides of each item.
+% Blank items are omitted, spaces are removed from both sides of each
+% item, then a set of braces is removed if the resulting space-trimmed
+% item is braced.
+% To append some \meta{tokens} as a single \meta{item} even if the
+% \meta{tokens} contain commas or spaces, add a set of braces:
+% \cs{clist_put_left:Nn} \meta{comma list} |{| \Arg{tokens} |}|.
% \end{function}
%
% \begin{function}[updated = 2011-09-05]
@@ -225,7 +259,12 @@
% \cs{clist_put_right:Nn} \meta{comma list} |{|\meta{item_1},\ldots{},\meta{item_n}|}|
% \end{syntax}
% Appends the \meta{items} to the right of the \meta{comma list}.
-% Spaces are removed from both sides of each item.
+% Blank items are omitted, spaces are removed from both sides of each
+% item, then a set of braces is removed if the resulting space-trimmed
+% item is braced.
+% To append some \meta{tokens} as a single \meta{item} even if the
+% \meta{tokens} contain commas or spaces, add a set of braces:
+% \cs{clist_put_right:Nn} \meta{comma list} |{| \Arg{tokens} |}|.
% \end{function}
%
% \section{Modifying comma lists}
@@ -250,7 +289,7 @@
% This function iterates through every item in the \meta{comma list} and
% does a comparison with the \meta{items} already checked. It is therefore
% relatively slow with large comma lists.
-% Furthermore, it does not work if any of the items in the
+% Furthermore, it may fail if any of the items in the
% \meta{comma list} contains |{|, |}|, or |#|
% (assuming the usual \TeX{} category codes apply).
% \end{texnote}
@@ -268,7 +307,7 @@
% The \meta{item} comparison takes place on a token basis, as for
% \cs{tl_if_eq:nn(TF)}.
% \begin{texnote}
-% The \meta{item} may not contain |{|, |}|, or |#|
+% The function may fail if the \meta{item} contains |{|, |}|, or |#|
% (assuming the usual \TeX{} category codes apply).
% \end{texnote}
% \end{function}
@@ -289,7 +328,9 @@
% \cs{clist_reverse:n} \Arg{comma list}
% \end{syntax}
% Leaves the items in the \meta{comma list} in the input stream in
-% reverse order. Braces and spaces are preserved by this process.
+% reverse order. Contrarily to other what is done for other
+% \texttt{n}-type \meta{comma list} arguments, braces and spaces are
+% preserved by this process.
% \begin{texnote}
% The result is returned within \tn{unexpanded}, which means that the
% comma list does not expand further when appearing in an
@@ -341,17 +382,15 @@
% \cs{clist_if_in:NnTF} \meta{comma list} \Arg{item} \Arg{true code} \Arg{false code}
% \end{syntax}
% Tests if the \meta{item} is present in the \meta{comma list}.
-% In the case of an \texttt{n}-type \meta{comma list},
-% spaces are stripped from each item, but braces are not removed.
-% Hence,
+% In the case of an \texttt{n}-type \meta{comma list}, the usual rules
+% of space trimming and brace stripping apply. Hence,
% \begin{verbatim}
% \clist_if_in:nnTF { a , {b}~ , {b} , c } { b } {true} {false}
% \end{verbatim}
-% yields \texttt{false}.
+% yields \texttt{true}.
% \begin{texnote}
-% The \meta{item} may not contain |{|, |}|, or |#|
-% (assuming the usual \TeX{} category codes apply),
-% and should not contain |,| nor start or end with a space.
+% The function may fail if the \meta{item} contains |{|, |}|, or |#|
+% (assuming the usual \TeX{} category codes apply).
% \end{texnote}
% \end{function}
%
@@ -364,7 +403,7 @@
% spaces are trimmed around each item.
% If the result of trimming spaces is empty, the item is ignored.
% Otherwise, if the item is surrounded by braces, one set is removed,
-% and the result is passed to the mapped function. Thus, if your
+% and the result is passed to the mapped function. Thus, if the
% comma list that is being mapped is \verb*|{a , {{b} }, ,{}, {c},}|
% then the arguments passed to the mapped function are
% `\verb*|a|', `\verb*|{b} |', an empty argument, and `\verb*|c|'.
@@ -413,7 +452,7 @@
% \begin{syntax}
% \cs{clist_map_break:}
% \end{syntax}
-% Used to terminate a |\clist_map_...| function before all
+% Used to terminate a \cs[no-index]{clist_map_\ldots{}} function before all
% entries in the \meta{comma list} have been processed. This
% normally takes place within a conditional statement, for example
% \begin{verbatim}
@@ -426,7 +465,7 @@
% }
% }
% \end{verbatim}
-% Use outside of a |\clist_map_...| scenario leads to low
+% Use outside of a \cs[no-index]{clist_map_\ldots{}} scenario leads to low
% level \TeX{} errors.
% \begin{texnote}
% When the mapping is broken, additional tokens may be inserted
@@ -440,7 +479,7 @@
% \begin{syntax}
% \cs{clist_map_break:n} \Arg{code}
% \end{syntax}
-% Used to terminate a |\clist_map_...| function before all
+% Used to terminate a \cs[no-index]{clist_map_\ldots{}} function before all
% entries in the \meta{comma list} have been processed, inserting
% the \meta{code} after the mapping has ended. This
% normally takes place within a conditional statement, for example
@@ -454,7 +493,7 @@
% }
% }
% \end{verbatim}
-% Use outside of a |\clist_map_...| scenario leads to low
+% Use outside of a \cs[no-index]{clist_map_\ldots{}} scenario leads to low
% level \TeX{} errors.
% \begin{texnote}
% When the mapping is broken, additional tokens may be inserted
@@ -472,7 +511,7 @@
% Leaves the number of items in the \meta{comma list} in the input
% stream as an \meta{integer denotation}. The total number of items
% in a \meta{comma list} includes those which are duplicates,
-% \emph{i.e.}~every item in a \meta{comma list} is unique.
+% \emph{i.e.}~every item in a \meta{comma list} is counted.
% \end{function}
%
% \section{Using the content of comma lists directly}
@@ -624,7 +663,8 @@
% \cs{clist_push:Nn} \meta{comma list} \Arg{items}
% \end{syntax}
% Adds the \Arg{items} to the top of the \meta{comma list}.
-% Spaces are removed from both sides of each item.
+% Spaces are removed from both sides of each item as for any
+% \texttt{n}-type comma list.
% \end{function}
%
% \section{Using a single item}
@@ -740,6 +780,110 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Removing spaces around items}
+%
+% \begin{macro}{\@@_trim_next:w}
+% Called as \cs{exp:w} \cs{@@_trim_next:w} \cs{prg_do_nothing:}
+% \meta{comma list} \ldots{} it expands to \Arg{trimmed item} where
+% the \meta{trimmed item} is the first non-empty result from removing
+% spaces from both ends of comma-delimited items in the \meta{comma
+% list}. The \cs{prg_do_nothing:} marker avoids losing braces. The
+% test for blank items is a somewhat optimized \cs{tl_if_empty:oTF}
+% construction; if blank, another item is sought, otherwise trim
+% spaces.
+% \begin{macrocode}
+\cs_new:Npn \@@_trim_next:w #1 ,
+ {
+ \tl_if_empty:oTF { \use_none:nn #1 ? }
+ { \@@_trim_next:w \prg_do_nothing: }
+ { \tl_trim_spaces_apply:oN {#1} \exp_end: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\@@_sanitize:n}
+% \begin{macro}{\@@_sanitize:Nn}
+% The auxiliary \cs{@@_sanitize:Nn} receives a delimiter
+% (\cs{c_empty_tl} the first time, afterwards a comma) and that item
+% as arguments. Unless we are done with the loop it calls
+% \cs{@@_wrap_item:w} to unbrace the item (using a comma delimiter is
+% safe since |#2| came from removing spaces from an argument delimited
+% by a comma) and possibly re-brace it if needed.
+% \begin{macrocode}
+\cs_new:Npn \@@_sanitize:n #1
+ {
+ \exp_after:wN \@@_sanitize:Nn \exp_after:wN \c_empty_tl
+ \exp:w \@@_trim_next:w \prg_do_nothing:
+ #1 , \q_recursion_tail , \q_recursion_stop
+ }
+\cs_new:Npn \@@_sanitize:Nn #1#2
+ {
+ \quark_if_recursion_tail_stop:n {#2}
+ #1 \@@_wrap_item:w #2 ,
+ \exp_after:wN \@@_sanitize:Nn \exp_after:wN ,
+ \exp:w \@@_trim_next:w \prg_do_nothing:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_if_wrap:n}
+% \begin{macro}{\@@_if_wrap:w}
+% True if the argument must be wrapped to avoid getting altered by some
+% clist operations. That is the case whenever the argument
+% \begin{itemize}
+% \item starts or end with a space or contains a comma,
+% \item is empty, or
+% \item consists of a single braced group.
+% \end{itemize}
+% All \pkg{l3clist} functions go through the same test when they need
+% to determine whether to brace an item, so it is not a problem that
+% this test has false positives such as \enquote{\cs{q_mark}
+% \texttt{?}}. If the argument starts or end with a space or contains
+% a comma then one of the three arguments of \cs{@@_if_wrap:w} will
+% have its end delimiter (partly) in one of the three copies of |#1|
+% in \cs{@@_if_wrap:nTF}; this has a knock-on effect meaning that the
+% result of the expansion is not empty; in that case, wrap.
+% Otherwise, the argument is safe unless it starts with a brace group
+% (or is empty) and it is empty or consists of a single
+% \texttt{n}-type argument.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_wrap:n #1 { TF }
+ {
+ \tl_if_empty:oTF
+ {
+ \@@_if_wrap:w
+ \q_mark ? #1 ~ \q_mark ? ~ #1 \q_mark , ~ \q_mark #1 ,
+ }
+ {
+ \tl_if_head_is_group:nTF { #1 { } }
+ {
+ \tl_if_empty:nTF {#1}
+ { \prg_return_true: }
+ {
+ \tl_if_empty:oTF { \use_none:n #1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
+\cs_new:Npn \@@_if_wrap:w #1 \q_mark ? ~ #2 ~ \q_mark #3 , { }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_wrap_item:w}
+% Safe items are put in \cs{exp_not:n}, otherwise we put an extra set
+% of braces.
+% \begin{macrocode}
+\cs_new:Npn \@@_wrap_item:w #1 ,
+ { \@@_if_wrap:nTF {#1} { \exp_not:n { {#1} } } { \exp_not:n {#1} } }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Allocation and initialisation}
%
% \begin{macro}{\clist_new:N, \clist_new:c}
@@ -756,12 +900,11 @@
% \clist_const:Nn, \clist_const:cn,
% \clist_const:Nx, \clist_const:cx
% }
-% Creating and initializing a constant comma list is done in a way
-% similar to \cs{clist_set:Nn} and \cs{clist_gset:Nn}, being careful
-% to strip spaces.
+% Creating and initializing a constant comma list is done by
+% sanitizing all items (stripping spaces and braces).
% \begin{macrocode}
\cs_new_protected:Npn \clist_const:Nn #1#2
- { \tl_const:Nx #1 { \@@_trim_spaces:n {#2} } }
+ { \tl_const:Nx #1 { \@@_sanitize:n {#2} } }
\cs_generate_variant:Nn \clist_const:Nn { c , Nx , cx }
% \end{macrocode}
% \end{macro}
@@ -829,13 +972,11 @@
% \clist_gset_from_seq:Nc, \clist_gset_from_seq:cc
% }
% \UnitTested
-% \begin{macro}{\@@_set_from_seq:NNNN}
-% \begin{macro}{\@@_wrap_item:n}
-% \begin{macro}{\@@_set_from_seq:w}
-% Setting a comma list from a comma-separated list is done using a simple
-% mapping. We wrap most items with \cs{exp_not:n}, and a comma. Items which
-% contain a comma or a space are surrounded by an extra set of braces. The
-% first comma must be removed, except in the case of an empty comma-list.
+% \begin{macro}{\@@_set_from_seq:NNNN, \@@_set_from_seq:n}
+% Setting a comma list from a comma-separated list is done using a
+% simple mapping. Safe items are put in \cs{exp_not:n}, otherwise we
+% put an extra set of braces. The first comma must be removed, except
+% in the case of an empty comma-list.
% \begin{macrocode}
\cs_new_protected:Npn \clist_set_from_seq:NN
{ \@@_set_from_seq:NNNN \clist_clear:N \tl_set:Nx }
@@ -848,19 +989,18 @@
{
#2 #3
{
- \exp_last_unbraced:Nf \use_none:n
- { \seq_map_function:NN #4 \@@_wrap_item:n }
+ \exp_after:wN \use_none:n \exp:w \exp_end_continue_f:w
+ \seq_map_function:NN #4 \@@_set_from_seq:n
}
}
}
-\cs_new:Npn \@@_wrap_item:n #1
+\cs_new:Npn \@@_set_from_seq:n #1
{
,
- \tl_if_empty:oTF { \@@_set_from_seq:w #1 ~ , #1 ~ }
- { \exp_not:n {#1} }
+ \@@_if_wrap:nTF {#1}
{ \exp_not:n { {#1} } }
+ { \exp_not:n {#1} }
}
-\cs_new:Npn \@@_set_from_seq:w #1 , #2 ~ { }
\cs_generate_variant:Nn \clist_set_from_seq:NN { Nc }
\cs_generate_variant:Nn \clist_set_from_seq:NN { c , cc }
\cs_generate_variant:Nn \clist_gset_from_seq:NN { Nc }
@@ -869,8 +1009,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}{\clist_concat:NNN, \clist_concat:ccc}
% \UnitTested
@@ -911,66 +1049,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Removing spaces around items}
-%
-% \begin{macro}[EXP]{\@@_trim_spaces_generic:nw}
-% \begin{macro}{\@@_trim_spaces_generic:nn}
-% \begin{syntax}
-% \cs{@@_trim_spaces_generic:nw} \Arg{code} \cs{q_mark} \meta{item} |,|
-% \end{syntax}
-% This expands to the \meta{code}, followed by a brace group
-% containing the \meta{item}, with leading and trailing spaces
-% removed. The calling function is responsible for inserting
-% \cs{q_mark} in front of the \meta{item}, as well as testing for the
-% end of the list. We reuse a \pkg{l3tl} internal function, whose
-% first argument must start with \cs{q_mark}. That trims the item
-% |#2|, then feeds the result (after having to do an \texttt{o}-type
-% expansion) to \cs{@@_trim_spaces_generic:nn} which places the
-% \meta{code} in front of the \meta{trimmed item}.
-% \begin{macrocode}
-\cs_new:Npn \@@_trim_spaces_generic:nw #1#2 ,
- {
- \__tl_trim_spaces:nn {#2}
- { \exp_args:No \@@_trim_spaces_generic:nn } {#1}
- }
-\cs_new:Npn \@@_trim_spaces_generic:nn #1#2 { #2 {#1} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[rEXP]{\@@_trim_spaces:n}
-% \begin{macro}{\@@_trim_spaces:nn}
-% The first argument of \cs{@@_trim_spaces:nn} is initially empty,
-% and later a comma, namely, as soon as we have added an item to the
-% resulting list. The auxiliary tests for the end of the list,
-% and also prevents empty arguments from finding their way into the
-% output.
-% \begin{macrocode}
-\cs_new:Npn \@@_trim_spaces:n #1
- {
- \@@_trim_spaces_generic:nw
- { \@@_trim_spaces:nn { } }
- \q_mark #1 ,
- \q_recursion_tail, \q_recursion_stop
- }
-\cs_new:Npn \@@_trim_spaces:nn #1 #2
- {
- \quark_if_recursion_tail_stop:n {#2}
- \tl_if_empty:nTF {#2}
- {
- \@@_trim_spaces_generic:nw
- { \@@_trim_spaces:nn {#1} } \q_mark
- }
- {
- #1 \exp_not:n {#2}
- \@@_trim_spaces_generic:nw
- { \@@_trim_spaces:nn { , } } \q_mark
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Adding data to comma lists}
%
% \begin{macro}
@@ -989,9 +1067,9 @@
% }
% \begin{macrocode}
\cs_new_protected:Npn \clist_set:Nn #1#2
- { \tl_set:Nx #1 { \@@_trim_spaces:n {#2} } }
+ { \tl_set:Nx #1 { \@@_sanitize:n {#2} } }
\cs_new_protected:Npn \clist_gset:Nn #1#2
- { \tl_gset:Nx #1 { \@@_trim_spaces:n {#2} } }
+ { \tl_gset:Nx #1 { \@@_sanitize:n {#2} } }
\cs_generate_variant:Nn \clist_set:Nn { NV , No , Nx , c , cV , co , cx }
\cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx }
% \end{macrocode}
@@ -1015,8 +1093,9 @@
% }
% \UnitTested
% \begin{macro}{\@@_put_left:NNNn}
-% Comma lists cannot hold empty values: there are therefore a couple
-% of sanity checks to avoid accumulating commas.
+% Everything is based on concatenation after storing in
+% \cs{l_@@_internal_clist}. This avoids having to worry here about
+% space-trimming and so on.
% \begin{macrocode}
\cs_new_protected:Npn \clist_put_left:Nn
{ \@@_put_left:NNNn \clist_concat:NNN \clist_set:Nn }
@@ -1078,7 +1157,11 @@
% \UnitTested
% \begin{macro}{\@@_get:wN}
% Getting an item from the left of a comma list is pretty easy: just
-% trim off the first item using the comma.
+% trim off the first item using the comma. No need to trim spaces as
+% comma-list \emph{variables} are assumed to have \enquote{cleaned-up}
+% items. (Note that grabbing a comma-delimited item removes an outer
+% pair of braces if present, exactly as needed to uncover the
+% underlying item.)
% \begin{macrocode}
\cs_new_protected:Npn \clist_get:NN #1#2
{
@@ -1211,10 +1294,11 @@
%
% \subsection{Modifying comma lists}
%
-% \begin{variable}{\l_@@_internal_remove_clist}
-% An internal comma list for the removal routines.
+% \begin{variable}{\l_@@_internal_remove_clist, \l_@@_internal_remove_seq}
+% An internal comma list and a sequence for the removal routines.
% \begin{macrocode}
\clist_new:N \l_@@_internal_remove_clist
+\seq_new:N \l_@@_internal_remove_seq
% \end{macrocode}
% \end{variable}
%
@@ -1250,11 +1334,20 @@
% \UnitTested
% \begin{macro}{\clist_gremove_all:Nn, \clist_gremove_all:cn}
% \UnitTested
-% \begin{macro}{\@@_remove_all:NNn}
+% \begin{macro}{\@@_remove_all:NNNn}
% \begin{macro}{\@@_remove_all:w}
% \begin{macro}{\@@_remove_all:}
-% The method used here is very similar to \cs{tl_replace_all:Nnn}.
-% Build a function delimited by the \meta{item} that should be removed,
+% The method used here for safe items is very similar to
+% \cs{tl_replace_all:Nnn}. However, if the item contains commas or
+% leading/trailing spaces, or is empty, or consists of a single brace
+% group, we know that it can only appear within braces so the code
+% would fail; instead just convert to a sequence and do the removal
+% with \pkg{l3seq} code (it involves somewhat elaborate code to do
+% most of the work expandably but the final token list comparisons
+% non-expandably).
+%
+% For \enquote{safe} items, build a function delimited by the
+% \meta{item} that should be removed,
% surrounded with commas, and call that function followed by
% the expanded comma list, and another copy of the \meta{item}.
% The loop is controlled by the argument grabbed by
@@ -1276,29 +1369,37 @@
% the second step removes it.
% \begin{macrocode}
\cs_new_protected:Npn \clist_remove_all:Nn
- { \@@_remove_all:NNn \tl_set:Nx }
+ { \@@_remove_all:NNNn \clist_set_from_seq:NN \tl_set:Nx }
\cs_new_protected:Npn \clist_gremove_all:Nn
- { \@@_remove_all:NNn \tl_gset:Nx }
-\cs_new_protected:Npn \@@_remove_all:NNn #1#2#3
+ { \@@_remove_all:NNNn \clist_gset_from_seq:NN \tl_gset:Nx }
+\cs_new_protected:Npn \@@_remove_all:NNNn #1#2#3#4
{
- \cs_set:Npn \@@_tmp:w ##1 , #3 ,
+ \@@_if_wrap:nTF {#4}
{
- ##1
- , \q_mark , \use_none_delimit_by_q_stop:w ,
- \@@_remove_all:
+ \seq_set_from_clist:NN \l_@@_internal_remove_seq #3
+ \seq_remove_all:Nn \l_@@_internal_remove_seq {#4}
+ #1 #3 \l_@@_internal_remove_seq
}
- #1 #2
{
- \exp_after:wN \@@_remove_all:
- #2 , \q_mark , #3 , \q_stop
- }
- \clist_if_empty:NF #2
- {
- #1 #2
+ \cs_set:Npn \@@_tmp:w ##1 , #4 ,
{
- \exp_args:No \exp_not:o
- { \exp_after:wN \use_none:n #2 }
+ ##1
+ , \q_mark , \use_none_delimit_by_q_stop:w ,
+ \@@_remove_all:
}
+ #2 #3
+ {
+ \exp_after:wN \@@_remove_all:
+ #3 , \q_mark , #4 , \q_stop
+ }
+ \clist_if_empty:NF #3
+ {
+ #2 #3
+ {
+ \exp_args:No \exp_not:o
+ { \exp_after:wN \use_none:n #3 }
+ }
+ }
}
}
\cs_new:Npn \@@_remove_all:
@@ -1425,26 +1526,46 @@
% \clist_if_in:cn, \clist_if_in:cV, \clist_if_in:co,
% \clist_if_in:nn, \clist_if_in:nV, \clist_if_in:no
% }
-% \begin{macro}{\@@_if_in_return:nn}
+% \begin{macro}{\@@_if_in_return:nnN}
% \UnitTested
-% See description of the \cs{tl_if_in:Nn} function for details.
-% We simply surround the comma list, and the item, with commas.
+% For \enquote{safe} items, we simply surround the comma list, and the
+% item, with commas, then use the same code as for \cs{tl_if_in:Nn}.
+% For \enquote{unsafe} items we follow the same route as
+% \cs{seq_if_in:Nn}, mapping through the list a comparison function.
+% If found, return \texttt{true} and remove \cs{prg_return_false:}.
% \begin{macrocode}
\prg_new_protected_conditional:Npnn \clist_if_in:Nn #1#2 { T , F , TF }
{
- \exp_args:No \@@_if_in_return:nn #1 {#2}
+ \exp_args:No \@@_if_in_return:nnN #1 {#2} #1
}
\prg_new_protected_conditional:Npnn \clist_if_in:nn #1#2 { T , F , TF }
{
\clist_set:Nn \l_@@_internal_clist {#1}
- \exp_args:No \@@_if_in_return:nn \l_@@_internal_clist {#2}
+ \exp_args:No \@@_if_in_return:nnN \l_@@_internal_clist {#2}
+ \l_@@_internal_clist
}
-\cs_new_protected:Npn \@@_if_in_return:nn #1#2
+\cs_new_protected:Npn \@@_if_in_return:nnN #1#2#3
{
- \cs_set:Npn \@@_tmp:w ##1 ,#2, { }
- \tl_if_empty:oTF
- { \@@_tmp:w ,#1, {} {} ,#2, }
- { \prg_return_false: } { \prg_return_true: }
+ \@@_if_wrap:nTF {#2}
+ {
+ \cs_set:Npx \@@_tmp:w ##1
+ {
+ \exp_not:N \tl_if_eq:nnT {##1}
+ \exp_not:n
+ {
+ {#2}
+ { \clist_map_break:n { \prg_return_true: \use_none:n } }
+ }
+ }
+ \clist_map_function:NN #3 \@@_tmp:w
+ \prg_return_false:
+ }
+ {
+ \cs_set:Npn \@@_tmp:w ##1 ,#2, { }
+ \tl_if_empty:oTF
+ { \@@_tmp:w ,#1, {} {} ,#2, }
+ { \prg_return_false: } { \prg_return_true: }
+ }
}
\prg_generate_conditional_variant:Nnn \clist_if_in:Nn
{ NV , No , c , cV , co } { T , F , TF }
@@ -1463,8 +1584,8 @@
% that comma-list would be seen as consisting of one empty item).
% Then loop over the comma-list, grabbing one comma-delimited
% item at a time. The end is marked by \cs{q_recursion_tail}.
-% The auxiliary function \cs{@@_map_function:Nw} is used
-% directly in \cs{clist_map_inline:Nn}. Change with care.
+% The auxiliary function \cs{@@_map_function:Nw} is also used
+% in \cs{clist_map_inline:Nn}.
% \begin{macrocode}
\cs_new:Npn \clist_map_function:NN #1#2
{
@@ -1472,12 +1593,12 @@
{
\exp_last_unbraced:NNo \@@_map_function:Nw #2 #1
, \q_recursion_tail ,
- \__prg_break_point:Nn \clist_map_break: { }
+ \prg_break_point:Nn \clist_map_break: { }
}
}
\cs_new:Npn \@@_map_function:Nw #1#2 ,
{
- \__quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
#1 {#2}
\@@_map_function:Nw #1
}
@@ -1492,25 +1613,24 @@
% \begin{macro}{\@@_map_unbrace:Nw}
% The \texttt{n}-type mapping function is a bit more awkward,
% since spaces must be trimmed from each item.
-% Space trimming is again based on \cs{@@_trim_spaces_generic:nw}.
-% The auxiliary \cs{@@_map_function_n:Nn} receives
-% as arguments the function, and the result of removing leading
-% and trailing spaces from the item which lies until the next comma.
-% Empty items are ignored, then one level of braces is removed
-% by \cs{@@_map_unbrace:Nw}.
+% Space trimming is again based on \cs{@@_trim_next:w}.
+% The auxiliary \cs{@@_map_function_n:Nn} receives as arguments the
+% function, and the next non-empty item (after space trimming but
+% before brace removal). One level of braces is removed by
+% \cs{@@_map_unbrace:Nw}.
% \begin{macrocode}
\cs_new:Npn \clist_map_function:nN #1#2
{
- \@@_trim_spaces_generic:nw { \@@_map_function_n:Nn #2 }
- \q_mark #1, \q_recursion_tail,
- \__prg_break_point:Nn \clist_map_break: { }
+ \exp_after:wN \@@_map_function_n:Nn \exp_after:wN #2
+ \exp:w \@@_trim_next:w \prg_do_nothing: #1 , \q_recursion_tail ,
+ \prg_break_point:Nn \clist_map_break: { }
}
\cs_new:Npn \@@_map_function_n:Nn #1 #2
{
- \__quark_if_recursion_tail_break:nN {#2} \clist_map_break:
- \tl_if_empty:nF {#2} { \@@_map_unbrace:Nw #1 #2, }
- \@@_trim_spaces_generic:nw { \@@_map_function_n:Nn #1 }
- \q_mark
+ \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \@@_map_unbrace:Nw #1 #2,
+ \exp_after:wN \@@_map_function_n:Nn \exp_after:wN #1
+ \exp:w \@@_trim_next:w \prg_do_nothing:
}
\cs_new:Npn \@@_map_unbrace:Nw #1 #2, { #1 {#2} }
% \end{macrocode}
@@ -1538,14 +1658,14 @@
{
\clist_if_empty:NF #1
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:cpn
- { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_last_unbraced:Nco \@@_map_function:Nw
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
#1 , \q_recursion_tail ,
- \__prg_break_point:Nn \clist_map_break:
- { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \clist_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
}
\cs_new_protected:Npn \clist_map_inline:nn #1
@@ -1567,6 +1687,8 @@
% additionally we store each item in the given variable.
% As for inline mappings, space trimming for the \texttt{n}
% variant is done by storing the comma list in a variable.
+% The strange \cs{use:n} avoids unlikely problems when |#2| would
+% contain \cs{q_recursion_stop}.
% \begin{macrocode}
\cs_new_protected:Npn \clist_map_variable:NNn #1#2#3
{
@@ -1576,7 +1698,7 @@
{ \@@_map_variable:Nnw #2 {#3} }
#1
, \q_recursion_tail , \q_recursion_stop
- \__prg_break_point:Nn \clist_map_break: { }
+ \prg_break_point:Nn \clist_map_break: { }
}
}
\cs_new_protected:Npn \clist_map_variable:nNn #1
@@ -1598,12 +1720,12 @@
% \end{macro}
%
% \begin{macro}{\clist_map_break:, \clist_map_break:n}
-% The break statements use the general \cs{__prg_map_break:Nn} mechanism.
+% The break statements use the general \cs{prg_map_break:Nn} mechanism.
% \begin{macrocode}
\cs_new:Npn \clist_map_break:
- { \__prg_map_break:Nn \clist_map_break: { } }
+ { \prg_map_break:Nn \clist_map_break: { } }
\cs_new:Npn \clist_map_break:n
- { \__prg_map_break:Nn \clist_map_break: }
+ { \prg_map_break:Nn \clist_map_break: }
% \end{macrocode}
% \end{macro}
%
@@ -1769,6 +1891,7 @@
% \@@_item_n:nw,
% \@@_item_n_loop:nw,
% \@@_item_n_end:n,
+% \@@_item_n_strip:n,
% \@@_item_n_strip:w}
% This starts in the same way as \cs{clist_item:Nn} by counting the items
% of the comma list. The final item should be space-trimmed before being
@@ -1800,10 +1923,8 @@
}
}
\cs_new:Npn \@@_item_n_end:n #1 #2 \q_stop
- {
- \__tl_trim_spaces:nn { \q_mark #1 }
- { \exp_last_unbraced:No \@@_item_n_strip:w } ,
- }
+ { \tl_trim_spaces_apply:nN {#1} \@@_item_n_strip:n }
+\cs_new:Npn \@@_item_n_strip:n #1 { \@@_item_n_strip:w #1 , }
\cs_new:Npn \@@_item_n_strip:w #1 , { \exp_not:n {#1} }
% \end{macrocode}
% \end{macro}
@@ -1812,7 +1933,7 @@
% \subsection{Viewing comma lists}
%
% \begin{macro}{\clist_show:N, \clist_show:c, \clist_log:N, \clist_log:c, \@@_show:NN}
-% Apply the general \cs{__kernel_check_defined:NT} and
+% Apply the general \cs{__kernel_chk_defined:NT} and
% \cs{msg_show:nnnnnn}.
% \begin{macrocode}
\cs_new_protected:Npn \clist_show:N { \@@_show:NN \msg_show:nnxxxx }
@@ -1821,7 +1942,7 @@
\cs_generate_variant:Nn \clist_log:N { c }
\cs_new_protected:Npn \@@_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{
#1 { LaTeX/kernel } { show-clist }
{ \token_to_str:N #2 }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -311,7 +311,7 @@
% which displays the result in the terminal.
% \end{function}
%
-% \subsection{Constants and variables}
+% \section{Constants and variables}
%
% \begin{variable}{\c_empty_coffin}
% A permanently empty coffin.
@@ -448,6 +448,16 @@
% placing material in them. This all relies on the following data
% structures.
%
+% \begin{macro}[EXP]{\@@_to_value:N}
+% Coffins are a two-part structure and we rely on the internal nature of
+% box allocation to make everything work. As such, we need an interface
+% to turn coffin identifiers into numbers. For the purposes here, the
+% signature allowed is |N| despite the nature of the underlying primitive.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_to_value:N \tex_number:D
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP, pTF]{\coffin_if_exist:N, \coffin_if_exist:c}
% Several of the higher-level coffin functions would give multiple
% errors if the coffin does not exist. A cleaner way to handle this
@@ -458,7 +468,7 @@
{
\cs_if_exist:NTF #1
{
- \cs_if_exist:cTF { l_@@_poles_ \__int_value:w #1 _prop }
+ \cs_if_exist:cTF { l_@@_poles_ \@@_to_value:N #1 _prop }
{ \prg_return_true: }
{ \prg_return_false: }
}
@@ -516,11 +526,11 @@
{
\box_new:N #1
\debug_suspend:
- \prop_clear_new:c { l_@@_corners_ \__int_value:w #1 _prop }
- \prop_clear_new:c { l_@@_poles_ \__int_value:w #1 _prop }
- \prop_gset_eq:cN { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_clear_new:c { l_@@_corners_ \@@_to_value:N #1 _prop }
+ \prop_clear_new:c { l_@@_poles_ \@@_to_value:N #1 _prop }
+ \prop_gset_eq:cN { l_@@_corners_ \@@_to_value:N #1 _prop }
\c_@@_corners_prop
- \prop_gset_eq:cN { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_gset_eq:cN { l_@@_poles_ \@@_to_value:N #1 _prop }
\c_@@_poles_prop
\debug_resume:
}
@@ -732,7 +742,7 @@
\cs_new_protected:Npn \@@_get_pole:NnN #1#2#3
{
\prop_get:cnNF
- { l_@@_poles_ \__int_value:w #1 _prop } {#2} #3
+ { l_@@_poles_ \@@_to_value:N #1 _prop } {#2} #3
{
\__kernel_msg_error:nnxx { kernel } { unknown-coffin-pole }
{#2} { \token_to_str:N #1 }
@@ -747,9 +757,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_reset_structure:N #1
{
- \prop_set_eq:cN { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_set_eq:cN { l_@@_corners_ \@@_to_value:N #1 _prop }
\c_@@_corners_prop
- \prop_set_eq:cN { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_set_eq:cN { l_@@_poles_ \@@_to_value:N #1 _prop }
\c_@@_poles_prop
}
% \end{macrocode}
@@ -761,17 +771,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_set_eq_structure:NN #1#2
{
- \prop_set_eq:cc { l_@@_corners_ \__int_value:w #1 _prop }
- { l_@@_corners_ \__int_value:w #2 _prop }
- \prop_set_eq:cc { l_@@_poles_ \__int_value:w #1 _prop }
- { l_@@_poles_ \__int_value:w #2 _prop }
+ \prop_set_eq:cc { l_@@_corners_ \@@_to_value:N #1 _prop }
+ { l_@@_corners_ \@@_to_value:N #2 _prop }
+ \prop_set_eq:cc { l_@@_poles_ \@@_to_value:N #1 _prop }
+ { l_@@_poles_ \@@_to_value:N #2 _prop }
}
\cs_new_protected:Npn \@@_gset_eq_structure:NN #1#2
{
- \prop_gset_eq:cc { l_@@_corners_ \__int_value:w #1 _prop }
- { l_@@_corners_ \__int_value:w #2 _prop }
- \prop_gset_eq:cc { l_@@_poles_ \__int_value:w #1 _prop }
- { l_@@_poles_ \__int_value:w #2 _prop }
+ \prop_gset_eq:cc { l_@@_corners_ \@@_to_value:N #1 _prop }
+ { l_@@_corners_ \@@_to_value:N #2 _prop }
+ \prop_gset_eq:cc { l_@@_poles_ \@@_to_value:N #1 _prop }
+ { l_@@_poles_ \@@_to_value:N #2 _prop }
}
% \end{macrocode}
% \end{macro}
@@ -808,7 +818,10 @@
}
}
\cs_new_protected:Npn \@@_set_pole:Nnn #1#2#3
- { \prop_put:cnn { l_@@_poles_ \__int_value:w #1 _prop } {#2} {#3} }
+ {
+ \prop_put:cnn { l_@@_poles_ \@@_to_value:N #1 _prop }
+ {#2} {#3}
+ }
\cs_generate_variant:Nn \coffin_set_horizontal_pole:Nnn { c }
\cs_generate_variant:Nn \coffin_set_vertical_pole:Nnn { c }
\cs_generate_variant:Nn \@@_set_pole:Nnn { Nnx }
@@ -824,14 +837,24 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_update_corners:N #1
{
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } { tl }
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop }
+ { tl }
{ { 0pt } { \dim_eval:n { \box_ht:N #1 } } }
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } { tr }
- { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { \box_ht:N #1 } } }
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } { bl }
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop }
+ { tr }
+ {
+ { \dim_eval:n { \box_wd:N #1 } }
+ { \dim_eval:n { \box_ht:N #1 } }
+ }
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop }
+ { bl }
{ { 0pt } { \dim_eval:n { -\box_dp:N #1 } } }
- \prop_put:cnx { l_@@_corners_ \__int_value:w #1 _prop } { br }
- { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { -\box_dp:N #1 } } }
+ \prop_put:cnx { l_@@_corners_ \@@_to_value:N #1 _prop }
+ { br }
+ {
+ { \dim_eval:n { \box_wd:N #1 } }
+ { \dim_eval:n { -\box_dp:N #1 } }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -845,17 +868,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_update_poles:N #1
{
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } { hc }
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _prop } { hc }
{
{ \dim_eval:n { 0.5 \box_wd:N #1 } }
{ 0pt } { 0pt } { 1000pt }
}
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } { r }
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _prop } { r }
{
{ \dim_eval:n { \box_wd:N #1 } }
{ 0pt } { 0pt } { 1000pt }
}
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } { vc }
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _prop } { vc }
{
{ 0pt }
{ \dim_eval:n { ( \box_ht:N #1 - \box_dp:N #1 ) / 2 } }
@@ -862,7 +885,7 @@
{ 1000pt }
{ 0pt }
}
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } { t }
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _prop } { t }
{
{ 0pt }
{ \dim_eval:n { \box_ht:N #1 } }
@@ -869,7 +892,7 @@
{ 1000pt }
{ 0pt }
}
- \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } { b }
+ \prop_put:cnx { l_@@_poles_ \@@_to_value:N #1 _prop } { b }
{
{ 0pt }
{ \dim_eval:n { -\box_dp:N #1 } }
@@ -1028,13 +1051,18 @@
\fp_to_dim:n
{
(
- \dim_to_fp:n {#1} * \l_@@_slope_x_fp
- - ( \dim_to_fp:n {#5} * \l_@@_slope_y_fp )
+ \dim_to_fp:n {#1} *
+ \l_@@_slope_x_fp
+ - ( \dim_to_fp:n {#5} *
+ \l_@@_slope_y_fp )
- \dim_to_fp:n {#2}
+ \dim_to_fp:n {#6}
)
/
- ( \l_@@_slope_x_fp - \l_@@_slope_y_fp )
+ (
+ \l_@@_slope_x_fp -
+ \l_@@_slope_y_fp
+ )
}
}
\@@_calculate_intersection_aux:nnnnnN
@@ -1115,7 +1143,11 @@
% \begin{macrocode}
\@@_reset_structure:N \l_@@_aligned_coffin
\prop_clear:c
- { l_@@_corners_ \__int_value:w \l_@@_aligned_coffin _ prop }
+ {
+ l_@@_corners_
+ \@@_to_value:N \l_@@_aligned_coffin
+ _prop
+ }
\@@_update_poles:N \l_@@_aligned_coffin
% \end{macrocode}
% The structures of the parent coffins are now transferred to the new
@@ -1165,8 +1197,11 @@
\box_set_wd:Nn \l_@@_aligned_coffin { \box_wd:N #1 }
\@@_reset_structure:N \l_@@_aligned_coffin
\prop_set_eq:cc
- { l_@@_corners_ \__int_value:w \l_@@_aligned_coffin _prop }
- { l_@@_corners_ \__int_value:w #1 _prop }
+ {
+ l_@@_corners_
+ \@@_to_value:N \l_@@_aligned_coffin _prop
+ }
+ { l_@@_corners_ \@@_to_value:N #1 _prop }
\@@_update_poles:N \l_@@_aligned_coffin
\@@_offset_poles:Nnn #1 { 0pt } { 0pt }
\@@_offset_poles:Nnn #4
@@ -1235,7 +1270,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_offset_poles:Nnn #1#2#3
{
- \prop_map_inline:cn { l_@@_poles_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_poles_ \@@_to_value:N #1 _prop }
{ \@@_offset_pole:Nnnnnnn #1 {##1} ##2 {#2} {#3} }
}
\cs_new_protected:Npn \@@_offset_pole:Nnnnnnn #1#2#3#4#5#6#7#8
@@ -1264,13 +1299,16 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_offset_corners:Nnn #1#2#3
{
- \prop_map_inline:cn { l_@@_corners_ \__int_value:w #1 _prop }
+ \prop_map_inline:cn { l_@@_corners_ \@@_to_value:N #1 _prop }
{ \@@_offset_corner:Nnnnn #1 {##1} ##2 {#2} {#3} }
}
\cs_new_protected:Npn \@@_offset_corner:Nnnnn #1#2#3#4#5#6
{
\prop_put:cnx
- { l_@@_corners_ \__int_value:w \l_@@_aligned_coffin _prop }
+ {
+ l_@@_corners_
+ \@@_to_value:N \l_@@_aligned_coffin _prop
+ }
{ #1 - #2 }
{
{ \dim_eval:n { #3 + #5 } }
@@ -1538,7 +1576,7 @@
%</package>
}
\prop_set_eq:Nc \l_@@_display_poles_prop
- { l_@@_poles_ \__int_value:w #1 _prop }
+ { l_@@_poles_ \@@_to_value:N #1 _prop }
\@@_get_pole:NnN #1 { H } \l_@@_pole_a_tl
\@@_get_pole:NnN #1 { T } \l_@@_pole_b_tl
\tl_if_eq:NNT \l_@@_pole_a_tl \l_@@_pole_b_tl
@@ -1682,7 +1720,7 @@
}
{
\prop_map_function:cN
- { l_@@_poles_ \int_eval:n {#2} _prop }
+ { l_@@_poles_ \@@_to_value:N #2 _prop }
\msg_show_item_unbraced:nn
}
{ }
@@ -1697,10 +1735,9 @@
\__kernel_msg_new:nnnn { kernel } { no-pole-intersection }
{ No~intersection~between~coffin~poles. }
{
- \c__msg_coding_error_text_tl
LaTeX~was~asked~to~find~the~intersection~between~two~poles,~
but~they~do~not~have~a~unique~meeting~point:~
- the~value~(0~pt,~0~pt)~will~be~used.
+ the~value~(0pt,~0pt)~will~be~used.
}
\__kernel_msg_new:nnnn { kernel } { unknown-coffin }
{ Unknown~coffin~'#1'. }
@@ -1708,7 +1745,6 @@
\__kernel_msg_new:nnnn { kernel } { unknown-coffin-pole }
{ Pole~'#1'~unknown~for~coffin~'#2'. }
{
- \c__msg_coding_error_text_tl
LaTeX~was~asked~to~find~a~typesetting~pole~for~a~coffin,~
but~either~the~coffin~does~not~exist~or~the~pole~name~is~wrong.
}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -76,9 +76,21 @@
% \cs{color_group_begin:} \ldots \cs{color_group_end:} group.
% \end{function}
%
-% \subsection{Internal functions}
+% \end{documentation}
%
-% \begin{variable}[added = 2017-06-15, updated = 2017-10-02]
+% \begin{implementation}
+%
+% \section{\pkg{l3color-base} Implementation}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=color>
+% \end{macrocode}
+%
+% \begin{variable}
% {\l_@@_current_tl}
% The color currently active for foreground (text, \emph{etc.}) material.
% This is stored in the form of a color model followed by one or more
@@ -109,20 +121,6 @@
% \end{texnote}
% \end{variable}
%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3color-base} Implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=color>
-% \end{macrocode}
-%
% \begin{macro}{\color_group_begin:, \color_group_end:}
% Grouping for color is almost the same as using the basic \cs{group_begin:}
% and \cs{group_end:} functions. However, in vertical mode the end-of-group
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -66,12 +66,12 @@
%<@@=deprecation>
% \end{macrocode}
%
-% \begin{macro}{\@@_error:Nnn}
+% \begin{macro}{\__kernel_deprecation_error:Nnn}
% The \tn{outer} definition here ensures the command cannot appear
% in an argument. Use this auxiliary on all commands that have been
% removed since 2015.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_error:Nnn #1#2#3
+\cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
{
\etex_protected:D \tex_outer:D \tex_edef:D #1
{
@@ -83,47 +83,86 @@
{ \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
}
}
-\@@_error:Nnn \file_if_exist_input:nT { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
-\@@_error:Nnn \file_if_exist_input:nTF { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
-\@@_error:Nnn \c_job_name_tl { \c_sys_jobname_str } { 2017-01-01 }
-\@@_error:Nnn \dim_case:nnn { \dim_case:nnF } { 2015-07-14 }
-\@@_error:Nnn \int_case:nnn { \int_case:nnF } { 2015-07-14 }
-\@@_error:Nnn \int_from_binary:n { \int_from_bin:n } { 2016-01-05 }
-\@@_error:Nnn \int_from_hexadecimal:n { \int_from_hex:n } { 2016-01-05 }
-\@@_error:Nnn \int_from_octal:n { \int_from_oct:n } { 2016-01-05 }
-\@@_error:Nnn \int_to_binary:n { \int_to_bin:n } { 2016-01-05 }
-\@@_error:Nnn \int_to_hexadecimal:n { \int_to_hex:n } { 2016-01-05 }
-\@@_error:Nnn \int_to_octal:n { \int_to_oct:n } { 2016-01-05 }
-\@@_error:Nnn \ior_get_str:NN { \ior_str_get:NN } { 2018-03-05 }
-\@@_error:Nnn \luatex_if_engine_p: { \sys_if_engine_luatex_p: } { 2017-01-01 }
-\@@_error:Nnn \luatex_if_engine:F { \sys_if_engine_luatex:F } { 2017-01-01 }
-\@@_error:Nnn \luatex_if_engine:T { \sys_if_engine_luatex:T } { 2017-01-01 }
-\@@_error:Nnn \luatex_if_engine:TF { \sys_if_engine_luatex:TF } { 2017-01-01 }
-\@@_error:Nnn \pdftex_if_engine_p: { \sys_if_engine_pdftex_p: } { 2017-01-01 }
-\@@_error:Nnn \pdftex_if_engine:F { \sys_if_engine_pdftex:F } { 2017-01-01 }
-\@@_error:Nnn \pdftex_if_engine:T { \sys_if_engine_pdftex:T } { 2017-01-01 }
-\@@_error:Nnn \pdftex_if_engine:TF { \sys_if_engine_pdftex:TF } { 2017-01-01 }
-\@@_error:Nnn \prop_get:cn { \prop_item:cn } { 2016-01-05 }
-\@@_error:Nnn \prop_get:Nn { \prop_item:Nn } { 2016-01-05 }
-\@@_error:Nnn \quark_if_recursion_tail_break:N { } { 2015-07-14 }
-\@@_error:Nnn \quark_if_recursion_tail_break:n { }{ 2015-07-14 }
-\@@_error:Nnn \scan_align_safe_stop: { protected~commands } { 2017-01-01 }
-\@@_error:Nnn \str_case:nnn { \str_case:nnF } { 2015-07-14 }
-\@@_error:Nnn \str_case:onn { \str_case:onF } { 2015-07-14 }
-\@@_error:Nnn \str_case_x:nnn { \str_case_x:nnF } { 2015-07-14 }
-\@@_error:Nnn \tl_case:cnn { \tl_case:cnF } { 2015-07-14 }
-\@@_error:Nnn \tl_case:Nnn { \tl_case:NnF } { 2015-07-14 }
-\@@_error:Nnn \tl_to_lowercase:n { \tex_lowercase:D } { 2018-03-05 }
-\@@_error:Nnn \tl_to_uppercase:n { \tex_uppercase:D } { 2018-03-05 }
-\@@_error:Nnn \xetex_if_engine_p: { \sys_if_engine_xetex_p: } { 2017-01-01 }
-\@@_error:Nnn \xetex_if_engine:F { \sys_if_engine_xetex:F } { 2017-01-01 }
-\@@_error:Nnn \xetex_if_engine:T { \sys_if_engine_xetex:T } { 2017-01-01 }
-\@@_error:Nnn \xetex_if_engine:TF { \sys_if_engine_xetex:TF } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \file_if_exist_input:nT
+ { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
+\__kernel_deprecation_error:Nnn \file_if_exist_input:nTF
+ { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
+\__kernel_deprecation_error:Nnn \c_job_name_tl
+ { \c_sys_jobname_str } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \dim_case:nnn
+ { \dim_case:nnF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \int_case:nnn
+ { \int_case:nnF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \int_from_binary:n
+ { \int_from_bin:n } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \int_from_hexadecimal:n
+ { \int_from_hex:n } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \int_from_octal:n
+ { \int_from_oct:n } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \int_to_binary:n
+ { \int_to_bin:n } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \int_to_hexadecimal:n
+ { \int_to_hex:n } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \int_to_octal:n
+ { \int_to_oct:n } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \ior_get_str:NN
+ { \ior_str_get:NN } { 2018-03-05 }
+\__kernel_deprecation_error:Nnn \luatex_if_engine_p:
+ { \sys_if_engine_luatex_p: } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \luatex_if_engine:F
+ { \sys_if_engine_luatex:F } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \luatex_if_engine:T
+ { \sys_if_engine_luatex:T } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \luatex_if_engine:TF
+ { \sys_if_engine_luatex:TF } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \pdftex_if_engine_p:
+ { \sys_if_engine_pdftex_p: } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \pdftex_if_engine:F
+ { \sys_if_engine_pdftex:F } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \pdftex_if_engine:T
+ { \sys_if_engine_pdftex:T } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \pdftex_if_engine:TF
+ { \sys_if_engine_pdftex:TF } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \prop_get:cn
+ { \prop_item:cn } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \prop_get:Nn
+ { \prop_item:Nn } { 2016-01-05 }
+\__kernel_deprecation_error:Nnn \quark_if_recursion_tail_break:N
+ { } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \quark_if_recursion_tail_break:n
+ { } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \scan_align_safe_stop:
+ { protected~commands } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \str_case:nnn
+ { \str_case:nnF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \str_case:onn
+ { \str_case:onF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \str_case_x:nnn
+ { \str_case_x:nnF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \tl_case:cnn
+ { \tl_case:cnF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \tl_case:Nnn
+ { \tl_case:NnF } { 2015-07-14 }
+\__kernel_deprecation_error:Nnn \tl_to_lowercase:n
+ { \tex_lowercase:D } { 2018-03-05 }
+\__kernel_deprecation_error:Nnn \tl_to_uppercase:n
+ { \tex_uppercase:D } { 2018-03-05 }
+\__kernel_deprecation_error:Nnn \xetex_if_engine_p:
+ { \sys_if_engine_xetex_p: } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \xetex_if_engine:F
+ { \sys_if_engine_xetex:F } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \xetex_if_engine:T
+ { \sys_if_engine_xetex:T } { 2017-01-01 }
+\__kernel_deprecation_error:Nnn \xetex_if_engine:TF
+ { \sys_if_engine_xetex:TF } { 2017-01-01 }
% \end{macrocode}
% \end{macro}
%
-% This is left-over from \pkg{l3expan}. It cannot be done there because
-% \pkg{l3tl} is not loaded at that time.
+% \begin{macro}[deprecated = 2018-12-31]{\__cs_generate_variant_loop_warning:nnxxxx}
+% This is left-over from \pkg{l3expan}. It cannot be done there
+% because \pkg{l3tl} is not loaded at that time. Of course what's
+% deprecated is actually some combinations of variants; see
+% \pkg{l3expan}.
% \begin{macrocode}
\__kernel_deprecation_code:nn
{
@@ -135,6 +174,7 @@
{ \__kernel_msg_warning:nnxxxx }
}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
%</initex|package>
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -70,7 +70,7 @@
% This isn't included in the typeset documentation because it's a bit
% ugly:
%<*class>
-\ProvidesExplClass{l3doc}{2018/03/05}{}
+\ProvidesExplClass{l3doc}{2018-04-30}{}
{L3 Experimental documentation class}
%</class>
% \fi
@@ -77,7 +77,7 @@
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
% \maketitle
% \tableofcontents
%
@@ -564,7 +564,8 @@
% \begin{variable}{\l_@@_detect_internals_bool, \l_@@_detect_internals_tl}
% If \texttt{true}, \pkg{l3doc} will check for use of internal
% commands \cs[no-index]{__\meta{pkg}_\ldots{}} from other packages in
-% \texttt{macrocode} environments and in~\cs{cs}. Also a token list
+% the argument of the \texttt{macro} environment, and in the code typeset in
+% \texttt{macrocode} environments, but not in~\cs{cs}. Also a token list
% to store temporary data for this purpose.
% \begin{macrocode}
\bool_new:N \l_@@_detect_internals_bool
@@ -922,6 +923,7 @@
% \tl_if_head_eq_charcode:oNF,
% \tl_if_head_eq_meaning:VNF,
% \tl_if_in:noTF,
+% \tl_if_in:ooTF,
% \tl_if_in:NoTF,
% \tl_if_in:NoT,
% \tl_if_in:NoF,
@@ -1026,11 +1028,6 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_replace_at_at:N #1
{
- \bool_if:NT \l_@@_in_implementation_bool
- {
- \bool_if:NT \l_@@_detect_internals_bool
- { \@@_detect_internals:N #1 }
- }
\tl_if_empty:NF \g_@@_module_name_tl
{
\exp_args:NNo \@@_replace_at_at_aux:Nn
@@ -1051,7 +1048,12 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_detect_internals:N, \@@_if_detect_internals_ok:NF}
+% \begin{macro}
+% {
+% \@@_detect_internals:N,
+% \@@_detect_internals_aux:N,
+% \@@_if_detect_internals_ok:NF
+% }
% After splitting at each |__| and removing the leading item from the
% sequence (since it does not follow |__|), remove everything after
% any space or end-of-line to get a good approximation of the control
@@ -1062,9 +1064,14 @@
% remove anything after any |_| or |:| (with either catcode) to get a
% guess of the module name.
% \begin{macrocode}
+\cs_new_protected:Npn \@@_detect_internals:N #1
+ {
+ \bool_if:NT \l_@@_detect_internals_bool
+ { \@@_detect_internals_aux:N #1 }
+ }
\group_begin:
\char_set_catcode_active:N \^^M
- \cs_new_protected:Npn \@@_detect_internals:N #1
+ \cs_new_protected:Npn \@@_detect_internals_aux:N #1
{
\tl_set_eq:NN \l_@@_detect_internals_tl #1
\tl_replace_all:Non \l_@@_detect_internals_tl { \token_to_str:N _ } { _ }
@@ -1192,7 +1199,11 @@
%
% \begin{macro}[rEXP]{\@@_key_get_base:nN}
% Get the base form of a function and store it. As part of getting
-% the base form, change trailing |T| or |F| to |TF|.
+% the base form, change trailing |T| or |F| to |TF|, skipping that
+% change if the function contains no colon to avoid changing for
+% instance some names ending in \texttt{PDF} or similar. The various
+% letters |z| serve as end-delimiters different from any outcome of
+% \cs{tl_to_str:n}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_key_get_base:nN #1#2
{
@@ -1206,22 +1217,23 @@
}
\cs_new:Npx \@@_key_get_base_TF:nN #1#2
{
- \tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} \scan_stop: }
- \tl_if_in:NnTF #2 { \tl_to_str:n { F } \scan_stop: }
+ \tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
+ \tl_if_in:NoF #2 { \tl_to_str:n {:} }
+ { \exp_not:N \prg_break: }
+ \tl_if_in:onT { #2 z } { \tl_to_str:n {TF} z }
+ { \exp_not:N \prg_break: }
+ \tl_if_in:onT { #2 z } { \tl_to_str:n {T} z }
{
- \tl_if_in:NnF #2 { \tl_to_str:n { TF } \scan_stop: }
- {
- \tl_replace_once:Nnn #2
- { \tl_to_str:n { F } \scan_stop: }
- { \tl_to_str:n { TF } \scan_stop: }
- }
+ \tl_put_right:Nn #2 { \tl_to_str:n {F} }
+ \exp_not:N \prg_break:
}
+ \tl_if_in:onT { #2 z } { \tl_to_str:n {F} z }
{
- \tl_replace_once:Nnn #2
- { \tl_to_str:n { T } \scan_stop: }
- { \tl_to_str:n { TF } \scan_stop: }
+ \tl_put_right:Nn #2 { z }
+ \tl_replace_once:Nnn #2 { \tl_to_str:n {F} z } { \tl_to_str:n {TF} }
+ \exp_not:N \prg_break:
}
- \tl_remove_once:Nn #2 { \scan_stop: }
+ \exp_not:N \prg_break_point:
}
\cs_new:Npn \@@_base_form_aux:nnN #1#2#3
{
@@ -1654,6 +1666,7 @@
\providecommand*\upTeX{up\kern-.2em\hologo{TeX}}
\providecommand*\epTeX{$\varepsilon$-\pTeX}
\providecommand*\eupTeX{$\varepsilon$-\upTeX}
+\providecommand*\ConTeXt{\hologo{ConTeXt}}
% \end{macrocode}
% \end{macro}
%
@@ -2092,6 +2105,7 @@
\tl_remove_all:Nx \l_@@_tmpa_tl { \tl_to_str:n { ^ ^ A } }
\tl_remove_all:Nx \l_@@_tmpa_tl { \iow_char:N \^^I }
\tl_remove_all:Nx \l_@@_tmpa_tl { \iow_char:N \^^M }
+ \@@_detect_internals:N \l_@@_tmpa_tl
\@@_replace_at_at:N \l_@@_tmpa_tl
\exp_args:NNx \seq_set_from_clist:Nn #2
{ \tl_to_str:N \l_@@_tmpa_tl }
@@ -3680,6 +3694,7 @@
{ \@@_xmacro_code:w #1 \q_stop }
{
\tl_set:Nn \l_@@_tmpa_tl {#1}
+ \@@_detect_internals:N \l_@@_tmpa_tl
\@@_replace_at_at:N \l_@@_tmpa_tl
\tl_use:N \l_@@_tmpa_tl
}
@@ -3687,6 +3702,7 @@
\cs_new_protected:Npn \@@_xmacro_code:w #1 < @ @ = #2 > #3 \q_stop
{
\tl_set:Nn \l_@@_tmpa_tl {#1}
+ \@@_detect_internals:N \l_@@_tmpa_tl
\@@_replace_at_at:N \l_@@_tmpa_tl
\tl_gset:Nn \g_@@_module_name_tl {#2}
@@ -3693,6 +3709,7 @@
\tl_put_right:Nn \l_@@_tmpa_tl { < @ @ = #2 > }
\tl_set:Nn \l_@@_tmpb_tl {#3}
+ \@@_detect_internals:N \l_@@_tmpb_tl
\@@_replace_at_at:N \l_@@_tmpb_tl
\tl_put_right:No \l_@@_tmpa_tl { \l_@@_tmpb_tl }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -61,7 +61,7 @@
% conjugation with \pdfTeX{} or \LuaTeX{} in DVI mode.
% \item \texttt{dvisvgm}: The \texttt{dvisvgm} program, which works in
% conjugation with \pdfTeX{} or \LuaTeX{} when run in DVI mode as well
-% as with (u)p\TeX{} and \XeTeX{}.
+% as with (u)\pTeX{} and \XeTeX{}.
% \item \texttt{xdvipdfmx}: The driver used by \XeTeX{}.
% \end{itemize}
%
@@ -97,12 +97,14 @@
%
% \section{Box rotation and scaling}
%
-% \begin{function}[added = 2017-12-13]{\driver_box_use_rotate:Nn}
+% \begin{function}[added = 2017-12-13, updated = 2018-04-26]
+% {\driver_box_use_rotate:Nn}
% \begin{syntax}
% \cs{driver_box_use_rotate:Nn} \meta{box} \Arg{angle}
% \end{syntax}
% Inserts the content of the \meta{box} at the current insertion point
-% rotated by the \meta{angle} (expressed in degrees). The material is
+% rotated by the \meta{angle} (an \meta{fp expression} expressed in degrees).
+% The material is
% rotated such the the \TeX{} reference point of the box is the center of
% rotation and remains the reference point after rotation. It is the
% responsibility of the code using this function to adjust the apparent
@@ -109,12 +111,14 @@
% size of the inserted material.
% \end{function}
%
-% \begin{function}[added = 2017-12-13]{\driver_box_use_scale:Nnn}
+% \begin{function}[added = 2017-12-13, updated = 2018-04-26]
+% {\driver_box_use_scale:Nnn}
% \begin{syntax}
% \cs{driver_box_use_scale:Nnn} \meta{box} \Arg{x-scale} \Arg{y-scale}
% \end{syntax}
% Inserts the content of the \meta{box} at the current insertion point
-% scale by the \meta{x-scale} and \meta{y-scale}. The reference point
+% scale by the \meta{x-scale} and \meta{y-scale} (both \meta{fp expressions}).
+% The reference point
% of the material will be unchanged. It is the responsibility of the
% code using this function to adjust the apparent size of the inserted
% material.
@@ -263,7 +267,7 @@
% \meta{path construction}
% \cs{driver_draw_stroke:}
% \end{syntax}
-% Draws a line along the current path, which is also closed by
+% Draws a line along the current path, which is also closed in the case of
% \cs{driver_draw_closestroke:}. The nature of the line drawn
% is influenced by settings for
% \begin{itemize}
@@ -334,7 +338,7 @@
% Sets the width to be used for stroking to \meta{dimexpr}.
% \end{function}
%
-% \begin{function}{\driver_draw_cap_dash:nn}
+% \begin{function}{\driver_draw_dash_pattern:nn}
% \begin{syntax}
% \cs{driver_draw_dash:nn} \Arg{dash pattern} \Arg{phase}
% \end{syntax}
@@ -381,10 +385,11 @@
%
% \begin{function}{\driver_draw_miterlimit:n}
% \begin{syntax}
-% \cs{driver_draw_miterlimit:n} \Arg{dimexpr}
+% \cs{driver_draw_miterlimit:n} \Arg{factor}
% \end{syntax}
% Sets the miter limit of lines joined as a miter, as described in the
-% PDF and PostScript manuals.
+% PDF and PostScript manuals. The \meta{factor} here is an
+% \meta{fp expression}.
% \end{function}
%
% \subsection{Color}
@@ -476,23 +481,23 @@
%<*package>
\ProvidesExplFile
%<*dvipdfmx>
- {l3dvidpfmx.def}{2017/03/18}{}
+ {l3dvidpfmx.def}{2018-04-30}{}
{L3 Experimental driver: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3dvips.def}{2017/03/18}{}
+ {l3dvips.def}{2018-04-30}{}
{L3 Experimental driver: dvips}
%</dvips>
%<*dvisvgm>
- {l3dvisvgm.def}{2017/03/18}{}
+ {l3dvisvgm.def}{2018-04-30}{}
{L3 Experimental driver: dvisvgm}
%</dvisvgm>
%<*pdfmode>
- {l3pdfmode.def}{2017/03/18}{}
+ {l3pdfmode.def}{2018-04-30}{}
{L3 Experimental driver: PDF mode}
%</pdfmode>
%<*xdvipdfmx>
- {l3xdvidpfmx.def}{2017/03/18}{}
+ {l3xdvidpfmx.def}{2018-04-30}{}
{L3 Experimental driver: xdvipdfmx}
%</xdvipdfmx>
%</package>
@@ -509,6 +514,18 @@
% takes most of the same code.
% \end{itemize}
%
+% \begin{macro}{\@@_literal_x:n, \@@_literal:n, \@@_literal:x}
+% The one shared function for all drivers is access to the basic
+% \tn{special} primitive: it has slightly odd expansion behaviour
+% so a wrapper is provided.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_literal_x:n \tex_special:D
+\cs_new_protected:Npn \@@_literal:n #1
+ { \@@_literal_x:n { \exp_not:n {#1} } }
+\cs_generate_variant:Nn \@@_literal:n { x }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Color support}
%
% Color support is split into two parts: a \enquote{general} concept and
@@ -547,7 +564,10 @@
\exp_after:wN \use:n \current at color \c_space_tl 1
}
}
- { \exp_after:wN \@@_color_pickup:w \current at color \q_stop #1 }
+ {
+ \exp_after:wN \@@_color_pickup:w
+ \current at color \q_stop #1
+ }
}
\cs_new_protected:Npn \@@_color_pickup:w #1 ~ #2 \q_stop #3
{ \tl_set:Nn #3 { #1 ~ #2 } }
@@ -563,29 +583,40 @@
% \begin{macro}{\driver_color_gray:n}
% \begin{macro}{\driver_color_rgb:nnn}
% \begin{macro}{\driver_color_spot:nn}
-% \begin{macro}{\@@_color_select:n}
+% \begin{macro}{\@@_color_select:n, \@@_color_select:x}
% \begin{macro}{\@@_color_reset:}
% Push the data to the stack. In the case of \texttt{dvips} also reset the
% drawing fill color in raw PostScript.
% \begin{macrocode}
\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
- { \@@_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } }
+ {
+ \@@_color_select:x
+ {
+ cmyk~
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4}
+ }
+ }
\cs_new_protected:Npn \driver_color_gray:n #1
- { \@@_color_select:n { gray~ #1 } }
+ { \@@_color_select:x { gray~ \fp_eval:n {#1} } }
\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
- { \@@_color_select:n { rgb~ #1 ~ #2 ~ #3 } }
+ {
+ \@@_color_select:x
+ { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
+ }
\cs_new_protected:Npn \driver_color_spot:nn #1#2
{ \@@_color_select:n { \c_space_tl #1 } }
\cs_new_protected:Npn \@@_color_select:n #1
{
- \tex_special:D { color~push~ #1 }
+ \@@_literal:n { color~push~ #1 }
%<*dvips>
- \tex_special:D { ps::/l3fc~{ }~def }
+ \@@_literal_postscript:n { /l3fc~{ }~def }
%</dvips>
\group_insert_after:N \@@_color_reset:
}
+\cs_generate_variant:Nn \@@_color_select:n { x }
\cs_new_protected:Npn \@@_color_reset:
- { \tex_special:D { color~pop } }
+ { \@@_literal:n { color~pop } }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -663,19 +694,45 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\driver_color_cmyk:nnnn}
-% \begin{macro}{\driver_color_gray:n}
-% \begin{macro}{\driver_color_rgb:nnn}
+% \begin{macro}{\driver_color_cmyk:nnnn, \@@_color_cmyk:nnnn}
+% \begin{macro}{\driver_color_gray:n, @@_color_gray:n}
+% \begin{macro}{\driver_color_rgb:nnn, \@@_color_rgb:nnn}
% \begin{macro}{\driver_color_spot:nn}
-% \begin{macro}{\@@_color_select:n}
+% \begin{macro}{\@@_color_select:n, \@@_color_select:x}
% \begin{macro}{\@@_color_reset:}
% Simply dump the data, but allowing for \LuaTeX{}.
% \begin{macrocode}
\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
- { \@@_color_select:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } }
+ {
+ \use:x
+ {
+ \@@_color_cmyk:nnnn
+ { \fp_eval:n {#1} }
+ { \fp_eval:n {#2} }
+ { \fp_eval:n {#3} }
+ { \fp_eval:n {#4} }
+ }
+ }
+\cs_new_protected:Npn \@@_color_cmyk:nnnn #1#2#3#4
+ {
+ \@@_color_select:n
+ { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
+ }
\cs_new_protected:Npn \driver_color_gray:n #1
+ { \exp_args:Nx \@@_color_gray:n { \fp_eval:n {#1} } }
+\cs_new_protected:Npn \@@_color_gray:n #1
{ \@@_color_select:n { #1 ~ g ~ #1 ~ G } }
\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+ {
+ \use:x
+ {
+ \@@_color_rgb:nnn
+ { \fp_eval:n {#1} }
+ { \fp_eval:n {#2} }
+ { \fp_eval:n {#3} }
+ }
+ }
+\cs_new_protected:Npn \@@_color_rgb:nnn #1#2#3
{ \@@_color_select:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } }
\cs_new_protected:Npn \driver_color_spot:nn #1#2
{ \@@_color_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } }
@@ -687,6 +744,7 @@
\exp_not:N \l_@@_color_stack_int push {#1}
\group_insert_after:N \exp_not:N \@@_color_reset:
}
+\cs_generate_variant:Nn \@@_color_select:n { x }
\cs_new_protected:Npx \@@_color_reset:
{
\cs_if_exist:NTF \luatex_pdfextension:D
@@ -714,80 +772,83 @@
%
% \subsubsection{Basics}
%
-% \begin{macro}{\@@_literal:n}
-% In the case of \texttt{dvips} there is no build-in saving of the current
+% \begin{macro}{\@@_literal_postscript:n, \@@_literal_postscript:x}
+% Literal PostScript can be included using a few low-level formats. Here,
+% we use the form with no positioning: this is overall more convenient as
+% a wrapper. Note that this does require that where position is important,
+% an appropriate wrapper is included.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_literal_postscript:n #1
+ { \@@_literal:n { ps:: #1 } }
+\cs_generate_variant:Nn \@@_literal_postscript:n { x }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_align_currentpoint_begin:, \@@_align_currentpoint_end:}
+% In \texttt{dvips} there is no build-in saving of the current
% position, and so some additional PostScript is required to set up the
% transformation matrix and also to restore it afterwards. Notice the use
% of the stack to save the current position \enquote{up front} and to
-% move back to it at the end of the process.
+% move back to it at the end of the process. Notice that the |[begin]|/^^A
+% |[end]| pair here mean that we can use a run of PostScript statements
+% in separate lines: not \emph{required} but does make the code and
+% output more clear.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_literal:n #1
+\cs_new_protected:Npn \@@_align_currentpoint_begin:
{
- \tex_special:D
- {
- ps:
- currentpoint~
- currentpoint~translate~
- #1 ~
- neg~exch~neg~exch~translate
- }
+ \@@_literal:n { ps::[begin] }
+ \@@_literal_postscript:n { currentpoint }
+ \@@_literal_postscript:n { currentpoint~translate }
}
+\cs_new_protected:Npn \@@_align_currentpoint_end:
+ {
+ \@@_literal_postscript:n { neg~exch~neg~exch~translate }
+ \@@_literal:n { ps::[end] }
+ }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_scope_begin:, \@@_scope_end:}
-% Scope saving/restoring is done directly with no need to worry about the
-% transformation matrix. General scoping is only for the graphics stack so
-% the lower-cost |gsave|/|grestore| pair are used.
+% Saving/restoring scope for general operations needs to be done with
+% \texttt{dvips} positioning (try without to see this!). Thus we need the
+% |ps:| version of the special here. As only the graphics state is ever
+% altered within this pairing, we use the lower-cost |g|-versions.
% \begin{macrocode}
\cs_new_protected:Npn \@@_scope_begin:
- { \tex_special:D { ps:gsave } }
+ { \@@_literal:n { ps:gsave } }
\cs_new_protected:Npn \@@_scope_end:
- { \tex_special:D { ps:grestore } }
+ { \@@_literal:n { ps:grestore } }
% \end{macrocode}
% \end{macro}
%
-% \subsection{Driver-specific auxiliaries}
-%
-% \begin{macro}[EXP]{\@@_absolute_lengths:n}
-% The \texttt{dvips} driver scales all absolute dimensions based
-% on the output resolution selected and any \TeX{} magnification. Thus
-% for any operation involving absolute lengths there is a correction to
-% make. This is based on \texttt{normalscale} from \texttt{special.pro}
-% but using the stack rather than a definition to save the current matrix.
-% \begin{macrocode}
-\cs_new:Npn \@@_absolute_lengths:n #1
- {
- matrix~currentmatrix~
- Resolution~72~div~VResolution~72~div~scale~
- DVImag~dup~scale~
- #1 ~
- setmatrix
- }
-% \end{macrocode}
-% \end{macro}
-%
% \subsubsection{Box operations}
%
% \begin{macro}{\driver_box_use_clip:N}
-% Much the same idea as for the PDF mode version but with a slightly
-% different syntax for creating the clip path. To avoid any scaling
-% issues we need the absolute length auxiliary here.
+% The \texttt{dvips} driver scales all absolute dimensions based on the
+% output resolution selected and any \TeX{} magnification. Thus for any
+% operation involving absolute lengths there is a correction to make. See
+% \texttt{normalscale} from \texttt{special.pro} for the variables, noting
+% that here everything is saved on the stack rather than as a separate
+% variable. Once all of that is done, the actual clipping is trivial.
% \begin{macrocode}
\cs_new_protected:Npn \driver_box_use_clip:N #1
{
\@@_scope_begin:
- \@@_literal:n
+ \@@_align_currentpoint_begin:
+ \@@_literal_postscript:n { matrix~currentmatrix }
+ \@@_literal_postscript:n
+ { Resolution~72~div~VResolution~72~div~scale }
+ \@@_literal_postscript:n { DVImag~dup~scale }
+ \@@_literal_postscript:x
{
- \@@_absolute_lengths:n
- {
- 0 ~
- \dim_to_decimal_in_bp:n { \box_dp:N #1 } ~
- \dim_to_decimal_in_bp:n { \box_wd:N #1 } ~
- \dim_to_decimal_in_bp:n { -\box_ht:N #1 - \box_dp:N #1 } ~
- rectclip
- }
+ 0 ~
+ \dim_to_decimal_in_bp:n { \box_dp:N #1 } ~
+ \dim_to_decimal_in_bp:n { \box_wd:N #1 } ~
+ \dim_to_decimal_in_bp:n { -\box_ht:N #1 - \box_dp:N #1 } ~
+ rectclip
}
+ \@@_literal_postscript:n { setmatrix }
+ \@@_align_currentpoint_end:
\hbox_overlap_right:n { \box_use:N #1 }
\@@_scope_end:
\skip_horizontal:n { \box_wd:N #1 }
@@ -796,25 +857,31 @@
% \end{macro}
%
% \begin{macro}{\driver_box_use_rotate:Nn}
+% \begin{macro}{\@@_box_use_rotate:Nn}
% Rotating using \texttt{dvips} does not require that the box dimensions
% are altered and has a very convenient built-in operation. Zero rotation
% must be written as |0| not |-0| so there is a quick test.
% \begin{macrocode}
\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
+ { \exp_args:NNf \@@_box_use_rotate:Nn #1 { \fp_eval:n {#2} } }
+\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
{
\@@_scope_begin:
- \@@_literal:n
+ \@@_align_currentpoint_begin:
+ \@@_literal_postscript:x
{
\fp_compare:nNnTF {#2} = \c_zero_fp
{ 0 }
- { \fp_eval:n { round ( -#2 , 5 ) } } ~
+ { \fp_eval:n { round ( -(#2) , 5 ) } } ~
rotate
}
+ \@@_align_currentpoint_end:
\box_use:N #1
\@@_scope_end:
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\driver_box_use_scale:Nnn}
% The \texttt{dvips} driver once again has a dedicated operation we can
@@ -823,12 +890,14 @@
\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
{
\@@_scope_begin:
- \@@_literal:n
+ \@@_align_currentpoint_begin:
+ \@@_literal_postscript:x
{
\fp_eval:n { round ( #2 , 5 ) } ~
\fp_eval:n { round ( #3 , 5 ) } ~
scale
}
+ \@@_align_currentpoint_end:
\hbox_overlap_right:n { \box_use:N #1 }
\@@_scope_end:
}
@@ -849,9 +918,7 @@
% sizes here.
% \begin{macrocode}
\cs_new_protected:Npn \@@_image_include_eps:n #1
- {
- \tex_special:D { PSfile = #1 }
- }
+ { \@@_literal:n { PSfile = #1 } }
% \end{macrocode}
% \end{macro}
%
@@ -858,12 +925,10 @@
% \subsection{Drawing}
%
% \begin{macro}{\@@_draw_literal:n, \@@_draw_literal:x}
-% Literals with no positioning (using |ps:| each one is positioned but
-% cut off from everything else, so no good for the stepwise approach needed
-% here).
+% The same as literal PostScript: same arguments about positioning apply
+% her.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_literal:n #1
- { \tex_special:D { ps:: #1 } }
+\cs_new_eq:NN \@@_draw_literal:n \@@_literal_postscript:n
\cs_generate_variant:Nn \@@_draw_literal:n { x }
% \end{macrocode}
% \end{macro}
@@ -873,14 +938,18 @@
% continue on to a matching |ps::[end]|: contrast with |ps:|, which positions
% but where we can't split material between separate calls. The
% |@beginspecial|/|@endspecial| pair are from |special.pro| and correct the
-% scale and $y$-axis direction. The reference point at the start of the box
-% is saved (as |l3x|/|l3y|) as it is needed when inserting various items.
+% scale and $y$-axis direction. The definition of |/l3fc| deals with fill
+% color in paths. In contrast to \pkg{pgf}, we don't save the current point:
+% discussion with Tom Rokici suggested a better way to handle the necessary
+% translations (see \cs{driver_draw_box_use:Nnnnn}). (Note that
+% |@beginspecial|/|@endspecial| forms a driver scope.) The |[begin]|/^^A
+% |[end]| lines are handled differently from the rest as they are
+% conceptually different: not really drawing literals but instructions to
+% \texttt{dvips} itself.
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_begin:
{
- \@@_draw_literal:n { [begin] }
- \@@_draw_literal:n { save }
- \@@_draw_literal:n { /l3x~currentpoint~/l3y~exch~def~def }
+ \@@_literal:n { ps::[begin] }
\@@_draw_literal:n { @beginspecial }
\@@_draw_literal:n { /l3fc~{ }~def }
}
@@ -887,8 +956,7 @@
\cs_new_protected:Npn \driver_draw_end:
{
\@@_draw_literal:n { @endspecial }
- \@@_draw_literal:n { restore }
- \@@_draw_literal:n { [end] }
+ \@@_literal:n { ps::[end] }
}
% \end{macrocode}
% \end{macro}
@@ -917,12 +985,18 @@
\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
{
\@@_draw_literal:x
- { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ moveto }
+ {
+ \dim_to_decimal_in_bp:n {#1} ~
+ \dim_to_decimal_in_bp:n {#2} ~ moveto
+ }
}
\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
{
\@@_draw_literal:x
- { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ lineto }
+ {
+ \dim_to_decimal_in_bp:n {#1} ~
+ \dim_to_decimal_in_bp:n {#2} ~ lineto
+ }
}
\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
{
@@ -984,7 +1058,7 @@
{ \@@_draw_literal:n { closepath } }
\cs_new_protected:Npn \driver_draw_stroke:
{
- \@@_draw_literal:n { stroke }
+ \@@_draw_literal:n { stroke }
\bool_if:NT \g_@@_draw_clip_bool
{
\@@_draw_literal:x
@@ -1064,7 +1138,7 @@
% \end{variable}
% \end{macro}
%
-% \begin{macro}{\driver_draw_cap_dash:nn}
+% \begin{macro}{\driver_draw_dash_pattern:nn}
% \begin{macro}{\@@_draw_dash:n}
% \begin{macro}{\driver_draw_linewidth:n}
% \begin{macro}{\driver_draw_miterlimit:n}
@@ -1076,18 +1150,19 @@
% Converting paths to output is again a case of mapping directly to
% PostScript operations.
% \begin{macrocode}
-\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_dash_pattern:nn #1#2
{
\@@_draw_literal:x
{
- [ ~
- \clist_map_function:nN {#1} \@@_draw_dash:n
+ [
+ \exp_args:Nf \use:n
+ { \clist_map_function:nN {#1} \@@_draw_dash:n }
] ~
\dim_to_decimal_in_bp:n {#2} ~ setdash
}
}
\cs_new:Npn \@@_draw_dash:n #1
- { \dim_to_decimal_in_bp:n {#1} ~ }
+ { ~ \dim_to_decimal_in_bp:n {#1} }
\cs_new_protected:Npn \driver_draw_linewidth:n #1
{
\@@_draw_literal:x
@@ -1094,7 +1169,7 @@
{ \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
}
\cs_new_protected:Npn \driver_draw_miterlimit:n #1
- { \@@_draw_literal:n { #1 ~ setmiterlimit } }
+ { \@@_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
\cs_new_protected:Npn \driver_draw_cap_butt:
{ \@@_draw_literal:n { 0 ~ setlinecap } }
\cs_new_protected:Npn \driver_draw_cap_round:
@@ -1114,7 +1189,6 @@
% \end{macro}
% \end{macro}
%
-%
% \begin{macro}
% {
% \driver_draw_color_fill_cmyk:nnnn ,
@@ -1130,7 +1204,11 @@
% \driver_draw_color_fill_rgb:nnn ,
% \driver_draw_color_stroke_rgb:nnn
% }
-% \begin{macro}{\@@_draw_color_fill:n, \@@_draw_color_stroke:n}
+% \begin{macro}
+% {
+% \@@_draw_color_fill:n, \@@_draw_color_fill:x,
+% \@@_draw_color_stroke:n, \@@_draw_color_stroke:x
+% }
% For \texttt{dvips}, we can use the standard color stack to deal with
% stroke color, but for fills have to switch to raw PostScript. This is
% thus not handled by the stack, but the context is very restricted. See
@@ -1137,24 +1215,46 @@
% also how fills are implemented.
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_color_fill_cmyk:nnnn #1#2#3#4
- { \@@_draw_fill:n { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor } }
+ {
+ \@@_draw_color_fill:x
+ {
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+ setcmykcolor
+ }
+ }
\cs_new_protected:Npn \driver_draw_color_stroke_cmyk:nnnn #1#2#3#4
- { \@@_draw_stroke:n { cmyk ~ #1 ~ #2 ~ #3 ~ #4 } }
+ {
+ \@@_draw_color_stroke:x
+ {
+ cmyk ~
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4}
+ }
+ }
\cs_new_protected:Npn \driver_draw_color_fill_gray:n #1
- { \@@_draw_fill:n { #1 ~ setgray } }
+ { \@@_draw_color_fill:x { \fp_eval:n {#1} ~ setgray } }
\cs_new_protected:Npn \driver_draw_color_stroke_gray:n #1
- { \@@_draw_stroke:n { gray ~ #1 } }
+ { \@@_draw_color_stroke:x { gray ~ \fp_eval:n {#1} } }
\cs_new_protected:Npn \driver_draw_color_fill_rgb:nnn #1#2#3
- { \@@_draw_fill:n { #1 ~ #2 ~ #3 ~ setrgbcolor } }
+ {
+ \@@_draw_color_fill:x
+ { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ setrgbcolor }
+ }
\cs_new_protected:Npn \driver_draw_color_stroke_rgb:nnn #1#2#3
- { \@@_draw_stroke:n { rgb ~ #1 ~ #2 ~ #3 } }
+ {
+ \@@_draw_color_stroke:x
+ { rgb ~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
+ }
\cs_new_protected:Npn \@@_draw_color_fill:n #1
{ \@@_draw_literal:n { /l3fc ~ { #1 } ~ def } }
+\cs_generate_variant:Nn \@@_draw_color_fill:n { x }
\cs_new_protected:Npn \@@_draw_color_stroke:n #1
{
- \tex_special:D { color~push~#1 }
+ \@@_literal:n { color~push~#1 }
\group_insert_after:N \@@_color_reset:
}
+\cs_generate_variant:Nn \@@_draw_color_stroke:n { x }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1169,7 +1269,17 @@
% path available and simply dump the matrix as given.
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_cm:nnnn #1#2#3#4
- { \@@_draw_literal:n { [#1 ~ #2 ~ #3 ~ #4 ~ 0 ~ 0 ] ~ concat } }
+ {
+ \@@_draw_literal:n
+ {
+ [
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+ 0 ~ 0
+ ] ~
+ concat
+ }
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1176,24 +1286,38 @@
% \begin{macro}{\driver_draw_box_use:Nnnnn}
% Inside a picture |@beginspecial|/|@endspecial| are active, which is
% normally a good thing but means that the position and scaling would be off
-% if the box was inserted directly. Instead, we need to reverse the effect of
-% the (normally desirable) shift/scaling within the box. That requires
-% knowing where the reference point for the drawing is: saved as |l3x|/|l3y|
-% at the start of the picture. Transformation here is relative to the
-% drawing origin so has to be done purely in driver code not using \TeX{}
-% offsets.
+% if the box was inserted directly. To deal with that, there are a number of
+% possible approaches. The implementation here was suggested by Tom Rokici
+% (author of \texttt{dvips}). We end the current special placement, then
+% set the current point with a literal |[begin]|. As for general
+% literals, we then use the stack to store the current point and move to
+% it. To insert the required transformation, we have to flip the $y$-axis,
+% once before and once after it. Then we get back to the \TeX{} reference
+% point to insert our content. The clean up has to happen in the right
+% places, hence the |[begin]|/|[end]| pair around |restore|. Finally,
+% we can return to \enquote{normal} drawing mode. Notice that the set up
+% here is very similar to that in \cs{@@_align_currentpoint_\ldots}, but
+% the ordering of saving and restoring is different (intermixed).
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_box_use:Nnnnn #1#2#3#4#5
{
- \@@_scope_begin:
+ \@@_draw_literal:n { @endspecial }
\@@_draw_literal:n { [end] }
+ \@@_draw_literal:n { [begin] }
+ \@@_draw_literal:n { save }
+ \@@_draw_literal:n { currentpoint }
+ \@@_draw_literal:n { currentpoint~translate }
+ \driver_draw_cm:nnnn { 1 } { 0 } { 0 } { -1 }
\driver_draw_cm:nnnn {#2} {#3} {#4} {#5}
- \@@_draw_literal:n { 72~Resolution~div~72~VResolution~div~neg~scale }
- \@@_draw_literal:n { magscale~{1~DVImag~div~dup~scale}~if }
- \@@_draw_literal:n { l3x~neg~l3y~neg~translate }
+ \driver_draw_cm:nnnn { 1 } { 0 } { 0 } { -1 }
+ \@@_draw_literal:n { neg~exch~neg~exch~translate }
+ \@@_draw_literal:n { [end] }
\hbox_overlap_right:n { \box_use:N #1 }
\@@_draw_literal:n { [begin] }
- \@@_scope_end:
+ \@@_draw_literal:n { restore }
+ \@@_draw_literal:n { [end] }
+ \@@_draw_literal:n { [begin] }
+ \@@_draw_literal:n { @beginspecial }
}
% \end{macrocode}
% \end{macro}
@@ -1209,7 +1333,7 @@
% \end{macrocode}
%
% The direct PDF driver covers both \pdfTeX{} and \LuaTeX{}. The latter
-% renames/restructures the driver primitives but this can be handled
+% renames and restructures the driver primitives but this can be handled
% at one level of abstraction. As such, we avoid using two separate drivers
% for this material at the cost of some \texttt{x}-type definitions to get
% everything expanded up-front.
@@ -1216,7 +1340,7 @@
%
% \subsubsection{Basics}
%
-% \begin{macro}{\@@_literal:n}
+% \begin{macro}{\@@_literal_pdf:n, \@@_literal_pdf:x}
% This is equivalent to \verb|\special{pdf:}| but the engine can
% track it. Without the \texttt{direct} keyword everything is kept in
% sync: the transformation matrix is set to the current point automatically.
@@ -1223,13 +1347,14 @@
% Note that this is still inside the text (\texttt{BT} \dots \texttt{ET}
% block).
% \begin{macrocode}
-\cs_new_protected:Npx \@@_literal:n #1
+\cs_new_protected:Npx \@@_literal_pdf:n #1
{
\cs_if_exist:NTF \luatex_pdfextension:D
{ \luatex_pdfextension:D literal }
{ \pdftex_pdfliteral:D }
- {#1}
+ { \exp_not:N \exp_not:n {#1} }
}
+\cs_generate_variant:Nn \@@_literal_pdf:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -1251,7 +1376,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_matrix:n}
+% \begin{macro}{\@@_matrix:n, \@@_matrix:x}
% Here the appropriate function is set up to insert an affine matrix
% into the PDF. With \pdfTeX{} and \LuaTeX{} in direct PDF output mode there
% is a primitive for this, which only needs the rotation/scaling/skew part.
@@ -1261,8 +1386,9 @@
\cs_if_exist:NTF \luatex_pdfextension:D
{ \luatex_pdfextension:D setmatrix }
{ \pdftex_pdfsetmatrix:D }
- {#1}
+ { \exp_not:N \exp_not:n {#1} }
}
+\cs_generate_variant:Nn \@@_matrix:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -1280,7 +1406,7 @@
\cs_new_protected:Npn \driver_box_use_clip:N #1
{
\@@_scope_begin:
- \@@_literal:n
+ \@@_literal_pdf:x
{
0~
\dim_to_decimal_in_bp:n { -\box_dp:N #1 } ~
@@ -1296,6 +1422,7 @@
% \end{macro}
%
% \begin{macro}{\driver_box_use_rotate:Nn}
+% \begin{macro}{\@@_box_use_rotate:Nn}
% \begin{variable}{\l_@@_cos_fp, \l_@@_sin_fp}
% Rotations are set using an affine transformation matrix which therefore
% requires sine/cosine values not the angle itself. We store the rounded
@@ -1305,6 +1432,8 @@
% after rounding.
% \begin{macrocode}
\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
+ { \exp_args:NNf \@@_box_use_rotate:Nn #1 { \fp_eval:n {#2} } }
+\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
{
\@@_scope_begin:
\box_set_wd:Nn #1 { 0pt }
@@ -1312,7 +1441,7 @@
\fp_compare:nNnT \l_@@_cos_fp = \c_zero_fp
{ \fp_zero:N \l_@@_cos_fp }
\fp_set:Nn \l_@@_sin_fp { round ( sind ( #2 ) , 5 ) }
- \@@_matrix:n
+ \@@_matrix:x
{
\fp_use:N \l_@@_cos_fp \c_space_tl
\fp_compare:nNnTF \l_@@_sin_fp = \c_zero_fp
@@ -1333,6 +1462,7 @@
% \end{macrocode}
% \end{variable}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\driver_box_use_scale:Nnn}
% The same idea as for rotation but without the complexity of signs and
@@ -1341,7 +1471,7 @@
\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
{
\@@_scope_begin:
- \@@_matrix:n
+ \@@_matrix:x
{
\fp_eval:n { round ( #2 , 5 ) } ~
0~0~
@@ -1482,14 +1612,13 @@
%
% \subsubsection{Basics}
%
-% \begin{macro}{\@@_literal:n}
+% \begin{macro}{\@@_literal_pdf:n, \@@_literal_pdf:x}
% Equivalent to \texttt{pdf:content} but favored as the link to
-% the \pdfTeX{} primitive approach is clearer. Some higher-level operations
-% use |\tex_special:D| directly: see the later comments on where this is
-% useful.
+% the \pdfTeX{} primitive approach is clearer.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_literal:n #1
- { \tex_special:D { pdf:literal~ #1 } }
+\cs_new_protected:Npn \@@_literal_pdf:n #1
+ { \@@_literal:n { pdf:literal~ #1 } }
+\cs_generate_variant:Nn \@@_literal_pdf:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -1497,9 +1626,9 @@
% Scoping is done using the driver-specific specials.
% \begin{macrocode}
\cs_new_protected:Npn \@@_scope_begin:
- { \tex_special:D { x:gsave } }
+ { \@@_literal:n { x:gsave } }
\cs_new_protected:Npn \@@_scope_end:
- { \tex_special:D { x:grestore } }
+ { \@@_literal:n { x:grestore } }
% \end{macrocode}
% \end{macro}
%
@@ -1512,7 +1641,7 @@
\cs_new_protected:Npn \driver_box_use_clip:N #1
{
\@@_scope_begin:
- \@@_literal:n
+ \@@_literal_pdf:x
{
0~
\dim_to_decimal_in_bp:n { -\box_dp:N #1 } ~
@@ -1528,18 +1657,21 @@
% \end{macro}
%
% \begin{macro}{\driver_box_use_rotate:Nn}
+% \begin{macro}{\@@_box_use_rotate:Nn}
% Rotating in \texttt{(x)}dvipdmfx can be implemented using either PDF or
% driver-specific code. The former approach however is not \enquote{aware}
% of the content of boxes: this means that any embedded links would not be
-% adjusted by the rotation. As such, the driver-native approach is prefered:
+% adjusted by the rotation. As such, the driver-native approach is preferred:
% the code therefore is similar (though not identical) to the \texttt{dvips}
% version (notice the rotation angle here is positive). As for
% \texttt{dvips}, zero rotation is written as |0| not |-0|.
% \begin{macrocode}
\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
+ { \exp_args:NNf \@@_box_use_rotate:Nn #1 { \fp_eval:n {#2} } }
+\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
{
\@@_scope_begin:
- \tex_special:D
+ \@@_literal:x
{
x:rotate~
\fp_compare:nNnTF {#2} = \c_zero_fp
@@ -1551,6 +1683,7 @@
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\driver_box_use_scale:Nnn}
% Much the same idea for scaling: use the higher-level driver operation to allow
@@ -1559,7 +1692,7 @@
\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
{
\@@_scope_begin:
- \tex_special:D
+ \@@_literal:x
{
x:scale~
\fp_eval:n { round ( #2 , 5 ) } ~
@@ -1622,7 +1755,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_image_include_eps:n #1
{
- \tex_special:D { PSfile = #1 }
+ \@@_literal:n { PSfile = #1 }
}
\cs_new_protected:Npn \@@_image_include_jpg:n #1
{ \@@_image_include_auxi:nn {#1} { image } }
@@ -1656,7 +1789,7 @@
{
\int_if_exist:cTF { c_@@_image_ #2#1 _int }
{
- \tex_special:D
+ \@@_literal:x
{ pdf:usexobj~@image \int_use:c { c_@@_image_ #2#1 _int } }
}
{ \@@_image_include_auxiii:nn {#2} {#1} {#3} }
@@ -1672,7 +1805,7 @@
{
\int_gincr:N \g_@@_image_int
\int_const:cn { c_@@_image_ #1#2 _int } { \g_@@_image_int }
- \tex_special:D
+ \@@_literal:x
{
pdf:#3~
@image \int_use:c { c_@@_image_ #1#2 _int }
@@ -1827,7 +1960,7 @@
% \begin{macro}{\@@_draw_literal:n, \@@_draw_literal:x}
% Pass data through using a dedicated interface.
% \begin{macrocode}
-\cs_new_eq:NN \@@_draw_literal:n \@@_literal:n
+\cs_new_eq:NN \@@_draw_literal:n \@@_literal_pdf:n
\cs_generate_variant:Nn \@@_draw_literal:n { x }
% \end{macrocode}
% \end{macro}
@@ -1843,13 +1976,10 @@
% \end{macro}
%
% \begin{macro}{\driver_draw_scope_begin:, \driver_draw_scope_end:}
-% In contrast to a general scope, a drawing scope is always done using
-% the PDF operators so is the same for all relevant drivers.
+% Use the driver-level scope mechanisms.
% \begin{macrocode}
-\cs_new_protected:Npn \driver_draw_scope_begin:
- { \@@_draw_literal:n { q } }
-\cs_new_protected:Npn \driver_draw_scope_end:
- { \@@_draw_literal:n { Q } }
+\cs_new_eq:NN \driver_draw_scope_begin: \@@_scope_begin:
+\cs_new_eq:NN \driver_draw_scope_end: \@@_scope_end:
% \end{macrocode}
% \end{macro}
%
@@ -1857,9 +1987,7 @@
% \begin{macro}{\driver_draw_curveto:nnnnnn}
% \begin{macro}{\driver_draw_rectangle:nnnn}
% Path creation operations all resolve directly to PDF primitive steps, with
-% only the need to convert to \texttt{bp}. Notice that \texttt{x}-type
-% expansion is included here to ensure that any variable values are
-% forced to literals before any possible caching.
+% only the need to convert to \texttt{bp}.
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
{
@@ -1947,7 +2075,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\driver_draw_cap_dash:nn}
+% \begin{macro}{\driver_draw_dash_pattern:nn}
% \begin{macro}{\@@_draw_dash:n}
% \begin{macro}{\driver_draw_linewidth:n}
% \begin{macro}{\driver_draw_miterlimit:n}
@@ -1959,18 +2087,19 @@
% Converting paths to output is again a case of mapping directly to
% PDF operations.
% \begin{macrocode}
-\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_dash_pattern:nn #1#2
{
\@@_draw_literal:x
{
- [ ~
- \clist_map_function:nN {#1} \@@_draw_dash:n
+ [
+ \exp_args:Nf \use:n
+ { \clist_map_function:nN {#1} \@@_draw_dash:n }
] ~
\dim_to_decimal_in_bp:n {#2} ~ d
}
}
\cs_new:Npn \@@_draw_dash:n #1
- { \dim_to_decimal_in_bp:n {#1} ~ }
+ { ~ \dim_to_decimal_in_bp:n {#1} }
\cs_new_protected:Npn \driver_draw_linewidth:n #1
{
\@@_draw_literal:x
@@ -1977,7 +2106,7 @@
{ \dim_to_decimal_in_bp:n {#1} ~ w }
}
\cs_new_protected:Npn \driver_draw_miterlimit:n #1
- { \@@_draw_literal:x { #1 ~ M } }
+ { \@@_draw_literal:x { \fp_eval:n {#1} ~ M } }
\cs_new_protected:Npn \driver_draw_cap_butt:
{ \@@_draw_literal:n { 0 ~ J } }
\cs_new_protected:Npn \driver_draw_cap_round:
@@ -2012,6 +2141,7 @@
% \driver_draw_color_fill_rgb:nnn ,
% \driver_draw_color_stroke_rgb:nnn
% }
+% \begin{macro}{\@@_color_fill_select:n, \@@_color_fill_select:x}
% For the stroke color, all engines here can use the color stack to handle
% the setting. However, that is not the case for fill color: the stack in
% \texttt{(x)dvipdfmx} only covers one type of color. So we have to use
@@ -2018,17 +2148,37 @@
% different approaches for the two sets of engines.
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_color_fill_cmyk:nnnn #1#2#3#4
- { \@@_color_fill_select:n { #1 ~ #2 ~ #3 ~ #4 ~ k } }
+ {
+ \@@_color_fill_select:x
+ {
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+ k
+ }
+ }
\cs_new_protected:Npn \driver_draw_color_stroke_cmyk:nnnn #1#2#3#4
- { \@@_color_select:n { #1 ~ #2 ~ #3 ~ #4 ~ K } }
+ {
+ \@@_color_select:x
+ {
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+ k
+ }
+ }
\cs_new_protected:Npn \driver_draw_color_fill_gray:n #1
- { \@@_color_fill_select:n { #1 ~ g } }
+ { \@@_color_fill_select:x { \fp_eval:n {#1} ~ g } }
\cs_new_protected:Npn \driver_draw_color_stroke_gray:n #1
- { \@@_color_select:n { #1 ~ G } }
+ { \@@_color_select:x { \fp_eval:n {#1} ~ G } }
\cs_new_protected:Npn \driver_draw_color_fill_rgb:nnn #1#2#3
- { \@@_color_fill_select:n { #1 ~ #2 ~ #3 ~ rg } }
+ {
+ \@@_color_fill_select:x
+ { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg }
+ }
\cs_new_protected:Npn \driver_draw_color_stroke_rgb:nnn #1#2#3
- { \@@_color_select:n { #1 ~ #2 ~ #3 ~ RG } }
+ {
+ \@@_color_select:x
+ { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG }
+ }
%<*pdfmode>
\cs_new_eq:NN \@@_color_fill_select:n \@@_color_select:n
%</pdfmode>
@@ -2035,10 +2185,12 @@
%<*dvipdfmx|xdvipdfmx>
\cs_new_eq:NN \@@_color_fill_select:n \@@_draw_literal:n
%</dvipdfmx|xdvipdfmx>
+\cs_generate_variant:Nn \@@_color_fill_select:n { x }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\driver_draw_cm:nnnn}
% \begin{macro}{\@@_draw_cm:nnnn}
@@ -2053,7 +2205,11 @@
\cs_new_protected:Npn \driver_draw_cm:nnnn #1#2#3#4
{
%<*pdfmode>
- \@@_matrix:n { #1 ~ #2 ~ #3 ~ #4 }
+ \@@_matrix:x
+ {
+ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+ \fp_eval:n {#3} ~ \fp_eval:n {#4}
+ }
%</pdfmode>
%<*dvipdfmx|xdvipdfmx>
\@@_draw_cm_decompose:nnnnN {#1} {#2} {#3} {#4}
@@ -2063,7 +2219,7 @@
%<*dvipdfmx|xdvipdfmx>
\cs_new_protected:Npn \@@_draw_cm:nnnn #1#2#3#4
{
- \tex_special:D
+ \@@_literal:x
{
x:rotate~
\fp_compare:nNnTF {#1} = \c_zero_fp
@@ -2070,13 +2226,13 @@
{ 0 }
{ \fp_eval:n { round ( -#1 , 5 ) } }
}
- \tex_special:D
+ \@@_literal:x
{
x:scale~
\fp_eval:n { round ( #2 , 5 ) } ~
\fp_eval:n { round ( #3 , 5 ) }
}
- \tex_special:D
+ \@@_literal:x
{
x:rotate~
\fp_compare:nNnTF {#4} = \c_zero_fp
@@ -2207,11 +2363,17 @@
\driver_draw_cm:nnnn {#2} {#3} {#4} {#5}
%</pdfmode>
%<*dvipdfmx|xdvipdfmx>
- \tex_special:D { pdf:btrans~matrix~ #2 ~ #3 ~ #4 ~ #5 ~ 0 ~ 0 }
+ \@@_literal:x
+ {
+ pdf:btrans~matrix~
+ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
+ \fp_eval:n {#4} ~ \fp_eval:n {#5} ~
+ 0 ~ 0
+ }
%</dvipdfmx|xdvipdfmx>
\hbox_overlap_right:n { \box_use:N #1 }
%<*dvipdfmx|xdvipdfmx>
- \tex_special:D { pdf:etrans }
+ \@@_literal:n { pdf:etrans }
%</dvipdfmx|xdvipdfmx>
\@@_scope_end:
}
@@ -2230,7 +2392,7 @@
%
% \subsubsection{Basics}
%
-% \begin{macro}{\@@_literal:n}
+% \begin{macro}{\@@_literal_svg:n, \@@_literal_svg:x}
% Unlike the other drivers, the requirements for making SVG files mean
% that we can't conveniently transform all operations to the current point.
% That makes life a bit more tricky later as that needs to be accounted for.
@@ -2237,8 +2399,9 @@
% A new line is added after each call to help to keep the output readable
% for debugging.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_literal:n #1
- { \tex_special:D { dvisvgm:raw~ #1 { ?nl } } }
+\cs_new_protected:Npn \@@_literal_svg:n #1
+ { \@@_literal:n { dvisvgm:raw~ #1 { ?nl } } }
+\cs_generate_variant:Nn \@@_literal_svg:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -2247,15 +2410,15 @@
% operations have to be \enquote{tied} to these not simply inside them.
% \begin{macrocode}
\cs_new_protected:Npn \@@_scope_begin:
- { \@@_literal:n { <g> } }
+ { \@@_literal_svg:n { <g> } }
\cs_new_protected:Npn \@@_scope_end:
- { \@@_literal:n { </g> } }
+ { \@@_literal_svg:n { </g> } }
% \end{macrocode}
% \end{macro}
%
% \subsection{Driver-specific auxiliaries}
%
-% \begin{macro}{\@@_scope_begin:n}
+% \begin{macro}{\@@_scope_begin:n, \@@_scope_begin:x}
% In SVG transformations, clips and so on are attached directly to scopes so
% we need a way or allowing for that. This is rather more useful than
% \cs{@@_scope_begin:} as a result. No assumptions are made about the nature
@@ -2262,7 +2425,8 @@
% of the scoped operation(s).
% \begin{macrocode}
\cs_new_protected:Npn \@@_scope_begin:n #1
- { \@@_literal:n { <g~ #1 > } }
+ { \@@_literal_svg:n { <g~ #1 > } }
+\cs_generate_variant:Nn \@@_scope_begin:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -2282,9 +2446,9 @@
\cs_new_protected:Npn \driver_box_use_clip:N #1
{
\int_gincr:N \g_@@_clip_path_int
- \@@_literal:n
+ \@@_literal_svg:x
{ < clipPath~id = " l3cp \int_use:N \g_@@_clip_path_int " > }
- \@@_literal:n
+ \@@_literal_svg:x
{
<
path ~ d =
@@ -2301,7 +2465,7 @@
"
/>
}
- \@@_literal:n
+ \@@_literal_svg:n
{ < /clipPath > }
% \end{macrocode}
% In general the SVG set up does not try to transform coordinates to the
@@ -2319,9 +2483,10 @@
scale ( 1 , -1 )
"
}
- \@@_scope_begin:n
+ \@@_scope_begin:x
{
- clip-path = "url ( \c_hash_str l3cp \int_use:N \g_@@_clip_path_int ) "
+ clip-path =
+ "url ( \c_hash_str l3cp \int_use:N \g_@@_clip_path_int ) "
}
\@@_scope_begin:n
{
@@ -2350,12 +2515,12 @@
% \begin{macrocode}
\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
{
- \@@_scope_begin:n
+ \@@_scope_begin:x
{
transform =
"
rotate
- ( \fp_eval:n { round ( -#2 , 5 ) } , ~ { ?x } , ~ { ?y } )
+ ( \fp_eval:n { round ( -(#2) , 5 ) } , ~ { ?x } , ~ { ?y } )
"
}
\box_use:N #1
@@ -2371,7 +2536,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
{
- \@@_scope_begin:n
+ \@@_scope_begin:x
{
transform =
"
@@ -2412,7 +2577,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_image_include_png:n #1
{
- \tex_special:D
+ \@@_literal:x
{
dvisvgm:img~
\dim_to_decimal:n { \l_image_ury_dim } ~
@@ -2421,7 +2586,8 @@
}
}
\cs_new_eq:NN \@@_image_include_jpg:n \@@_image_include_png:n
-\cs_new:Npn \@@_image_include_bitmap_quote:w #1 " #2 " #3 \q_stop { #1#2 }
+\cs_new:Npn \@@_image_include_bitmap_quote:w #1 " #2 " #3 \q_stop
+ { #1#2 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2431,7 +2597,7 @@
% \begin{macro}{\@@_draw_literal:n, \@@_draw_literal:x}
% The same as the more general literal call.
% \begin{macrocode}
-\cs_new_eq:NN \@@_draw_literal:n \@@_literal:n
+\cs_new_eq:NN \@@_draw_literal:n \@@_literal_svg:n
\cs_generate_variant:Nn \@@_draw_literal:n { x }
% \end{macrocode}
% \end{macro}
@@ -2655,7 +2821,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\driver_draw_cap_dash:nn}
+% \begin{macro}{\driver_draw_dash_pattern:nn}
% \begin{macro}{\@@_draw_dash:n}
% \begin{macro}{\@@_draw_dash_aux:nn}
% \begin{macro}{\driver_draw_linewidth:n}
@@ -2669,7 +2835,7 @@
% complexity is converting the dash array properly (doing any required
% maths).
% \begin{macrocode}
-\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_dash_pattern:nn #1#2
{
\use:x
{
@@ -2696,7 +2862,7 @@
\cs_new_protected:Npn \driver_draw_linewidth:n #1
{ \@@_draw_scope:x { stroke-width=" \dim_to_decimal:n {#1} " } }
\cs_new_protected:Npn \driver_draw_miterlimit:n #1
- { \@@_draw_scope:x { stroke-miterlimit=" #1 " } }
+ { \@@_draw_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } }
\cs_new_protected:Npn \driver_draw_cap_butt:
{ \@@_draw_scope:n { stroke-linecap="butt" } }
\cs_new_protected:Npn \driver_draw_cap_round:
@@ -2813,16 +2979,16 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\driver_draw_hbox:Nnnnnnn}
+% \begin{macro}{\driver_draw_box_use:Nnnnn}
% No special savings can be made here: simply displace the box inside
% a scope. As there is nothing to re-box, just make the box passed of
% zero size.
% \begin{macrocode}
-\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_box_use:Nnnnn #1#2#3#4#5#6#7
{
\@@_scope_begin:
\driver_draw_cm:nnnn {#2} {#3} {#4} {#5}
- \@@_literal:n
+ \@@_literal_svg:n
{
< g~
stroke="none"~
@@ -2833,7 +2999,7 @@
\box_set_ht:Nn #1 { 0pt }
\box_set_dp:Nn #1 { 0pt }
\box_use:N #1
- \@@_literal:n { </g> }
+ \@@_literal_svg:n { </g> }
\@@_scope_end:
}
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -246,8 +246,14 @@
% \begin{quote}
% |\example:f { \int_eval:n { 1 + 2 } , \int_eval:n { 3 + 4 } }|
% \end{quote}
-% results in the call |\example:n { 3 , \int_eval:n { 3 + 4 } }|
-% while using |\example:x| instead results in |\example:n { 3 , 7 }|
+% results in the call
+% \begin{quote}
+% |\example:n { 3 , \int_eval:n { 3 + 4 } }|
+% \end{quote}
+% while using |\example:x| instead results in
+% \begin{quote}
+% |\example:n { 3 , 7 }|
+% \end{quote}
% at the cost of being protected.
% If you use this type of expansion in conditional processing then
% you should stick to using |TF| type functions only as the expansion
@@ -284,8 +290,7 @@
% \end{syntax}
% This function absorbs two arguments (the \meta{function} name and
% the \meta{tokens}). The \meta{tokens} are expanded until only characters
-% remain, and are then turned into a control sequence. (An internal error
-% occurs if non-characters remain, as the conversion is not possible.)
+% remain, and are then turned into a control sequence.
% The result is inserted into the input stream \emph{after} reinsertion
% of the \meta{function}. Thus the \meta{function} may take more than
% one argument: all others are left unchanged.
@@ -292,6 +297,13 @@
%
% The |:cc| variant constructs the \meta{function} name in the same
% manner as described for the \meta{tokens}.
+% \begin{texnote}
+% Protected macros that appear in a \texttt{c}-type argument are
+% expanded despite being protected; \cs{exp_not:n} also has no
+% effect. An internal error occurs if non-characters or active
+% characters remain after full expansion, as the conversion to a
+% control sequence is not possible.
+% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_args:No}
@@ -322,13 +334,19 @@
% \end{syntax}
% This function absorbs two arguments (the \meta{function} name and
% the \meta{tokens}). The \meta{tokens} are expanded until only characters
-% remain, and are then turned into a control sequence. (An internal error
-% occurs if non-characters remain, as the conversion is not possible.)
+% remain, and are then turned into a control sequence.
% This control sequence should
% be the name of a \meta{variable}. The content of the \meta{variable} are
% recovered and placed inside braces into the input stream \emph{after}
% reinsertion of the \meta{function}. Thus the \meta{function} may take more
% than one argument: all others are left unchanged.
+% \begin{texnote}
+% Protected macros that appear in a \texttt{v}-type argument are
+% expanded despite being protected; \cs{exp_not:n} also has no
+% effect. An internal error occurs if non-characters or active
+% characters remain after full expansion, as the conversion to a
+% control sequence is not possible.
+% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_args:Nf}
@@ -587,10 +605,11 @@
% \begin{texnote}
% This is the \TeX{} \tn{noexpand} primitive. It only prevents
% expansion. At the beginning of an |f|-type argument, a space
-% \meta{token} is removed despite \cs{exp_not:N}. In an
-% |x|-expanding definition (\cs{cs_new:Npx}) a macro parameter
-% \meta{token} (normally~|#|) denotes an argument despite
-% \cs{exp_not:N} (see \cs{exp_not:n}).
+% \meta{token} is removed even if it appears as \cs{exp_not:N}
+% \cs{c_space_token}. In an |x|-expanding definition
+% (\cs{cs_new:Npx}), a macro parameter introduces an argument even
+% if it appears as \cs{exp_not:N} |#| |1|. This differs from
+% \cs{exp_not:n}.
% \end{texnote}
% \end{function}
%
@@ -599,10 +618,16 @@
% \cs{exp_not:c} \Arg{tokens}
% \end{syntax}
% Expands the \meta{tokens} until only characters remain, and then
-% converts this into a control sequence. (An internal error occurs if
-% non-characters remain, as the conversion is not possible.)
+% converts this into a control sequence.
% Further expansion of this control sequence is then inhibited using
% \cs{exp_not:N}.
+% \begin{texnote}
+% Protected macros that appear in a \texttt{c}-type argument are
+% expanded despite being protected; \cs{exp_not:n} also has no
+% effect. An internal error occurs if non-characters or active
+% characters remain after full expansion, as the conversion to a
+% control sequence is not possible.
+% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_not:n}
@@ -610,13 +635,15 @@
% \cs{exp_not:n} \Arg{tokens}
% \end{syntax}
% Prevents expansion of the \meta{tokens} in an |x|-type argument. In
-% other cases (input stream or |o| or |f| arguments) the \meta{tokens}
-% continue being expanded.
+% all other cases the \meta{tokens} continue to be expanded, for
+% example in the input stream or in other types of arguments such as
+% \texttt{c}, \texttt{f}, \texttt{v}. The argument of \cs{exp_not:n}
+% \emph{must} be surrounded by braces.
% \begin{texnote}
-% This is the \eTeX{} \tn{unexpanded} primitive. Hence its argument
-% \emph{must} be surrounded by braces. In an |x|-expanding
-% definition (\cs{cs_new:Npx}), \cs{exp_not:n}~|{#}| inserts a macro
-% parameter character in the replacement text.
+% This is the \eTeX{} \tn{unexpanded} primitive. In an
+% |x|-expanding definition (\cs{cs_new:Npx}), \cs{exp_not:n}~|{#1}|
+% is equivalent to |##1| rather than to~|#1|, namely it inserts the
+% two characters |#| and~|1|.
% \end{texnote}
% \end{function}
%
@@ -642,10 +669,16 @@
% \end{syntax}
% Expands the \meta{tokens} until only characters remains, and then
% converts this into a control sequence which should be a \meta{variable}
-% name. (An internal error occurs if
-% non-characters remain, as the conversion is not possible.)
+% name.
% The content of the \meta{variable} is recovered, and further
% expansion in |x|-type arguments is prevented using \cs{exp_not:n}.
+% \begin{texnote}
+% Protected macros that appear in a \texttt{v}-type argument are
+% expanded despite being protected; \cs{exp_not:n} also has no
+% effect. An internal error occurs if non-characters or active
+% characters remain after full expansion, as the conversion to a
+% control sequence is not possible.
+% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_not:f}
@@ -705,12 +738,12 @@
% \exp_end:
% }
% \begin{syntax}
-% \cs{exp:w} \meta{expandable-tokens} \cs{exp_end:} \\
+% \cs{exp:w} \meta{expandable tokens} \cs{exp_end:} \\
% \end{syntax}
% Expands \meta{expandable-tokens} until reaching \cs{exp_end:} at
% which point expansion stops.
-% The full expansion of \meta{expandable-tokens} has to be empty.
-% If any token in \meta{expandable-tokens} or any token generated by
+% The full expansion of \meta{expandable tokens} has to be empty.
+% If any token in \meta{expandable tokens} or any token generated by
% expanding the tokens therein is not expandable the expansion will end
% prematurely and as a result \cs{exp_end:} will be misinterpreted
% later on.\footnotemark
@@ -724,6 +757,11 @@
%\end{verbatim}
% where somewhere during the expansion of |\@@_case:NnTF| the
% \cs{exp_end:} gets generated.
+% \begin{texnote}
+% The current implementation uses \tn{romannumeral} hence ignores
+% space tokens and explicit signs |+| and |-| in the expansion of the
+% \meta{expandable tokens}, but this should not be relied upon.
+% \end{texnote}
% \end{function}
% \footnotetext{Due to the implementation you might get the character
% in position 0 in the current font (typically \enquote{\texttt{`}})
@@ -797,23 +835,28 @@
% braces will not terminate the \texttt{f}-type expansion.
% \end{function}
%
-% \section{Internal functions and variables}
+% \section{Internal functions}
%
-% \begin{variable}{\l__exp_internal_tl}
-% The |\exp_| module has its private variable to temporarily store the
-% result of |x|-type argument expansion. This is done to avoid interference
-% with other functions using temporary variables.
-% \end{variable}
-%
% \begin{function}{\::n, \::N, \::p, \::c, \::o, \::f, \::x, \::v, \::V, \:::}
% \begin{syntax}
-% |\cs_set:Npn \exp_args:Ncof { \::c \::o \::f \::: }|
+% |\cs_new:Npn \exp_args:Ncof { \::c \::o \::f \::: }|
% \end{syntax}
% Internal forms for the base expansion types. These names do \emph{not}
% conform to the general \LaTeX3 approach as this makes them more readily
-% visible in the log and so forth.
+% visible in the log and so forth. They should not be used outside this module.
% \end{function}
%
+% \begin{function}
+% {\::o_unbraced, \::f_unbraced, \::x_unbraced, \::v_unbraced, \::V_unbraced}
+% \begin{syntax}
+% |\cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: }|
+% \end{syntax}
+% Internal forms for the expansion types which leave the terminal argument
+% unbraced. These names do \emph{not}
+% conform to the general \LaTeX3 approach as this makes them more readily
+% visible in the log and so forth. They should not be used outside this module.
+% \end{function}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -828,6 +871,12 @@
%<@@=exp>
% \end{macrocode}
%
+% \begin{variable}{\l_@@_internal_tl}
+% The |\exp_| module has its private variable to temporarily store the
+% result of |x|-type argument expansion. This is done to avoid interference
+% with other functions using temporary variables.
+% \end{variable}
+%
% \begin{macro}{\exp_after:wN}
% \begin{macro}{\exp_not:N}
% \begin{macro}{\exp_not:n}
@@ -963,11 +1012,13 @@
%
% \begin{macro}{\::x}
% This function is used to expand an argument fully.
+% We build in the expansion of \cs{@@_arg_next:nnn}.
% \begin{macrocode}
\cs_new_protected:Npn \::x #1 \::: #2#3
{
- \cs_set_nopar:Npx \l_@@_internal_tl { {#3} }
- \exp_after:wN \@@_arg_next:nnn \l_@@_internal_tl {#1} {#2}
+ \cs_set_nopar:Npx \l_@@_internal_tl
+ { \exp_not:n { #1 \::: } { \exp_not:n {#2} {#3} } }
+ \l_@@_internal_tl
}
% \end{macrocode}
% \end{macro}
@@ -1450,26 +1501,34 @@
%
% \subsection{Preventing expansion}
%
+% \begin{macro}{\__kernel_exp_not:w}
+% At the kernel level, we need the primitive behaviour to allow expansion
+% \emph{before} the brace group.
+% \begin{macrocode}
+\cs_new_eq:NN \__kernel_exp_not:w \etex_unexpanded:D
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]{\exp_not:c}
% \begin{macro}[EXP]{\exp_not:o}
% \begin{macro}[EXP]{\exp_not:f}
% \begin{macro}[EXP]{\exp_not:V}
% \begin{macro}[EXP]{\exp_not:v}
-% All these except \cs{exp_not:c} call the primitive
-% \cs{etex_unexpanded:D} namely \cs{exp_not:n}.
+% All these except \cs{exp_not:c} call the kernel-internal
+% \cs{__kernel_exp_not:w} namely \tn{etex_unexpanded:D}.
% \begin{macrocode}
\cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: }
-\cs_new:Npn \exp_not:o #1 { \etex_unexpanded:D \exp_after:wN {#1} }
+\cs_new:Npn \exp_not:o #1 { \__kernel_exp_not:w \exp_after:wN {#1} }
\cs_new:Npn \exp_not:f #1
{ \etex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
\cs_new:Npn \exp_not:V #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{ \exp:w \@@_eval_register:N #1 }
}
\cs_new:Npn \exp_not:v #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{ \exp:w \@@_eval_register:c {#1} }
}
% \end{macrocode}
@@ -1524,10 +1583,15 @@
% \end{macrocode}
% If the above definition ever appears outside its proper context
% the active character |^^@| will be executed so we turn this into an
-% error.
+% error. The test for existence covers the (unlikely) case that some
+% other code has already defined |^^@|: this is true for example for
+% \texttt{xmltex.tex}.
% \begin{macrocode}
- \cs_new:Npn ^^@
- { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } }
+ \if_cs_exist:N ^^@
+ \else:
+ \cs_new:Npn ^^@
+ { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } }
+ \fi:
% \end{macrocode}
% The same but grabbing an argument to remove spaces and braces.
% \begin{macrocode}
@@ -1565,11 +1629,15 @@
\cs_new_protected:Npn \cs_generate_variant:Nn #1#2
{
\@@_generate_variant:N #1
- \exp_after:wN \@@_split_function:NN
- \exp_after:wN #1
- \exp_after:wN \@@_generate_variant:nnNN
- \exp_after:wN #1
- \tl_to_str:n {#2} , \scan_stop: , \q_recursion_stop
+ \use:x
+ {
+ \@@_generate_variant:nnNN
+ \cs_split_function:N #1
+ \exp_not:N #1
+ \tl_to_str:n {#2} ,
+ \exp_not:N \scan_stop: ,
+ \exp_not:N \q_recursion_stop
+ }
}
\cs_new_protected:Npn \cs_generate_variant:cn
{ \exp_args:Nc \cs_generate_variant:Nn }
@@ -1872,7 +1940,8 @@
#5
}
}
-\cs_new:Npn \@@_generate_variant_loop_special:NNwNNnn #1#2#3 \q_stop #4#5#6#7
+\cs_new:Npn \@@_generate_variant_loop_special:NNwNNnn
+ #1#2#3 \q_stop #4#5#6#7
{
#3 \q_stop #4 #5 {#6} {#7}
\exp_not:n
@@ -1969,13 +2038,10 @@
{ : \exp_not:N \use_i:nn }
}
}
-\use:x
+\exp_last_unbraced:NNNNo
+ \cs_new_protected:Npn \@@_generate_internal_variant:wwnNwnn #1
+ { \token_to_str:N x } #2 \q_mark #3#4#5 \q_stop #6#7
{
- \cs_new_protected:Npn \exp_not:N \@@_generate_internal_variant:wwnNwnn
- ##1 \token_to_str:N x ##2 \exp_not:N \q_mark
- ##3 ##4 ##5 \exp_not:N \q_stop ##6 ##7
- }
- {
#3
\cs_if_free:cT {#6} { #4 {#6} {#7} }
}
@@ -2009,7 +2075,13 @@
% }
% \begin{macrocode}
\cs_new_protected:Npn \prg_generate_conditional_variant:Nnn #1
- { \__cs_split_function:NN #1 \@@_generate_variant:nnNnn }
+ {
+ \use:x
+ {
+ \@@_generate_variant:nnNnn
+ \cs_split_function:N #1
+ }
+ }
\cs_new_protected:Npn \@@_generate_variant:nnNnn #1#2#3#4#5
{
\if_meaning:w \c_false_bool #3
@@ -2051,7 +2123,46 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\exp_args_generate:n, \@@_args_generate:Nn}
+% \begin{macro}[EXP]{\@@_args_generate:n}
+% This function is not used in the kernel hence we can use functions
+% that are defined in later modules. It also does not need to be fast
+% so use inline mappings. For each requested variant we check that
+% there are no characters besides |NnpcofVvx|, in particular that
+% there are no spaces. Then we loop through the variant specifier and
+% convert each letter to \cs[no-index]{::\meta{variant letter}}, with a
+% trailing \cs{:::}.
% \begin{macrocode}
+\cs_new_protected:Npn \exp_args_generate:n #1
+ {
+ \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
+ {
+ \str_map_inline:nn {##1}
+ {
+ \str_if_in:nnF { NnpcofVvx } {####1}
+ {
+ \__kernel_msg_error:nnnn { kernel } { invalid-exp-args }
+ {####1} {##1}
+ \str_map_break:n { \use_none:nnnn }
+ }
+ }
+ \exp_args:Nc \@@_args_generate:Nn { exp_args:N ##1 } {##1}
+ }
+ }
+\cs_new_protected:Npn \@@_args_generate:Nn #1#2
+ {
+ \cs_if_exist:NF #1
+ {
+ \str_if_in:nnTF {#2} { x } { \cs_new_protected:Npx } { \cs_new:Npx }
+ #1 { \tl_map_function:nN { #2 : } \@@_args_generate:n }
+ }
+ }
+\cs_new:Npn \@@_args_generate:n #1 { \exp_not:c { :: #1 } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -67,113 +67,8 @@
% using |"| tokens if they contain spaces: as a result, |"| tokens are
% \emph{not} permitted in file names.
%
-% \section{File operation functions}
+% \section{Input--output stream management}
%
-% \begin{variable}[added = 2017-06-21]
-% {
-% \g_file_curr_dir_str,
-% \g_file_curr_name_str,
-% \g_file_curr_ext_str
-% }
-% Contain the directory, name and extension of the current file. The
-% directory is empty if the file was loaded without an explicit
-% path (\emph{i.e.}~if it is in the \TeX{} search path), and does
-% \emph{not} end in |/| other than the case that it is exactly equal
-% to the root directory. The \meta{name} and \meta{ext} parts together
-% make up the file name, thus the \meta{name} part may be thought of
-% as the \enquote{job name} for the current file. Note that \TeX{} does
-% not provide information on the \meta{ext} part for the main (top
-% level) file and that this file always has an empty \meta{dir} component.
-% Also, the \meta{name} here will be equal to \cs{c_sys_jobname_str},
-% which may be different from the real file name (if set using
-% |--jobname|, for example).
-% \end{variable}
-%
-% \begin{variable}[added = 2017-06-18]{\l_file_search_path_seq}
-% Each entry is the path to a directory which should be searched when
-% seeking a file. Each path can be relative or absolute, and should
-% not include the trailing slash. The entries are not expanded when
-% used so may contain active characters but should not feature any
-% variable content. Spaces need not be quoted.
-%
-% \begin{texnote}
-% When working as a package in \LaTeXe{}, \pkg{expl3} will
-% automatically append the current \tn{input at path} to the
-% set of values from \cs{l_file_search_path_seq}.
-% \end{texnote}
-% \end{variable}
-%
-% \begin{function}[TF, updated = 2012-02-10]{\file_if_exist:n}
-% \begin{syntax}
-% \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Searches for \meta{file name} using the current \TeX{} search
-% path and the additional paths controlled by
-% \cs{l_file_search_path_seq}.
-% \end{function}
-%
-% \begin{function}[updated = 2017-06-26]
-% {\file_get_full_name:nN, \file_get_full_name:VN}
-% \begin{syntax}
-% \cs{file_get_full_name:nN} \Arg{file name} \meta{str var}
-% \end{syntax}
-% Searches for \meta{file name} in the path as detailed for
-% \cs{file_if_exist:nTF}, and if found sets the \meta{str var} the
-% fully-qualified name of the file, \emph{i.e.}~the path and file name.
-% This includes an extension |.tex| when the given \meta{file name}
-% has no extension but the file found has that extension.
-% If the file is not found then the \meta{str var} is empty.
-% \end{function}
-%
-% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
-% {\file_parse_full_name:nNNN}
-% \begin{syntax}
-% \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
-% \end{syntax}
-% Parses the \meta{full name} and splits it into three parts, each of
-% which is returned by setting the appropriate local string variable:
-% \begin{itemize}
-% \item The \meta{dir}: everything up to the last |/| (path separator)
-% in the \meta{file path}. As with system \texttt{PATH} variables
-% and related functions, the \meta{dir} does \emph{not} include the
-% trailing |/| unless it points to the root directory. If there is no path (only
-% a file name), \meta{dir} is empty.
-% \item The \meta{name}: everything after the last |/| up to the last |.|,
-% where both of those characters are optional. The \meta{name} may
-% contain multiple |.| characters. It is empty if \meta{full name}
-% consists only of a directory name.
-% \item The \meta{ext}: everything after the last |.| (including the dot).
-% The \meta{ext} is empty if there is no |.| after the last |/|.
-% \end{itemize}
-% This function does not expand the \meta{full name} before turning it
-% to a string. It assume that the \meta{full name} either contains no
-% quote (|"|) characters or is surrounded by a pair of quotes.
-% \end{function}
-%
-% \begin{function}[updated = 2017-06-26]{\file_input:n}
-% \begin{syntax}
-% \cs{file_input:n} \Arg{file name}
-% \end{syntax}
-% Searches for \meta{file name} in the path as detailed for
-% \cs{file_if_exist:nTF}, and if found reads in the file as
-% additional \LaTeX{} source. All files read are recorded
-% for information and the file name stack is updated by this
-% function. An error is raised if the file is not found.
-% \end{function}
-%
-% \begin{function}{\file_show_list:, \file_log_list:}
-% \begin{syntax}
-% \cs{file_show_list:}
-% \cs{file_log_list:}
-% \end{syntax}
-% These functions list all files loaded by \LaTeXe{} commands that
-% populate \tn{@filelist} or by \cs{file_input:n}. While
-% \cs{file_show_list:} displays the list in the terminal,
-% \cs{file_log_list:} outputs it to the log file only.
-% \end{function}
-%
-% \subsection{Input--output stream management}
-%
% As \TeX{} engines have a limited number of input and output streams, direct
% use of the streams by the programmer is not supported in \LaTeX3. Instead, an
% internal pool of streams is maintained, and these are allocated and
@@ -597,7 +492,7 @@
% by the \cs{iow_wrap:nnnN}
% function. This value depends on the \TeX{} system in use: the standard
% value is $78$, which is typically correct for unmodified \TeX{}live
-% and MiK\TeX{} systems.
+% and \hologo{MiKTeX} systems.
% \end{variable}
%
% \subsection{Constant input--output streams, and variables}
@@ -647,74 +542,109 @@
% \end{texnote}
% \end{function}
%
-% \subsection{Internal file functions and variables}
+% \section{File operation functions}
%
-% \begin{variable}{\g__file_internal_ior}
-% Used to test for the existence of files when opening.
+% \begin{variable}[added = 2017-06-21]
+% {
+% \g_file_curr_dir_str,
+% \g_file_curr_name_str,
+% \g_file_curr_ext_str
+% }
+% Contain the directory, name and extension of the current file. The
+% directory is empty if the file was loaded without an explicit
+% path (\emph{i.e.}~if it is in the \TeX{} search path), and does
+% \emph{not} end in |/| other than the case that it is exactly equal
+% to the root directory. The \meta{name} and \meta{ext} parts together
+% make up the file name, thus the \meta{name} part may be thought of
+% as the \enquote{job name} for the current file. Note that \TeX{} does
+% not provide information on the \meta{ext} part for the main (top
+% level) file and that this file always has an empty \meta{dir} component.
+% Also, the \meta{name} here will be equal to \cs{c_sys_jobname_str},
+% which may be different from the real file name (if set using
+% |--jobname|, for example).
% \end{variable}
%
-% \begin{variable}{\l__file_base_name_str, \l__file_full_name_str}
-% Used to store and transfer the file name (including extension)
-% and (partial) file path whilst reading files. (The file base is the
-% base name plus any preceding directory name.)
+% \begin{variable}[added = 2017-06-18]{\l_file_search_path_seq}
+% Each entry is the path to a directory which should be searched when
+% seeking a file. Each path can be relative or absolute, and should
+% not include the trailing slash. The entries are not expanded when
+% used so may contain active characters but should not feature any
+% variable content. Spaces need not be quoted.
+%
+% \begin{texnote}
+% When working as a package in \LaTeXe{}, \pkg{expl3} will
+% automatically append the current \tn{input at path} to the
+% set of values from \cs{l_file_search_path_seq}.
+% \end{texnote}
% \end{variable}
%
-% \begin{function}[added = 2017-06-25]{\__file_missing:n}
+% \begin{function}[TF, updated = 2012-02-10]{\file_if_exist:n}
% \begin{syntax}
-% \cs{__file_missing:n} \Arg{name}
+% \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
% \end{syntax}
-% Expands the \meta{name} as per \cs{__file_name_sanitize:nN} then
-% produces an error message indicating that that file was not found.
+% Searches for \meta{file name} using the current \TeX{} search
+% path and the additional paths controlled by
+% \cs{l_file_search_path_seq}.
% \end{function}
%
-% \begin{function}[added = 2017-06-19]{\__file_name_sanitize:nN}
+% \begin{function}[updated = 2017-06-26]
+% {\file_get_full_name:nN, \file_get_full_name:VN}
% \begin{syntax}
-% \cs{__file_name_sanitize:nN} \Arg{name} \meta{str var}
+% \cs{file_get_full_name:nN} \Arg{file name} \meta{str var}
% \end{syntax}
-% Exhaustively-expands the \meta{name} with the exception of any
-% category \meta{active} (catcode~$13$) tokens, which are not expanded.
-% The list of \meta{active} tokens is taken from \cs{l_char_active_seq}.
-% The \meta{str var} is then set to the \meta{sanitized name}.
+% Searches for \meta{file name} in the path as detailed for
+% \cs{file_if_exist:nTF}, and if found sets the \meta{str var} the
+% fully-qualified name of the file, \emph{i.e.}~the path and file name.
+% This includes an extension |.tex| when the given \meta{file name}
+% has no extension but the file found has that extension.
+% If the file is not found then the \meta{str var} is empty.
% \end{function}
%
-% \begin{function}[added = 2017-06-19, updated = 2017-06-25]
-% {\__file_name_quote:nN}
+% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
+% {\file_parse_full_name:nNNN}
% \begin{syntax}
-% \cs{__file_name_quote:nN} \Arg{name} \meta{str var}
+% \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
% \end{syntax}
-% Expands the \meta{name} (without special-casing active tokens), then
-% sets the \meta{str var} to the \meta{name} quoted using |"| at each
-% end if required by the presence of spaces in the \meta{name}. Any existing
-% |"| tokens is removed and if their number is odd an error is raised.
+% Parses the \meta{full name} and splits it into three parts, each of
+% which is returned by setting the appropriate local string variable:
+% \begin{itemize}
+% \item The \meta{dir}: everything up to the last |/| (path separator)
+% in the \meta{file path}. As with system \texttt{PATH} variables
+% and related functions, the \meta{dir} does \emph{not} include the
+% trailing |/| unless it points to the root directory. If there is no path (only
+% a file name), \meta{dir} is empty.
+% \item The \meta{name}: everything after the last |/| up to the last |.|,
+% where both of those characters are optional. The \meta{name} may
+% contain multiple |.| characters. It is empty if \meta{full name}
+% consists only of a directory name.
+% \item The \meta{ext}: everything after the last |.| (including the dot).
+% The \meta{ext} is empty if there is no |.| after the last |/|.
+% \end{itemize}
+% This function does not expand the \meta{full name} before turning it
+% to a string. It assume that the \meta{full name} either contains no
+% quote (|"|) characters or is surrounded by a pair of quotes.
% \end{function}
%
-% \subsection{Internal input--output functions}
-%
-% \begin{function}[added = 2012-01-23]{\__ior_open:Nn, \__ior_open:No}
+% \begin{function}[updated = 2017-06-26]{\file_input:n}
% \begin{syntax}
-% \cs{__ior_open:Nn} \meta{stream} \Arg{file name}
+% \cs{file_input:n} \Arg{file name}
% \end{syntax}
-% This function has identical syntax to the public version. However,
-% is does not take precautions against active characters in the
-% \meta{file name}, and it does not attempt to add a \meta{path} to
-% the \meta{file name}: it is therefore intended to be used by
-% higher-level
-% functions which have already fully expanded the \meta{file name} and which
-% need to perform multiple open or close operations. See for example the
-% implementation of \cs{file_get_full_name:nN},
+% Searches for \meta{file name} in the path as detailed for
+% \cs{file_if_exist:nTF}, and if found reads in the file as
+% additional \LaTeX{} source. All files read are recorded
+% for information and the file name stack is updated by this
+% function. An error is raised if the file is not found.
% \end{function}
%
-% \begin{function}[added = 2014-08-23]{\__iow_with:Nnn}
+% \begin{function}{\file_show_list:, \file_log_list:}
% \begin{syntax}
-% \cs{__iow_with:Nnn} \meta{integer} \Arg{value} \Arg{code}
+% \cs{file_show_list:}
+% \cs{file_log_list:}
% \end{syntax}
-% If the \meta{integer} is equal to the \meta{value} then this
-% function simply runs the \meta{code}. Otherwise it saves the
-% current value of the \meta{integer}, sets it to the \meta{value},
-% runs the \meta{code}, and restores the \meta{integer} to its former
-% value. This is used to ensure that the \tn{newlinechar} is~$10$
-% when writing to a stream, which lets \cs{iow_newline:} work, and
-% that \tn{errorcontextlines} is $-1$ when displaying a message.
+% These functions list all files loaded by \LaTeXe{} commands that
+% populate \tn{@filelist} or by \cs{file_input:n}. While
+% \cs{file_show_list:} displays the list in the terminal,
+% \cs{file_log_list:} outputs it to the log file only.
% \end{function}
%
% \end{documentation}
@@ -729,427 +659,6 @@
%<*initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<@@=file>
-% \end{macrocode}
-%
-% \subsection{File operations}
-%
-% \begin{variable}
-% {
-% \g_file_curr_dir_str ,
-% \g_file_curr_ext_str ,
-% \g_file_curr_name_str
-% }
-% The name of the current file should be available at all times.
-% For the format the file name needs to be picked up at the start of the
-% run. In \LaTeXe{} package mode the current file name is collected from
-% \tn{@currname}.
-% \begin{macrocode}
-\str_new:N \g_file_curr_dir_str
-\str_new:N \g_file_curr_ext_str
-\str_new:N \g_file_curr_name_str
-%<*initex>
-\tex_everyjob:D \exp_after:wN
- {
- \tex_the:D \tex_everyjob:D
- \str_gset:Nx \g_file_curr_name_str { \tex_jobname:D }
- }
-%</initex>
-%<*package>
-\cs_if_exist:NT \@currname
- { \str_gset_eq:NN \g_file_curr_name_str \@currname }
-%</package>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\g_@@_stack_seq}
-% The input list of files is stored as a sequence stack. In package
-% mode we can recover the information from the details held by
-% \LaTeXe{} (we must be in the preamble and loaded using \tn{usepackage}
-% or \tn{RequirePackage}). As \LaTeXe{} doesn't store directory and
-% name separately, we stick to the same convention here.
-% \begin{macrocode}
-\seq_new:N \g_@@_stack_seq
-%<*package>
-\group_begin:
- \cs_set_protected:Npn \@@_tmp:w #1#2#3
- {
- \tl_if_blank:nTF {#1}
- {
- \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \q_stop { { } {##2} { } }
- \seq_gput_right:Nx \g_@@_stack_seq
- {
- \exp_after:wN \@@_tmp:w \tex_jobname:D
- " \tex_jobname:D " \q_stop
- }
- }
- {
- \seq_gput_right:Nn \g_@@_stack_seq { { } {#1} {#2} }
- \@@_tmp:w
- }
- }
- \cs_if_exist:NT \@currnamestack
- { \exp_after:wN \@@_tmp:w \@currnamestack }
-\group_end:
-%</package>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\g_@@_record_seq}
-% The total list of files used is recorded separately from the current
-% file stack, as nothing is ever popped from this list. The current
-% file name should be included in the file list! In format mode, this
-% is done at the very start of the \TeX{} run. In package mode we
-% will eventually copy the contents of \cs{@filelist}.
-% \begin{macrocode}
-\seq_new:N \g_@@_record_seq
-%<*initex>
-\tex_everyjob:D \exp_after:wN
- {
- \tex_the:D \tex_everyjob:D
- \seq_gput_right:NV \g_@@_record_seq \g_file_curr_name_str
- }
-%</initex>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_tl}
-% Used as a short-term scratch variable.
-% \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l__file_base_name_str, \l__file_full_name_str}
-% For storing the basename and full path whilst passing data internally.
-% \begin{macrocode}
-\str_new:N \l__file_base_name_str
-\str_new:N \l__file_full_name_str
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_dir_str, \l_@@_ext_str, \l_@@_name_str}
-% Used in parsing a path into parts: in contrast to the above, these are
-% never used outside of the current module.
-% \begin{macrocode}
-\str_new:N \l_@@_dir_str
-\str_new:N \l_@@_ext_str
-\str_new:N \l_@@_name_str
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_file_search_path_seq}
-% The current search path.
-% \begin{macrocode}
-\seq_new:N \l_file_search_path_seq
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_seq}
-% Scratch space for comma list conversion in package mode.
-% \begin{macrocode}
-%<*package>
-\seq_new:N \l_@@_tmp_seq
-%</package>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\__file_name_sanitize:nN}
-% \begin{macro}{\__file_name_quote:nN}
-% \begin{macro}{\@@_name_sanitize_aux:n}
-% For converting a token list to a string where active characters are treated
-% as strings from the start. The logic to the quoting normalisation is the
-% same as used by \texttt{lualatexquotejobname}: check for balanced |"|, and
-% assuming they balance strip all of them out before quoting the entire name
-% if it contains spaces.
-% \begin{macrocode}
-\cs_new_protected:Npn \__file_name_sanitize:nN #1#2
- {
- \group_begin:
- \seq_map_inline:Nn \l_char_active_seq
- {
- \tl_set:Nx \l_@@_tmp_tl { \iow_char:N ##1 }
- \char_set_active_eq:NN ##1 \l_@@_tmp_tl
- }
- \tl_set:Nx \l_@@_tmp_tl {#1}
- \tl_set:Nx \l_@@_tmp_tl
- { \tl_to_str:N \l_@@_tmp_tl }
- \exp_args:NNNV \group_end:
- \str_set:Nn #2 \l_@@_tmp_tl
- }
-\cs_new_protected:Npn \__file_name_quote:nN #1#2
- {
- \str_set:Nx #2 {#1}
- \int_if_even:nF
- { 0 \tl_map_function:NN #2 \@@_name_quote_aux:n }
- {
- \__kernel_msg_error:nnx
- { kernel } { unbalanced-quote-in-filename } {#2}
- }
- \tl_remove_all:Nn #2 { " }
- \tl_if_in:NnT #2 { ~ }
- { \str_set:Nx #2 { " \exp_not:V #2 " } }
- }
-\cs_new:Npn \@@_name_quote_aux:n #1
- { \token_if_eq_charcode:NNT #1 " { + 1 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\file_get_full_name:nN, \file_get_full_name:VN}
-% \begin{macro}{\@@_get_full_name_search:nN}
-% The way to test if a file exists is to try to open it: if it does
-% not exist then \TeX{} reports end-of-file. A search is made
-% looking at each potential path in turn (starting from the current
-% directory). The first location is of course treated as the correct
-% one: this is done by jumping to \cs{__prg_break_point:}. If nothing
-% is found, |#2| is returned empty. A special case when there is no
-% extension is that once the first location is found we test the
-% existence of the file with |.tex| extension in that directory, and
-% if it exists we include the |.tex| extension in the result.
-% \begin{macrocode}
-\cs_new_protected:Npn \file_get_full_name:nN #1#2
- {
- \__file_name_sanitize:nN {#1} \l__file_base_name_str
- \@@_get_full_name_search:nN { } \use:n
- \seq_map_inline:Nn \l_file_search_path_seq
- { \@@_get_full_name_search:nN { ##1 / } \seq_map_break:n }
-%<*package>
- \cs_if_exist:NT \input at path
- {
- \tl_map_inline:Nn \input at path
- { \@@_get_full_name_search:nN { ##1 } \tl_map_break:n }
- }
-%</package>
- \str_clear:N \l__file_full_name_str
- \__prg_break_point:
- \str_if_empty:NF \l__file_full_name_str
- {
- \exp_args:NV \file_parse_full_name:nNNN \l__file_full_name_str
- \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
- \str_if_empty:NT \l_@@_ext_str
- {
- \__ior_open:No \g_@@_internal_ior
- { \l__file_full_name_str .tex }
- \ior_if_eof:NF \g_@@_internal_ior
- { \str_put_right:Nn \l__file_full_name_str { .tex } }
- }
- }
- \str_set_eq:NN #2 \l__file_full_name_str
- \ior_close:N \g_@@_internal_ior
- }
-\cs_generate_variant:Nn \file_get_full_name:nN { V }
-\cs_new_protected:Npn \@@_get_full_name_search:nN #1#2
- {
- \__file_name_quote:nN
- { \tl_to_str:n {#1} \l__file_base_name_str }
- \l__file_full_name_str
- \__ior_open:No \g_@@_internal_ior \l__file_full_name_str
- \ior_if_eof:NF \g_@@_internal_ior { #2 { \__prg_break: } }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[TF]{\file_if_exist:n}
-% The test for the existence of a file is a wrapper around the function to
-% add a path to a file. If the file was found, the path contains
-% something, whereas if the file was not located then the return value
-% is empty.
-% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF }
- {
- \file_get_full_name:nN {#1} \l__file_full_name_str
- \str_if_empty:NTF \l__file_full_name_str
- { \prg_return_false: }
- { \prg_return_true: }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\__file_missing:n}
-% An error message for a missing file, also used in \cs{ior_open:Nn}.
-% \begin{macrocode}
-\cs_new_protected:Npn \__file_missing:n #1
- {
- \__file_name_sanitize:nN {#1} \l__file_base_name_str
- \__kernel_msg_error:nnx { kernel } { file-not-found }
- { \l__file_base_name_str }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\file_input:n}
-% \begin{macro}{\@@_input:n, \@@_input:V}
-% \begin{macro}{\@@_input_push:n}
-% \begin{macro}{\@@_input_pop:}
-% \begin{macro}{\@@_input_pop:nnn}
-% Loading a file is done in a safe way, checking first that the file
-% exists and loading only if it does. Push the file name on the
-% \cs{g_@@_stack_seq}, and add it to the file list, either
-% \cs{g_@@_record_seq}, or \cs{@filelist} in package mode.
-% \begin{macrocode}
-\cs_new_protected:Npn \file_input:n #1
- {
- \file_get_full_name:nN {#1} \l__file_full_name_str
- \str_if_empty:NTF \l__file_full_name_str
- { \__file_missing:n {#1} }
- { \@@_input:V \l__file_full_name_str }
- }
-\cs_new_protected:Npn \@@_input:n #1
- {
-%<*initex>
- \seq_gput_right:Nn \g_@@_record_seq {#1}
-%</initex>
-%<*package>
- \clist_if_exist:NTF \@filelist
- { \@addtofilelist {#1} }
- { \seq_gput_right:Nn \g_@@_record_seq {#1} }
-%</package>
- \@@_input_push:n {#1}
- \tex_input:D #1 \c_space_tl
- \@@_input_pop:
- }
-\cs_generate_variant:Nn \@@_input:n { V }
-% \end{macrocode}
-% Keeping a track of the file data is easy enough: we store the separated
-% parts so we do not need to parse them twice.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_input_push:n #1
- {
- \seq_gpush:Nx \g_@@_stack_seq
- {
- { \g_file_curr_dir_str }
- { \g_file_curr_name_str }
- { \g_file_curr_ext_str }
- }
- \file_parse_full_name:nNNN {#1}
- \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
- \str_gset_eq:NN \g_file_curr_dir_str \l_@@_dir_str
- \str_gset_eq:NN \g_file_curr_name_str \l_@@_name_str
- \str_gset_eq:NN \g_file_curr_ext_str \l_@@_ext_str
- }
-\cs_new_protected:Npn \@@_input_pop:
- {
- \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl
- \exp_after:wN \@@_input_pop:nnn \l_@@_tmp_tl
- }
-\cs_new_protected:Npn \@@_input_pop:nnn #1#2#3
- {
- \str_gset:Nn \g_file_curr_dir_str {#1}
- \str_gset:Nn \g_file_curr_name_str {#2}
- \str_gset:Nn \g_file_curr_ext_str {#3}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\file_parse_full_name:nNNN}
-% \begin{macro}
-% {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
-% Parsing starts by stripping off any surrounding quotes. Then find
-% the directory |#4| by splitting at the last~|/|. (The auxiliary
-% returns \texttt{true}/\texttt{false} depending on whether it found
-% the delimiter.) We correct for the case of a file in the root |/|,
-% as in that case we wish to keep the trailing (and only) slash. Then
-% split the base name |#5| at the last dot. If there was indeed a
-% dot, |#5| contains the name and |#6| the extension without the dot,
-% which we add back for convenience. In the special case of no
-% extension given, the auxiliary stored the name into |#6|, we just
-% have to move it to |#5|.
-% \begin{macrocode}
-\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
- {
- \exp_after:wN \@@_parse_full_name_auxi:w
- \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4
- }
-\cs_new_protected:Npn \@@_parse_full_name_auxi:w #1 " #2 " #3 \q_stop #4#5#6
- {
- \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
- { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
- { }
- \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
- { \str_put_left:Nn #6 { . } }
- {
- \str_set_eq:NN #5 #6
- \str_clear:N #6
- }
- }
-\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
- {
- \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \q_stop
- {
- \tl_if_empty:nTF {##3}
- {
- \str_set:Nn #4 {##2}
- \tl_if_empty:nTF {##1}
- {
- \str_clear:N #3
- \use_ii:nn
- }
- {
- \str_set:Nx #3 { \str_tail:n {##1} }
- \use_i:nn
- }
- }
- { \@@_tmp:w { ##1 #2 ##2 } ##3 \q_stop }
- }
- \@@_tmp:w { } #1 #2 \q_stop
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
-% \begin{macro}[EXP]{\@@_list_aux:n}
-% A function to list all files used to the log, without duplicates.
-% In package mode, if \cs{@filelist} is still defined, we need to take
-% this list of file names into account (we capture it
-% \cs{AtBeginDocument} into \cs{g_@@_record_seq}), turning it to a
-% string (this does not affect the commas of this comma list).
-% \begin{macrocode}
-\cs_new_protected:Npn \file_show_list: { \@@_list:N \msg_show:nnxxxx }
-\cs_new_protected:Npn \file_log_list: { \@@_list:N \msg_log:nnxxxx }
-\cs_new_protected:Npn \@@_list:N #1
- {
- \seq_clear:N \l_@@_tmp_seq
-%<*package>
- \clist_if_exist:NT \@filelist
- {
- \exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
- { \tl_to_str:N \@filelist }
- }
-%</package>
- \seq_concat:NNN \l_@@_tmp_seq \l_@@_tmp_seq \g_@@_record_seq
- \seq_remove_duplicates:N \l_@@_tmp_seq
- #1 { LaTeX/kernel } { file-list }
- { \seq_map_function:NN \l_@@_tmp_seq \@@_list_aux:n } { } { } { }
- }
-\cs_new:Npn \@@_list_aux:n #1 { \iow_newline: #1 }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% When used as a package, there is a need to hold onto the standard file
-% list as well as the new one here. File names recorded in
-% \cs{@filelist} must be turned to strings before being added to
-% \cs{g_@@_record_seq}.
-% \begin{macrocode}
-%<*package>
-\AtBeginDocument
- {
- \exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
- { \tl_to_str:N \@filelist }
- \seq_gconcat:NNN \g_@@_record_seq \g_@@_record_seq \l_@@_tmp_seq
- }
-%</package>
-% \end{macrocode}
-%
% \subsection{Input operations}
%
% \begin{macrocode}
@@ -1195,15 +704,14 @@
% underlying mechanism needs to be queried. For \LaTeXe{} and plain \TeX{}
% this data is stored in |\count16|: with the \pkg{etex} package loaded
% we need to subtract $1$ as the register holds the number of the next
-% stream to use. In Con\TeX{}t, we need to look at |\count38| but there
+% stream to use. In \ConTeXt{}, we need to look at |\count38| but there
% is no subtraction: like the original plain \TeX{}/\LaTeXe{} mechanism
% it holds the value of the \emph{last} stream allocated.
% \begin{macrocode}
\prop_new:N \g_@@_streams_prop
%<*package>
-\int_step_inline:nnnn
+\int_step_inline:nnn
{ 0 }
- { 1 }
{
\cs_if_exist:NTF \normalend
{ \tex_count:D 38 ~ }
@@ -1242,11 +750,18 @@
% Use the conditional version, with an error if the file is not found.
% \begin{macrocode}
\cs_new_protected:Npn \ior_open:Nn #1#2
- { \ior_open:NnF #1 {#2} { \__file_missing:n {#2} } }
+ { \ior_open:NnF #1 {#2} { \__kernel_file_missing:n {#2} } }
\cs_generate_variant:Nn \ior_open:Nn { c }
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\l_@@_file_name_str}
+% Data storage.
+% \begin{macrocode}
+\str_new:N \l_@@_file_name_str
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[TF]{\ior_open:Nn, \ior_open:cn}
% An auxiliary searches for the file in the \TeX{}, \LaTeXe{} and
% \LaTeX3 paths. Then pass the file found to the lower-level function
@@ -1255,11 +770,11 @@
% \begin{macrocode}
\prg_new_protected_conditional:Npnn \ior_open:Nn #1#2 { T , F , TF }
{
- \file_get_full_name:nN {#2} \l__file_full_name_str
- \str_if_empty:NTF \l__file_full_name_str
+ \file_get_full_name:nN {#2} \l_@@_file_name_str
+ \str_if_empty:NTF \l_@@_file_name_str
{ \prg_return_false: }
{
- \@@_open:No #1 \l__file_full_name_str
+ \__kernel_ior_open:No #1 \l_@@_file_name_str
\prg_return_true:
}
}
@@ -1283,7 +798,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_open:Nn, \@@_open:No}
+% \begin{macro}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
% \begin{macro}{\@@_open_stream:Nn}
% The stream allocation itself uses the fact that there is a list of all of
% those available, so allocation is simply a question of using the number at
@@ -1293,7 +808,7 @@
% are tracked, so we first try those. If that fails, ask plain \TeX{} or \LaTeXe{}
% for a new stream and use that number (after a bit of conversion).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_open:Nn #1#2
+\cs_new_protected:Npn \__kernel_ior_open:Nn #1#2
{
\ior_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
@@ -1309,7 +824,7 @@
}
%</package>
}
-\cs_generate_variant:Nn \@@_open:Nn { No }
+\cs_generate_variant:Nn \__kernel_ior_open:Nn { No }
\cs_new_protected:Npn \@@_open_stream:Nn #1#2
{
\tex_global:D \tex_chardef:D #1 = \l_@@_stream_tl \scan_stop:
@@ -1412,16 +927,16 @@
%
% \begin{macro}{\ior_str_get:NN}
% Reading as strings is a more complicated wrapper, as we wish to
-% remove the endline character.
+% remove the endline character and restore it afterwards.
% \begin{macrocode}
\cs_new_protected:Npn \ior_str_get:NN #1#2
{
- \use:x
+ \exp_args:Nno \use:n
{
\int_set:Nn \tex_endlinechar:D { -1 }
- \exp_not:n { \etex_readline:D #1 to #2 }
- \int_set:Nn \tex_endlinechar:D { \int_use:N \tex_endlinechar:D }
- }
+ \etex_readline:D #1 to #2
+ \int_set:Nn \tex_endlinechar:D
+ } { \int_use:N \tex_endlinechar:D }
}
% \end{macrocode}
% \end{macro}
@@ -1430,9 +945,9 @@
% Usual map breaking functions.
% \begin{macrocode}
\cs_new:Npn \ior_map_break:
- { \__prg_map_break:Nn \ior_map_break: { } }
+ { \prg_map_break:Nn \ior_map_break: { } }
\cs_new:Npn \ior_map_break:n
- { \__prg_map_break:Nn \ior_map_break: }
+ { \prg_map_break:Nn \ior_map_break: }
% \end{macrocode}
% \end{macro}
%
@@ -1453,16 +968,16 @@
{ \@@_map_inline:NNn \ior_str_get:NN }
\cs_new_protected:Npn \@@_map_inline:NNn
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:Nc \@@_map_inline:NNNn
- { __prg_map_ \int_use:N \g__prg_map_int :n }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :n }
}
\cs_new_protected:Npn \@@_map_inline:NNNn #1#2#3#4
{
\cs_gset_protected:Npn #1 ##1 {#4}
\ior_if_eof:NF #3 { \@@_map_inline_loop:NNN #1#2#3 }
- \__prg_break_point:Nn \ior_map_break:
- { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \ior_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
\cs_new_protected:Npn \@@_map_inline_loop:NNN #1#2#3
{
@@ -1481,13 +996,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{variable}{\g__file_internal_ior}
-% Needed by the higher-level code, but cannot be created until here.
-% \begin{macrocode}
-\ior_new:N \g__file_internal_ior
-% \end{macrocode}
-% \end{variable}
-%
% \subsection{Output operations}
%
% \begin{macrocode}
@@ -1510,12 +1018,10 @@
\int_const:Nn \c_log_iow { -1 }
\int_const:Nn \c_term_iow
{
- \cs_if_exist:NTF \luatex_directlua:D
- {
- \int_compare:nNnTF \luatex_luatexversion:D > { 80 }
- { 128 }
- { 16 }
- }
+ \bool_lazy_and:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \int_compare_p:nNn \luatex_luatexversion:D > { 80 } }
+ { 128 }
{ 16 }
}
% \end{macrocode}
@@ -1522,18 +1028,20 @@
% \end{variable}
%
% \begin{variable}{\g_@@_streams_seq}
-% A list of the currently-available output streams to be used as a stack.
+% A list of the currently-available output streams to be used as a
+% stack. The stream $18$ is special, as \tn{write}18 is used to
+% denote commands to be sent to the OS\@.
% \begin{macrocode}
\seq_new:N \g_@@_streams_seq
%<*initex>
-\use:x
+\exp_args:Nnx \use:n
+ { \seq_gset_split:Nnn \g_@@_streams_seq { } }
{
- \exp_not:n { \seq_gset_split:Nnn \g_@@_streams_seq { } }
- {
- \int_step_function:nnnN { 0 } { 1 } { \c_term_iow }
- \prg_do_nothing:
- }
+ \int_step_function:nnN { 0 } { \c_term_iow }
+ \prg_do_nothing:
}
+\int_compare:nNnF \c_term_iow < { 18 }
+ { \seq_gremove_all:Nn \g_@@_streams_seq { 18 } }
%</initex>
% \end{macrocode}
% \end{variable}
@@ -1551,9 +1059,8 @@
% \begin{macrocode}
\prop_new:N \g_@@_streams_prop
%<*package>
-\int_step_inline:nnnn
+\int_step_inline:nnn
{ 0 }
- { 1 }
{
\cs_if_exist:NTF \normalend
{ \tex_count:D 39 ~ }
@@ -1599,6 +1106,13 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\l_@@_file_name_str}
+% Data storage.
+% \begin{macrocode}
+\str_new:N \l_@@_file_name_str
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\iow_open:Nn, \iow_open:cn}
% \begin{macro}{\@@_open_stream:Nn, \@@_open_stream:NV}
% The same idea as for reading, but without the path and without the need
@@ -1606,10 +1120,10 @@
% \begin{macrocode}
\cs_new_protected:Npn \iow_open:Nn #1#2
{
- \__file_name_sanitize:nN {#2} \l__file_base_name_str
+ \__kernel_file_name_sanitize:nN {#2} \l_@@_file_name_str
\iow_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
- { \@@_open_stream:NV #1 \l__file_base_name_str }
+ { \@@_open_stream:NV #1 \l_@@_file_name_str }
%<*initex>
{ \__kernel_msg_fatal:nn { kernel } { output-streams-exhausted } }
%</initex>
@@ -1617,7 +1131,7 @@
{
\@@_new:N #1
\tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
- \@@_open_stream:NV #1 \l__file_base_name_str
+ \@@_open_stream:NV #1 \l_@@_file_name_str
}
%</package>
}
@@ -1697,20 +1211,20 @@
%
% \subsubsection{Immediate writing}
%
-% \begin{macro}{\@@_with:Nnn}
-% \begin{macro}{\@@_with_aux:nNnn}
+% \begin{macro}{\__kernel_iow_with:Nnn}
+% \begin{macro}{\@@_with:nNnn}
% If the integer~|#1| is equal to~|#2|, just leave~|#3| in the input
% stream. Otherwise, pass the old value to an auxiliary, which sets
% the integer to the new value, runs the code, and restores the
% integer.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_with:Nnn #1#2
+\cs_new_protected:Npn \__kernel_iow_with:Nnn #1#2
{
\int_compare:nNnTF {#1} = {#2}
{ \use:n }
- { \exp_args:No \@@_with_aux:nNnn { \int_use:N #1 } #1 {#2} }
+ { \exp_args:No \@@_with:nNnn { \int_use:N #1 } #1 {#2} }
}
-\cs_new_protected:Npn \@@_with_aux:nNnn #1#2#3#4
+\cs_new_protected:Npn \@@_with:nNnn #1#2#3#4
{
\int_set:Nn #2 {#3}
#4
@@ -1728,7 +1242,7 @@
% get the |Nx| variant, because it differs in subtle ways from
% \texttt{x}-expansion, namely, macro parameter characters would not
% need to be doubled. We set the \tn{newlinechar} to~$10$ using
-% \cs{@@_with:Nnn} to support formats such as plain \TeX{}: otherwise,
+% \cs{__kernel_iow_with:Nnn} to support formats such as plain \TeX{}: otherwise,
% \cs{iow_newline:} would not work. We do not do this for
% \cs{iow_shipout:Nn} or \cs{iow_shipout_x:Nn}, as \TeX{} looks at the
% value of the \tn{newlinechar} at shipout time in those cases.
@@ -1735,7 +1249,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \iow_now:Nn #1#2
{
- \@@_with:Nnn \tex_newlinechar:D { `\^^J }
+ \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
{ \tex_immediate:D \tex_write:D #1 { \exp_not:n {#2} } }
}
\cs_generate_variant:Nn \iow_now:Nn { c, Nx, cx }
@@ -1781,7 +1295,7 @@
% This is the \enquote{raw} number of characters in a line which
% can be written to the terminal.
% The standard value is the line length typically used by
-% \TeX{}Live and Mik\TeX{}.
+% \TeX{}Live and \hologo{MiKTeX}.
% \begin{macrocode}
\int_new:N \l_iow_line_count_int
\int_set:Nn \l_iow_line_count_int { 78 }
@@ -1819,8 +1333,9 @@
\cs_new_protected:Npn \@@_set_indent:n #1
{
\tl_set:Nx \l_@@_one_indent_tl
- { \exp_args:No \__str_to_other_fast:n { \tl_to_str:n {#1} } }
- \int_set:Nn \l_@@_one_indent_int { \str_count:N \l_@@_one_indent_tl }
+ { \exp_args:No \__kernel_str_to_other_fast:n { \tl_to_str:n {#1} } }
+ \int_set:Nn \l_@@_one_indent_int
+ { \str_count:N \l_@@_one_indent_tl }
\exp_last_unbraced:NNo
\cs_set:Npn \@@_unindent:w \l_@@_one_indent_tl { }
}
@@ -1940,10 +1455,14 @@
% \verb*|\ | uses an \enquote{other} space rather than a normal space,
% because the latter might be absorbed by \TeX{} to end a number or
% other \texttt{f}-type expansions.
+% Use \cs{conditionally at traceoff} if defined; it is introduced by the
+% \pkg{trace} package and suppresses uninteresting tracing of the
+% wrapping code.
% \begin{macrocode}
\cs_new_protected:Npn \iow_wrap:nnnN #1#2#3#4
{
\group_begin:
+%<package> \use:c { conditionally at traceoff }
\int_set:Nn \tex_escapechar:D { -1 }
\cs_set:Npx \{ { \token_to_str:N \{ }
\cs_set:Npx \# { \token_to_str:N \# }
@@ -2004,7 +1523,7 @@
{
\tl_set:Nx \l_@@_wrap_tl
{
- \exp_args:No \__str_to_other_fast:n \l_@@_wrap_tl
+ \exp_args:No \__kernel_str_to_other_fast:n \l_@@_wrap_tl
\c_@@_wrap_end_marker_tl
}
\tl_set:Nx \l_@@_wrap_tl
@@ -2115,7 +1634,7 @@
\tex_edef:D \l_@@_line_part_tl { \if_false: } \fi:
#1
\exp_after:wN \@@_wrap_line_loop:w
- \__int_value:w \__int_eval:w
+ \int_value:w \int_eval:w
}
\cs_new:Npn \@@_wrap_line_loop:w #1 ; #2#3#4#5#6#7#8#9
{
@@ -2124,7 +1643,7 @@
\fi:
#2 #3 #4 #5 #6 #7 #8 #9
\exp_after:wN \@@_wrap_line_loop:w
- \__int_value:w \__int_eval:w #1 - 8 ;
+ \int_value:w \int_eval:w #1 - 8 ;
}
\cs_new:Npn \@@_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 ;
{
@@ -2148,7 +1667,7 @@
\cs_new:Npn \@@_wrap_line_end:NnnnnnnnN #1#2#3#4#5#6#7#8#9
{
#2 #3 #4 #5 #6 #7 #8
- \use_none:nnnnn \__int_eval:w 8 - ; #9
+ \use_none:nnnnn \int_eval:w 8 - ; #9
\token_if_eq_charcode:NNTF \c_space_token #9
{ \@@_wrap_line_end:nw { } }
{ \if_false: { \fi: } \@@_wrap_break:w #9 }
@@ -2160,7 +1679,7 @@
\@@_wrap_next_line:w
}
\cs_new:Npn \@@_wrap_end_chunk:w
- #1 \__int_eval:w #2 - #3 ; #4#5 \q_stop
+ #1 \int_eval:w #2 - #3 ; #4#5 \q_stop
{
\if_false: { \fi: }
\exp_args:Nf \@@_wrap_next:nw { \int_eval:n { #2 - #4 } }
@@ -2333,16 +1852,453 @@
% \begin{macro}[EXP]{\@@_wrap_trim:N, \@@_wrap_trim:w}
% Remove one trailing \enquote{other} space from the argument.
% \begin{macrocode}
-\cs_set_protected:Npn \@@_tmp:w #1
+\cs_new:Npn \@@_wrap_trim:N #1
+ { \tl_if_empty:NF #1 { \exp_after:wN \@@_wrap_trim:w #1 \q_stop } }
+\exp_last_unbraced:NNNNo
+ \cs_new:Npn \@@_wrap_trim:w #1 \c_catcode_other_space_tl \q_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=file>
+% \end{macrocode}
+%
+% \subsection{File operations}
+%
+% \begin{variable}{\g_@@_internal_ior}
+% A reserved stream to test for file existence.
+% \begin{macrocode}
+\ior_new:N \g_@@_internal_ior
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {
+% \g_file_curr_dir_str ,
+% \g_file_curr_ext_str ,
+% \g_file_curr_name_str
+% }
+% The name of the current file should be available at all times.
+% For the format the file name needs to be picked up at the start of the
+% run. In \LaTeXe{} package mode the current file name is collected from
+% \tn{@currname}.
+% \begin{macrocode}
+\str_new:N \g_file_curr_dir_str
+\str_new:N \g_file_curr_ext_str
+\str_new:N \g_file_curr_name_str
+%<*initex>
+\tex_everyjob:D \exp_after:wN
{
- \cs_new:Npn \@@_wrap_trim:N ##1
- { \tl_if_empty:NF ##1 { \exp_after:wN \@@_wrap_trim:w ##1 \q_stop } }
- \cs_new:Npn \@@_wrap_trim:w ##1 #1 \q_stop {##1}
+ \tex_the:D \tex_everyjob:D
+ \str_gset:Nx \g_file_curr_name_str { \tex_jobname:D }
}
-\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
+%</initex>
+%<*package>
+\cs_if_exist:NT \@currname
+ { \str_gset_eq:NN \g_file_curr_name_str \@currname }
+%</package>
% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_stack_seq}
+% The input list of files is stored as a sequence stack. In package
+% mode we can recover the information from the details held by
+% \LaTeXe{} (we must be in the preamble and loaded using \tn{usepackage}
+% or \tn{RequirePackage}). As \LaTeXe{} doesn't store directory and
+% name separately, we stick to the same convention here.
+% \begin{macrocode}
+\seq_new:N \g_@@_stack_seq
+%<*package>
+\group_begin:
+ \cs_set_protected:Npn \@@_tmp:w #1#2#3
+ {
+ \tl_if_blank:nTF {#1}
+ {
+ \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \q_stop
+ { { } {##2} { } }
+ \seq_gput_right:Nx \g_@@_stack_seq
+ {
+ \exp_after:wN \@@_tmp:w \tex_jobname:D
+ " \tex_jobname:D " \q_stop
+ }
+ }
+ {
+ \seq_gput_right:Nn \g_@@_stack_seq { { } {#1} {#2} }
+ \@@_tmp:w
+ }
+ }
+ \cs_if_exist:NT \@currnamestack
+ { \exp_after:wN \@@_tmp:w \@currnamestack }
+\group_end:
+%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_record_seq}
+% The total list of files used is recorded separately from the current
+% file stack, as nothing is ever popped from this list. The current
+% file name should be included in the file list! In format mode, this
+% is done at the very start of the \TeX{} run. In package mode we
+% will eventually copy the contents of \cs{@filelist}.
+% \begin{macrocode}
+\seq_new:N \g_@@_record_seq
+%<*initex>
+\tex_everyjob:D \exp_after:wN
+ {
+ \tex_the:D \tex_everyjob:D
+ \seq_gput_right:NV \g_@@_record_seq \g_file_curr_name_str
+ }
+%</initex>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_tmp_tl}
+% Used as a short-term scratch variable.
+% \begin{macrocode}
+\tl_new:N \l_@@_tmp_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_base_name_str, \l_@@_full_name_str}
+% For storing the basename and full path whilst passing data internally.
+% \begin{macrocode}
+\str_new:N \l_@@_base_name_str
+\str_new:N \l_@@_full_name_str
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_dir_str, \l_@@_ext_str, \l_@@_name_str}
+% Used in parsing a path into parts: in contrast to the above, these are
+% never used outside of the current module.
+% \begin{macrocode}
+\str_new:N \l_@@_dir_str
+\str_new:N \l_@@_ext_str
+\str_new:N \l_@@_name_str
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_file_search_path_seq}
+% The current search path.
+% \begin{macrocode}
+\seq_new:N \l_file_search_path_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_tmp_seq}
+% Scratch space for comma list conversion in package mode.
+% \begin{macrocode}
+%<*package>
+\seq_new:N \l_@@_tmp_seq
+%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\__kernel_file_name_sanitize:nN}
+% \begin{macro}{\@@_name_quote:nN}
+% \begin{macro}{\@@_name_sanitize_aux:n}
+% For converting a token list to a string where active characters are treated
+% as strings from the start. The logic to the quoting normalisation is the
+% same as used by \texttt{lualatexquotejobname}: check for balanced |"|, and
+% assuming they balance strip all of them out before quoting the entire name
+% if it contains spaces.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_file_name_sanitize:nN #1#2
+ {
+ \group_begin:
+ \seq_map_inline:Nn \l_char_active_seq
+ {
+ \tl_set:Nx \l_@@_tmp_tl { \iow_char:N ##1 }
+ \char_set_active_eq:NN ##1 \l_@@_tmp_tl
+ }
+ \tl_set:Nx \l_@@_tmp_tl {#1}
+ \tl_set:Nx \l_@@_tmp_tl
+ { \tl_to_str:N \l_@@_tmp_tl }
+ \exp_args:NNNV \group_end:
+ \str_set:Nn #2 \l_@@_tmp_tl
+ }
+\cs_new_protected:Npn \@@_name_quote:nN #1#2
+ {
+ \str_set:Nx #2 {#1}
+ \int_if_even:nF
+ { 0 \tl_map_function:NN #2 \@@_name_quote_aux:n }
+ {
+ \__kernel_msg_error:nnx
+ { kernel } { unbalanced-quote-in-filename } {#2}
+ }
+ \tl_remove_all:Nn #2 { " }
+ \tl_if_in:NnT #2 { ~ }
+ { \str_set:Nx #2 { " \exp_not:V #2 " } }
+ }
+\cs_new:Npn \@@_name_quote_aux:n #1
+ { \token_if_eq_charcode:NNT #1 " { + 1 } }
+% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\file_get_full_name:nN, \file_get_full_name:VN}
+% \begin{macro}{\@@_get_full_name_search:nN}
+% The way to test if a file exists is to try to open it: if it does
+% not exist then \TeX{} reports end-of-file. A search is made
+% looking at each potential path in turn (starting from the current
+% directory). The first location is of course treated as the correct
+% one: this is done by jumping to \cs{prg_break_point:}. If nothing
+% is found, |#2| is returned empty. A special case when there is no
+% extension is that once the first location is found we test the
+% existence of the file with |.tex| extension in that directory, and
+% if it exists we include the |.tex| extension in the result.
+% \begin{macrocode}
+\cs_new_protected:Npn \file_get_full_name:nN #1#2
+ {
+ \__kernel_file_name_sanitize:nN {#1} \l_@@_base_name_str
+ \@@_get_full_name_search:nN { } \use:n
+ \seq_map_inline:Nn \l_file_search_path_seq
+ { \@@_get_full_name_search:nN { ##1 / } \seq_map_break:n }
+%<*package>
+ \cs_if_exist:NT \input at path
+ {
+ \tl_map_inline:Nn \input at path
+ { \@@_get_full_name_search:nN { ##1 } \tl_map_break:n }
+ }
+%</package>
+ \str_clear:N \l_@@_full_name_str
+ \prg_break_point:
+ \str_if_empty:NF \l_@@_full_name_str
+ {
+ \exp_args:NV \file_parse_full_name:nNNN \l_@@_full_name_str
+ \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+ \str_if_empty:NT \l_@@_ext_str
+ {
+ \__kernel_ior_open:No \g_@@_internal_ior
+ { \l_@@_full_name_str .tex }
+ \ior_if_eof:NF \g_@@_internal_ior
+ { \str_put_right:Nn \l_@@_full_name_str { .tex } }
+ }
+ }
+ \str_set_eq:NN #2 \l_@@_full_name_str
+ \ior_close:N \g_@@_internal_ior
+ }
+\cs_generate_variant:Nn \file_get_full_name:nN { V }
+\cs_new_protected:Npn \@@_get_full_name_search:nN #1#2
+ {
+ \@@_name_quote:nN
+ { \tl_to_str:n {#1} \l_@@_base_name_str }
+ \l_@@_full_name_str
+ \__kernel_ior_open:No \g_@@_internal_ior \l_@@_full_name_str
+ \ior_if_eof:NF \g_@@_internal_ior { #2 { \prg_break: } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[TF]{\file_if_exist:n}
+% The test for the existence of a file is a wrapper around the function to
+% add a path to a file. If the file was found, the path contains
+% something, whereas if the file was not located then the return value
+% is empty.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF }
+ {
+ \file_get_full_name:nN {#1} \l_@@_full_name_str
+ \str_if_empty:NTF \l_@@_full_name_str
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\__kernel_file_missing:n}
+% An error message for a missing file, also used in \cs{ior_open:Nn}.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_file_missing:n #1
+ {
+ \__kernel_file_name_sanitize:nN {#1} \l_@@_base_name_str
+ \__kernel_msg_error:nnx { kernel } { file-not-found }
+ { \l_@@_base_name_str }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\file_input:n}
+% \begin{macro}{\@@_input:n, \@@_input:V}
+% \begin{macro}{\@@_input_push:n, \__kernel_file_input_push:n}
+% \begin{macro}{\@@_input_pop:, \__kernel_file_input_pop:}
+% \begin{macro}{\@@_input_pop:nnn}
+% Loading a file is done in a safe way, checking first that the file
+% exists and loading only if it does. Push the file name on the
+% \cs{g_@@_stack_seq}, and add it to the file list, either
+% \cs{g_@@_record_seq}, or \cs{@filelist} in package mode.
+% \begin{macrocode}
+\cs_new_protected:Npn \file_input:n #1
+ {
+ \file_get_full_name:nN {#1} \l_@@_full_name_str
+ \str_if_empty:NTF \l_@@_full_name_str
+ { \__kernel_file_missing:n {#1} }
+ { \@@_input:V \l_@@_full_name_str }
+ }
+\cs_new_protected:Npn \@@_input:n #1
+ {
+%<*initex>
+ \seq_gput_right:Nn \g_@@_record_seq {#1}
+%</initex>
+%<*package>
+ \clist_if_exist:NTF \@filelist
+ { \@addtofilelist {#1} }
+ { \seq_gput_right:Nn \g_@@_record_seq {#1} }
+%</package>
+ \@@_input_push:n {#1}
+ \tex_input:D #1 \c_space_tl
+ \@@_input_pop:
+ }
+\cs_generate_variant:Nn \@@_input:n { V }
+% \end{macrocode}
+% Keeping a track of the file data is easy enough: we store the separated
+% parts so we do not need to parse them twice.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_input_push:n #1
+ {
+ \seq_gpush:Nx \g_@@_stack_seq
+ {
+ { \g_file_curr_dir_str }
+ { \g_file_curr_name_str }
+ { \g_file_curr_ext_str }
+ }
+ \file_parse_full_name:nNNN {#1}
+ \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+ \str_gset_eq:NN \g_file_curr_dir_str \l_@@_dir_str
+ \str_gset_eq:NN \g_file_curr_name_str \l_@@_name_str
+ \str_gset_eq:NN \g_file_curr_ext_str \l_@@_ext_str
+ }
+%<*package>
+\cs_new_eq:NN \__kernel_file_input_push:n \__file_input_push:n
+%</package>
+\cs_new_protected:Npn \@@_input_pop:
+ {
+ \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl
+ \exp_after:wN \@@_input_pop:nnn \l_@@_tmp_tl
+ }
+%<*package>
+\cs_new_eq:NN \__kernel_file_input_pop: \__file_input_pop:
+%</package>
+\cs_new_protected:Npn \@@_input_pop:nnn #1#2#3
+ {
+ \str_gset:Nn \g_file_curr_dir_str {#1}
+ \str_gset:Nn \g_file_curr_name_str {#2}
+ \str_gset:Nn \g_file_curr_ext_str {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\file_parse_full_name:nNNN}
+% \begin{macro}
+% {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
+% Parsing starts by stripping off any surrounding quotes. Then find
+% the directory |#4| by splitting at the last~|/|. (The auxiliary
+% returns \texttt{true}/\texttt{false} depending on whether it found
+% the delimiter.) We correct for the case of a file in the root |/|,
+% as in that case we wish to keep the trailing (and only) slash. Then
+% split the base name |#5| at the last dot. If there was indeed a
+% dot, |#5| contains the name and |#6| the extension without the dot,
+% which we add back for convenience. In the special case of no
+% extension given, the auxiliary stored the name into |#6|, we just
+% have to move it to |#5|.
+% \begin{macrocode}
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
+ {
+ \exp_after:wN \@@_parse_full_name_auxi:w
+ \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4
+ }
+\cs_new_protected:Npn \@@_parse_full_name_auxi:w
+ #1 " #2 " #3 \q_stop #4#5#6
+ {
+ \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
+ { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
+ { }
+ \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
+ { \str_put_left:Nn #6 { . } }
+ {
+ \str_set_eq:NN #5 #6
+ \str_clear:N #6
+ }
+ }
+\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
+ {
+ \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \q_stop
+ {
+ \tl_if_empty:nTF {##3}
+ {
+ \str_set:Nn #4 {##2}
+ \tl_if_empty:nTF {##1}
+ {
+ \str_clear:N #3
+ \use_ii:nn
+ }
+ {
+ \str_set:Nx #3 { \str_tail:n {##1} }
+ \use_i:nn
+ }
+ }
+ { \@@_tmp:w { ##1 #2 ##2 } ##3 \q_stop }
+ }
+ \@@_tmp:w { } #1 #2 \q_stop
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
+% \begin{macro}[EXP]{\@@_list_aux:n}
+% A function to list all files used to the log, without duplicates.
+% In package mode, if \cs{@filelist} is still defined, we need to take
+% this list of file names into account (we capture it
+% \cs{AtBeginDocument} into \cs{g_@@_record_seq}), turning it to a
+% string (this does not affect the commas of this comma list).
+% \begin{macrocode}
+\cs_new_protected:Npn \file_show_list: { \@@_list:N \msg_show:nnxxxx }
+\cs_new_protected:Npn \file_log_list: { \@@_list:N \msg_log:nnxxxx }
+\cs_new_protected:Npn \@@_list:N #1
+ {
+ \seq_clear:N \l_@@_tmp_seq
+%<*package>
+ \clist_if_exist:NT \@filelist
+ {
+ \exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
+ { \tl_to_str:N \@filelist }
+ }
+%</package>
+ \seq_concat:NNN \l_@@_tmp_seq \l_@@_tmp_seq \g_@@_record_seq
+ \seq_remove_duplicates:N \l_@@_tmp_seq
+ #1 { LaTeX/kernel } { file-list }
+ { \seq_map_function:NN \l_@@_tmp_seq \@@_list_aux:n }
+ { } { } { }
+ }
+\cs_new:Npn \@@_list_aux:n #1 { \iow_newline: #1 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% When used as a package, there is a need to hold onto the standard file
+% list as well as the new one here. File names recorded in
+% \cs{@filelist} must be turned to strings before being added to
+% \cs{g_@@_record_seq}.
+% \begin{macrocode}
+%<*package>
+\AtBeginDocument
+ {
+ \exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
+ { \tl_to_str:N \@filelist }
+ \seq_gconcat:NNN
+ \g_@@_record_seq
+ \g_@@_record_seq
+ \l_@@_tmp_seq
+ }
+%</package>
+% \end{macrocode}
+%
% \subsection{Messages}
%
% \begin{macrocode}
@@ -2399,7 +2355,7 @@
\tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
\__kernel_deprecation_code:nn
{
- \__deprecation_error:Nnn \g_file_current_name_tl
+ \__kernel_deprecation_error:Nnn \g_file_current_name_tl
{ \g_file_curr_name_str } { 2018-12-31 }
}
{ \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
@@ -2414,16 +2370,16 @@
{ \seq_put_right:Nn \l_file_search_path_seq }
\cs_new_protected:Npn \file_path_include:n #1
{
- \__file_name_sanitize:nN {#1} \l__file_full_name_str
- \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
- { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
+ \__kernel_file_name_sanitize:nN {#1} \l_@@_full_name_str
+ \seq_if_in:NVF \l_file_search_path_seq \l_@@_full_name_str
+ { \seq_put_right:NV \l_file_search_path_seq \l_@@_full_name_str }
}
\__kernel_patch_deprecation:nnNNpn { 2018-12-31 }
{ \seq_remove_all:Nn \l_file_search_path_seq }
\cs_new_protected:Npn \file_path_remove:n #1
{
- \__file_name_sanitize:nN {#1} \l__file_full_name_str
- \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str
+ \__kernel_file_name_sanitize:nN {#1} \l_@@_full_name_str
+ \seq_remove_all:NV \l_file_search_path_seq \l_@@_full_name_str
}
% \end{macrocode}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3final.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3final.dtx Copyright (C) 1990-2018 The 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
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -63,7 +63,11 @@
%
% \subsection{Input encoding}
%
-% The letters |a|--|z| and |A|--|Z| have the correct catcode directly from Ini\TeX{}
+% \begin{macrocode}
+%<@@=char>
+% \end{macrocode}
+%
+% The letters |a|--|z| and |A|--|Z| have the correct catcode directly from \IniTeX{}
% while for Unicode engines (almost) all characters to be treated as letters
% are defined by the automatic data parsing. Thus the changes here are to
% deal with the additional cases.
@@ -71,10 +75,10 @@
% All the characters in the range $0$--$31$ \emph{except} tab (|^^I|), nl
% (|^^J|), ff (|^^L|) and cr (|^^M|).
% \begin{macrocode}
-\int_step_inline:nnnn { 0 } { 1 } { `\^^H }
+\int_step_inline:nnn { 0 } { `\^^H }
{ \char_set_catcode_invalid:n {#1} }
\char_set_catcode_invalid:n { `\^^K }
-\int_step_inline:nnnn { `\^^N } { 1 } { 31 }
+\int_step_inline:nnn { `\^^N } { 31 }
{ \char_set_catcode_invalid:n {#1} }
% \end{macrocode}
% The same is true for the top of the $7$-bit range.
@@ -122,7 +126,7 @@
% \end{macrocode}
% The actual mappings: these are kept low-level for performance reasons.
% \begin{macrocode}
- \cs_new:cpn { __char_active_C3:N } #1
+ \cs_new:cpn { @@_active_C3:N } #1
{
\if_meaning:w #1 ^^9f ^^ff \else: % ß - U+00DF - germandbls
\if_meaning:w #1 ^^a0 ^^e0 \else: % à - U+00E0 - agrave
@@ -160,7 +164,7 @@
\fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
\fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
}
- \cs_new:cpn { __char_active_C4:N } #1
+ \cs_new:cpn { @@_active_C4:N } #1
{
\if_meaning:w #1 ^^83 ^^a0 \else: % ă - U+0103 - abreve
\if_meaning:w #1 ^^85 ^^a1 \else: % ą - U+0105 - aogonek
@@ -178,7 +182,7 @@
\__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
\fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
}
- \cs_new:cpn { __char_active_C5:N } #1
+ \cs_new:cpn { @@_active_C5:N } #1
{
\if_meaning:w #1 ^^82 ^^aa \else: % ł - U+0142 - lslash
\if_meaning:w #1 ^^84 ^^ab \else: % ń - U+0144 - nacute
@@ -201,7 +205,7 @@
\fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
\fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
}
- \cs_new:cpn { __char_active_C8:N } #1
+ \cs_new:cpn { @@_active_C8:N } #1
{
\if_meaning:w #1 ^^99 ^^b3 \else: % ș - U+0219 - scommaaccent
\if_meaning:w #1 ^^9b ^^b5 \else: % ț - U+021B - tcommaaccent
@@ -215,7 +219,7 @@
\clist_map_inline:nn { C3 , C4 , C5 , C8 }
{
\char_set_catcode_active:n { "#1 }
- \char_set_active_eq:nc { "#1 } { __char_active_ #1 :N }
+ \char_set_active_eq:nc { "#1 } { @@_active_ #1 :N }
\seq_put_right:Nx \l_char_special_seq
{ \exp_not:c { \char_generate:nn { "#1 } { 12 } } }
\seq_put_right:Nx \l_char_active_seq
@@ -272,7 +276,7 @@
= "[latinmodern-math.otf]/OT:mode=base;script=math;+ssty=0;"~at~7pt \scan_stop:
\tex_font:D \exp_not:c { TU/lmm/m/n/5 }
= "[latinmodern-math.otf]/OT:mode=base;script=math;+ssty=1;"~at~5pt \scan_stop:
- \exp_not:N \int_step_inline:nnnn { 0 } { 1 } { 3 }
+ \exp_not:N \int_step_inline:nnn { 0 } { 3 }
{
\tex_textfont:D ##1 = \exp_not:c { TU/lmm/m/n/10 }
\tex_scriptfont:D ##1 = \exp_not:c { TU/lmm/m/n/7 }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -29,7 +29,7 @@
% \fi
%
% \title{^^A
-% The \textsf{l3flag} package: expandable flags^^A
+% The \textsf{l3flag} package: Expandable flags^^A
% }
%
% \author{^^A
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -204,7 +204,7 @@
\if_cs_exist:w flag~#2~#1 \cs_end:
\cs_set_eq:cN { flag~#2~#1 } \tex_undefined:D
\exp_after:wN \@@_clear:wn
- \__int_value:w \__int_eval:w 1 + #1
+ \int_value:w \int_eval:w 1 + #1
\else:
\use_i:nnn
\fi:
@@ -231,7 +231,7 @@
\cs_new_protected:Npn \flag_log:n { \@@_show:Nn \tl_log:n }
\cs_new_protected:Npn \@@_show:Nn #1#2
{
- \exp_args:Nc \__kernel_check_defined:NT { flag~#2 }
+ \exp_args:Nc \__kernel_chk_defined:NT { flag~#2 }
{
\exp_args:Nx #1
{ \tl_to_str:n { flag~#2~height } = \flag_height:n {#2} }
@@ -249,16 +249,18 @@
% to be patched since some are defined in terms of others.
% \begin{macrocode}
%<*package>
-\tex_ifodd:D \l at expl@enable at debug@bool
- \cs_new:Npn \@@_chk_exist:n #1
- {
- \flag_if_exist:nF {#1}
- {
- \__kernel_msg_expandable_error:nnn
- { kernel } { bad-variable } { flag~#1~ }
- }
- }
-\fi:
+\__kernel_if_debug:TF
+ {
+ \cs_new:Npn \@@_chk_exist:n #1
+ {
+ \flag_if_exist:nF {#1}
+ {
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { bad-variable } { flag~#1~ }
+ }
+ }
+ }
+ { }
%</package>
% \end{macrocode}
% \end{macro}
@@ -300,7 +302,7 @@
\cs_new:Npn \@@_height_loop:wn #1 ; #2
{
\if_cs_exist:w flag~#2~#1 \cs_end:
- \exp_after:wN \@@_height_loop:wn \__int_value:w \__int_eval:w 1 +
+ \exp_after:wN \@@_height_loop:wn \int_value:w \int_eval:w 1 +
\else:
\exp_after:wN \@@_height_end:wn
\fi:
@@ -317,7 +319,7 @@
\cs_new:Npn \flag_raise:n #1
{
\cs:w flag~#1 \exp_after:wN \cs_end:
- \__int_value:w \flag_height:n {#1} ;
+ \int_value:w \flag_height:n {#1} ;
}
% \end{macrocode}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins 2018-04-30 22:39:09 UTC (rev 47516)
@@ -62,15 +62,15 @@
\from{l3expan.dtx} {initex}
\from{l3tl.dtx} {initex}
\from{l3str.dtx} {initex}
+ \from{l3quark.dtx} {package}
\from{l3seq.dtx} {initex}
% ======== FORMAT ONLY =========
\from{l3alloc.dtx} {initex}
% ==============================
\from{l3int.dtx} {initex}
- \from{l3intarray.dtx} {initex}
\from{l3flag.dtx} {initex}
- \from{l3quark.dtx} {initex}
\from{l3prg.dtx} {initex}
+ \from{l3sys.dtx} {initex}
\from{l3clist.dtx} {initex}
\from{l3token.dtx} {initex}
\from{l3prop.dtx} {initex}
@@ -91,17 +91,17 @@
\from{l3fp-trig.dtx} {initex}
\from{l3fp-convert.dtx} {initex}
\from{l3fp-random.dtx} {initex}
+ \from{l3intarray.dtx} {initex}
\from{l3sort.dtx} {initex}
- \from{l3tl-build.dtx} {initex}
\from{l3tl-analysis.dtx}{initex}
\from{l3regex.dtx} {initex}
\from{l3box.dtx} {initex}
\from{l3color-base.dtx} {initex}
\from{l3coffins.dtx} {initex}
- \from{l3sys.dtx} {initex}
+ \from{l3luatex.dtx} {initex,tex}
+ \from{l3unicode.dtx} {initex}
+ \from{l3candidates.dtx} {initex}
\from{l3deprecation.dtx}{initex}
- \from{l3candidates.dtx} {initex}
- \from{l3luatex.dtx} {initex,tex}
% ======== FORMAT ONLY =========
\from{l3final.dtx} {initex}
% ==============================
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
% \maketitle
%
% \begin{documentation}
@@ -172,7 +172,7 @@
\cs_generate_variant:Nn \fp_log:N { c }
\cs_new_protected:Npn \@@_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{ \exp_args:Nx #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
}
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -63,6 +63,20 @@
%
% ^^A todo: make sanitize and pack more homogeneous between modules.
%
+% \subsection{Access to primitives}
+%
+% \begin{macro}{\@@_int_eval:w, \@@_int_eval_end:, \@@_int_to_roman:w}
+% Largely for performance reasons, we need to directly access primitives
+% rather than use \cs{int_eval:n}. This happens \emph{a lot}, so we
+% use private names. The same is true for \tn{romannumeral}, although it
+% is used much less widely.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_int_eval:w \etex_numexpr:D
+\cs_new_eq:NN \@@_int_eval_end: \scan_stop:
+\cs_new_eq:NN \@@_int_to_roman:w \tex_romannumeral:D
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Internal representation}
%
% Internally, a floating point number \meta{X} is a
@@ -223,7 +237,7 @@
% However, when typeset, \cs{s_@@} does nothing, and \cs{@@_chk:w} is
% expanded. We define \cs{@@_chk:w} to produce an error.
% \begin{macrocode}
-\__scan_new:N \s_@@
+\scan_new:N \s_@@
\cs_new_protected:Npn \@@_chk:w #1 ;
{ \@@_misused:n { \s_@@ \@@_chk:w #1 ; } }
% \end{macrocode}
@@ -232,8 +246,8 @@
% \begin{macro}{\s_@@_mark, \s_@@_stop}
% Aliases of \cs{tex_relax:D}, used to terminate expressions.
% \begin{macrocode}
-\__scan_new:N \s_@@_mark
-\__scan_new:N \s_@@_stop
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
% \end{macrocode}
% \end{macro}
%
@@ -245,11 +259,11 @@
% A couple of scan marks used to indicate where special floating point
% numbers come from.
% \begin{macrocode}
-\__scan_new:N \s_@@_invalid
-\__scan_new:N \s_@@_underflow
-\__scan_new:N \s_@@_overflow
-\__scan_new:N \s_@@_division
-\__scan_new:N \s_@@_exact
+\scan_new:N \s_@@_invalid
+\scan_new:N \s_@@_underflow
+\scan_new:N \s_@@_overflow
+\scan_new:N \s_@@_division
+\scan_new:N \s_@@_exact
% \end{macrocode}
% \end{macro}
%
@@ -344,12 +358,12 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_neg_sign:N}
-% When appearing in an integer expression or after \cs{__int_value:w},
+% When appearing in an integer expression or after \cs{int_value:w},
% this expands to the sign opposite to |#1|, namely $0$ (positive) is
% turned to $2$ (negative), $1$ (\texttt{nan}) to $1$, and $2$ to $0$.
% \begin{macrocode}
\cs_new:Npn \@@_neg_sign:N #1
- { \__int_eval:w 2 - #1 \__int_eval_end: }
+ { \@@_int_eval:w 2 - #1 \@@_int_eval_end: }
% \end{macrocode}
% \end{macro}
%
@@ -454,11 +468,11 @@
{
\exp_after:wN \@@_exp_after_normal:Nwwwww
\exp_after:wN #2
- \__int_value:w #3 \exp_after:wN ;
- \__int_value:w 1 #4 \exp_after:wN ;
- \__int_value:w 1 #5 \exp_after:wN ;
- \__int_value:w 1 #6 \exp_after:wN ;
- \__int_value:w 1 #7 \exp_after:wN ; #1
+ \int_value:w #3 \exp_after:wN ;
+ \int_value:w 1 #4 \exp_after:wN ;
+ \int_value:w 1 #5 \exp_after:wN ;
+ \int_value:w 1 #6 \exp_after:wN ;
+ \int_value:w 1 #7 \exp_after:wN ; #1
}
\cs_new:Npn \@@_exp_after_normal:Nwwwww
#1 #2; 1 #3 ; 1 #4 ; 1 #5 ; 1 #6 ;
@@ -477,7 +491,7 @@
% an error, just like usual floating point numbers.
% Tuples may have zero or one element.
% \begin{macrocode}
-\__scan_new:N \s_@@_tuple
+\scan_new:N \s_@@_tuple
\cs_new_protected:Npn \@@_tuple_chk:w #1 ;
{ \@@_misused:n { \s_@@_tuple \@@_tuple_chk:w #1 ; } }
\tl_const:Nn \c_@@_empty_tuple_fp
@@ -497,10 +511,10 @@
{ \@@_tuple_count:w \s_@@_tuple \@@_tuple_chk:w {#1} ; }
\cs_new:Npn \@@_tuple_count:w \s_@@_tuple \@@_tuple_chk:w #1 ;
{
- \__int_value:w \__int_eval:w 0
- \@@_tuple_count_loop:Nw #1 { ? \__prg_break: } ;
- \__prg_break_point:
- \__int_eval_end:
+ \int_value:w \@@_int_eval:w 0
+ \@@_tuple_count_loop:Nw #1 { ? \prg_break: } ;
+ \prg_break_point:
+ \@@_int_eval_end:
}
\cs_new:Npn \@@_tuple_count_loop:Nw #1#2;
{ \use_none:n #1 + 1 \@@_tuple_count_loop:Nw }
@@ -510,7 +524,7 @@
%
% \begin{macro}[EXP]{\@@_if_type_fp:NTwFw}
% Used as \cs{@@_if_type_fp:NTwFw} \meta{marker} \Arg{true code}
-% \cs{s__fp} \Arg{false code} \cs{q_stop}, this test whether the
+% \cs{s_@@} \Arg{false code} \cs{q_stop}, this test whether the
% \meta{marker} is \cs{s_@@} or not and runs the appropriate
% \meta{code}. The very unusual syntax is for optimization purposes
% as that function is used for all floating point operations.
@@ -524,14 +538,14 @@
% \begin{macrocode}
\cs_new:Npn \@@_array_if_all_fp:nTF #1
{
- \@@_array_if_all_fp_loop:w #1 { \s_@@ \__prg_break: } ;
- \__prg_break_point: \use_i:nn
+ \@@_array_if_all_fp_loop:w #1 { \s_@@ \prg_break: } ;
+ \prg_break_point: \use_i:nn
}
\cs_new:Npn \@@_array_if_all_fp_loop:w #1#2 ;
{
\@@_if_type_fp:NTwFw
#1 \@@_array_if_all_fp_loop:w
- \s_@@ { \__prg_break:n \use_iii:nnn }
+ \s_@@ { \prg_break:n \use_iii:nnn }
\q_stop
}
% \end{macrocode}
@@ -557,12 +571,9 @@
\exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
\tl_to_str:n { s_@@ _? } \exp_not:N \q_mark \exp_not:N \q_stop
}
-\use:x
- {
- \cs_new:Npn \exp_not:N \@@_type_from_scan:w
- ##1 \tl_to_str:n { s_@@ } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop
- {##2}
- }
+\exp_last_unbraced:NNNNo
+ \cs_new:Npn \@@_type_from_scan:w #1
+ { \tl_to_str:n { s_@@ } } #2 \q_mark #3 \q_stop {#2}
% \end{macrocode}
% \end{macro}
%
@@ -645,7 +656,8 @@
% \begin{macrocode}
\cs_new:Npn \@@_exp_after_tuple_o:w
{ \@@_exp_after_tuple_f:nw { \exp_after:wN \exp_stop_f: } }
-\cs_new:Npn \@@_exp_after_tuple_f:nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ;
+\cs_new:Npn \@@_exp_after_tuple_f:nw
+ #1 \s_@@_tuple \@@_tuple_chk:w #2 ;
{
\exp_after:wN \s_@@_tuple
\exp_after:wN \@@_tuple_chk:w
@@ -670,7 +682,7 @@
% \begin{verbatim}
% \cs_new:Npn \pack:NNNNNw #1 #2#3#4#5 #6; { {#2#3#4#5} {#6} }
% \exp_after:wN \pack:NNNNNw
-% \__int_value:w \__int_eval:w 1 0000 0000 + #1 ;
+% \__fp_int_value:w \__fp_int_eval:w 1 0000 0000 + #1 ;
% \end{verbatim}
% The idea is that adding $10^8$ to the number ensures that it has
% exactly $9$ digits, and can then easily find which digits correspond
@@ -685,19 +697,19 @@
% 6677\,8899$. With simplified names, we would do
% \begin{verbatim}
% \exp_after:wN \post_processing:w
-% \__int_value:w \__int_eval:w - 5 0000
+% \__fp_int_value:w \__fp_int_eval:w - 5 0000
% \exp_after:wN \pack:NNNNNw
-% \__int_value:w \__int_eval:w 4 9995 0000
+% \__fp_int_value:w \__fp_int_eval:w 4 9995 0000
% + 12345 * 6677
% \exp_after:wN \pack:NNNNNw
-% \__int_value:w \__int_eval:w 5 0000 0000
+% \__fp_int_value:w \__fp_int_eval:w 5 0000 0000
% + 12345 * 8899 ;
% \end{verbatim}
-% The \cs{exp_after:wN} triggers |\__int_value:w \__int_eval:w|, which
+% The \cs{exp_after:wN} triggers \cs{int_value:w} \cs{@@_int_eval:w}, which
% starts a first computation, whose initial value is $- 5\,0000$ (the
% \enquote{leading shift}). In that computation appears an
% \cs{exp_after:wN}, which triggers the nested computation
-% |\__int_value:w \__int_eval:w| with starting value $4\,9995\,0000$ (the
+% \cs{int_value:w} \cs{@@_int_eval:w} with starting value $4\,9995\,0000$ (the
% \enquote{middle shift}). That, in turn, expands \cs{exp_after:wN}
% which triggers the third computation. The third computation's value
% is $5\,0000\,0000 + 12345 \times 8899$, which has $9$ digits. Adding
@@ -858,7 +870,7 @@
\if_meaning:w 2 #1
+ 1
\fi:
- \__int_eval_end:
+ \@@_int_eval_end:
#2#3#4; {#5} ;
}
\cs_new:Npn \@@_basics_pack_weird_high:NNNNNNNNw
@@ -911,10 +923,10 @@
{
\cs:w
@@_decimate_
- \if_int_compare:w \__int_eval:w #1 > \c_@@_prec_int
+ \if_int_compare:w \@@_int_eval:w #1 > \c_@@_prec_int
tiny
\else:
- \__int_to_roman:w \__int_eval:w #1
+ \@@_int_to_roman:w \@@_int_eval:w #1
\fi:
:Nnnnn
\cs_end:
@@ -970,7 +982,7 @@
\cs_new:cpn { @@_decimate_ #1 :Nnnnn } ##1 ##2##3##4##5
{
\exp_after:wN ##1
- \__int_value:w
+ \int_value:w
\exp_after:wN \@@_round_digit:Nw #2 ;
\@@_decimate_pack:nnnnnnnnnnw #3 ;
}
@@ -996,7 +1008,7 @@
%
% \begin{macro}[EXP]{\@@_decimate_pack:nnnnnnnnnnw}
% The computation of the \meta{rounding} digit leaves an unfinished
-% \cs{__int_value:w}, which expands the following functions. This
+% \cs{int_value:w}, which expands the following functions. This
% allows us to repack nicely the digits we keep. Those digits come
% as an alternation of unbraced and braced blocks of $4$ digits,
% such that the first $5$ groups of token consist in $4$ single digits,
@@ -1025,12 +1037,12 @@
% treated using a few standard functions which we define now. A typical
% use context for those functions would be
% \begin{syntax}
-% |\if_case:w| \meta{integer} |\exp_stop_f:|
-% | \@@_case_return_o:Nw| \meta{fp var}
-% |\or: \@@_case_use:nw| \Arg{some computation}
-% |\or: \@@_case_return_same_o:w|
-% |\or: \@@_case_return:nw| \Arg{something}
-% |\fi:|
+% \cs{if_case:w} \meta{integer} \cs{exp_stop_f:}
+% | |\cs{@@_case_return_o:Nw} \meta{fp var}
+% \cs{or:} \cs{@@_case_use:nw} \Arg{some computation}
+% \cs{or:} \cs{@@_case_return_same_o:w}
+% \cs{or:} \cs{@@_case_return:nw} \Arg{something}
+% \cs{fi:}
% \meta{junk}
% \meta{floating point}
% \end{syntax}
@@ -1160,7 +1172,7 @@
\or:
\@@_case_return:nw
{
- \exp_after:wN \@@_small_int_true:wTF \__int_value:w
+ \exp_after:wN \@@_small_int_true:wTF \int_value:w
\if_meaning:w 2 #2 - \fi: 1 0000 0000 ;
}
\else: \@@_case_return:nw \use_ii:nn
@@ -1178,7 +1190,7 @@
{
\if_meaning:w 0 #1
\exp_after:wN \@@_small_int_true:wTF
- \__int_value:w \if_meaning:w 2 #5 - \fi:
+ \int_value:w \if_meaning:w 2 #5 - \fi:
\if_int_compare:w #2 > 0 \exp_stop_f:
1 0000 0000
\else:
@@ -1224,6 +1236,33 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Fast string comparison}
+%
+% \begin{macro}{\@@_str_if_eq_x:nn}
+% A private version of the low-level string comparison function. As
+% the nature of the arguments is restricted and as speed is of the essence,
+% this version does not seek to deal with |#| tokens.
+% No \pkg{l3sys} or \pkg{l3luatex} just yet so we have to define in terms of
+% primitives.
+% \begin{macrocode}
+\cs_new:Npn \@@_str_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
+\sys_if_engine_luatex:T
+ {
+ \cs_set:Npn \@@_str_if_eq_x:nn #1#2
+ {
+ \luatex_directlua:D
+ {
+ l3kernel.strcmp
+ (
+ " \luatex_luaescapestring:D {#1}",
+ " \luatex_luaescapestring:D {#2}"
+ )
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Name of a function from its \pkg{l3fp-parse} name}
%
% \begin{macro}[EXP]{\@@_func_to_name:N, \@@_func_to_name_aux:w}
@@ -1231,10 +1270,14 @@
% This is used in error messages hence does not need to be fast.
% \begin{macrocode}
\cs_new:Npn \@@_func_to_name:N #1
- { \exp_last_unbraced:Nf \@@_func_to_name_aux:w { \cs_to_str:N #1 } X }
+ {
+ \exp_last_unbraced:Nf
+ \@@_func_to_name_aux:w { \cs_to_str:N #1 } X
+ }
\cs_set_protected:Npn \@@_tmp:w #1 #2
{ \cs_new:Npn \@@_func_to_name_aux:w ##1 #1 ##2 #2 ##3 X {##2} }
-\exp_args:Nff \@@_tmp:w { \tl_to_str:n { @@_ } } { \tl_to_str:n { _o: } }
+\exp_args:Nff \@@_tmp:w { \tl_to_str:n { @@_ } }
+ { \tl_to_str:n { _o: } }
% \end{macrocode}
% \end{macro}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -110,7 +110,7 @@
% opposite signs, shift the significand of the smaller one to match the
% bigger one, perform the addition or subtraction of significands,
% check for a carry, round, and pack using the
-% \cs[no-index]{__fp_basics_pack_\ldots{}} functions.
+% \cs[no-index]{@@_basics_pack_\ldots{}} functions.
% \end{itemize}
% The trickiest part is to round correctly when adding or subtracting
% normal floating point numbers.
@@ -139,7 +139,7 @@
% the second operand's sign should be changed. If the
% \meta{types} |#2| and |#4| are the same, dispatch to case |#2| ($0$,
% $1$, $2$, or $3$), where we call specialized functions: thanks to
-% \cs{__int_value:w}, those receive the tweaked \meta{sign_2}
+% \cs{int_value:w}, those receive the tweaked \meta{sign_2}
% (expansion of |#1#5|) as an argument. If the \meta{types} are
% distinct, the result is simply the floating point number with the
% highest \meta{type}. Since case $3$ (used for two \texttt{nan})
@@ -162,11 +162,11 @@
\fi:
\fi:
\exp_stop_f:
- \exp_after:wN \@@_add_zeros_o:Nww \__int_value:w
- \or: \exp_after:wN \@@_add_normal_o:Nww \__int_value:w
- \or: \exp_after:wN \@@_add_inf_o:Nww \__int_value:w
+ \exp_after:wN \@@_add_zeros_o:Nww \int_value:w
+ \or: \exp_after:wN \@@_add_normal_o:Nww \int_value:w
+ \or: \exp_after:wN \@@_add_inf_o:Nww \int_value:w
\or: \@@_case_return_i_o:ww
- \else: \exp_after:wN \@@_add_return_ii_o:Nww \__int_value:w
+ \else: \exp_after:wN \@@_add_return_ii_o:Nww \int_value:w
\fi:
#1 #5
\s_@@ \@@_chk:w #2 #3 ;
@@ -261,7 +261,7 @@
% \meta{body_2} |;|
% \end{quote}
% Since we are doing an addition, the final sign is \meta{sign_1}.
-% Start an \cs{__int_eval:w}, responsible for computing the exponent:
+% Start an \cs{@@_int_eval:w}, responsible for computing the exponent:
% the result, and the \meta{final sign} are then given to
% \cs{@@_sanitize:Nw} which checks for overflow. The exponent is
% computed as the largest exponent |#2| or |#5|, incremented if there
@@ -275,15 +275,15 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #1
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_int_compare:w #2 > #5 \exp_stop_f:
#2
- \exp_after:wN \@@_add_big_i_o:wNww \__int_value:w -
+ \exp_after:wN \@@_add_big_i_o:wNww \int_value:w -
\else:
#5
- \exp_after:wN \@@_add_big_ii_o:wNww \__int_value:w
+ \exp_after:wN \@@_add_big_ii_o:wNww \int_value:w
\fi:
- \__int_eval:w #5 - #2 ; #1 #3;
+ \@@_int_eval:w #5 - #2 ; #1 #3;
}
% \end{macrocode}
% \end{macro}
@@ -340,9 +340,9 @@
\cs_new:Npn \@@_add_significand_o:NnnwnnnnN #1 #2#3 #4; #5#6#7#8
{
\exp_after:wN \@@_add_significand_test_o:N
- \__int_value:w \__int_eval:w 1#5#6 + #2
+ \int_value:w \@@_int_eval:w 1#5#6 + #2
\exp_after:wN \@@_add_significand_pack:NNNNNNN
- \__int_value:w \__int_eval:w 1#7#8 + #3 ; #1
+ \int_value:w \@@_int_eval:w 1#7#8 + #3 ; #1
}
\cs_new:Npn \@@_add_significand_pack:NNNNNNN #1 #2#3#4#5#6#7
{
@@ -377,9 +377,9 @@
#1; #2; #3#4 ; #5#6
{
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1 #1
+ \int_value:w \@@_int_eval:w 1 #1
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 1 #2 #3#4
+ \int_value:w \@@_int_eval:w 1 #2 #3#4
+ \@@_round:NNN #6 #4 #5
\exp_after:wN ;
}
@@ -400,13 +400,13 @@
{
+ 1
\exp_after:wN \@@_basics_pack_weird_high:NNNNNNNNw
- \__int_value:w \__int_eval:w 1 1 #1
+ \int_value:w \@@_int_eval:w 1 1 #1
\exp_after:wN \@@_basics_pack_weird_low:NNNNw
- \__int_value:w \__int_eval:w 1 #2#3 +
+ \int_value:w \@@_int_eval:w 1 #2#3 +
\exp_after:wN \@@_round:NNN
\exp_after:wN #6
\exp_after:wN #3
- \__int_value:w \@@_round_digit:Nw #4 #5 ;
+ \int_value:w \@@_round_digit:Nw #4 #5 ;
\exp_after:wN ;
}
% \end{macrocode}
@@ -443,7 +443,7 @@
\cs_new:Npn \@@_sub_npos_ii_o:Nnwnw #1 #2; #3;
{
\exp_after:wN \@@_sub_npos_i_o:Nnwnw
- \__int_value:w \@@_neg_sign:N #1
+ \int_value:w \@@_neg_sign:N #1
#3; #2;
}
% \end{macrocode}
@@ -465,13 +465,13 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #1
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
#2
\if_int_compare:w #2 = #4 \exp_stop_f:
\exp_after:wN \@@_sub_back_near_o:nnnnnnnnN
\else:
\exp_after:wN \@@_decimate:nNnnnn \exp_after:wN
- { \__int_value:w \__int_eval:w #2 - #4 - 1 \exp_after:wN }
+ { \int_value:w \@@_int_eval:w #2 - #4 - 1 \exp_after:wN }
\exp_after:wN \@@_sub_back_far_o:NnnwnnnnN
\fi:
#5
@@ -500,9 +500,9 @@
\cs_new:Npn \@@_sub_back_near_o:nnnnnnnnN #1#2#3#4 #5#6#7#8 #9
{
\exp_after:wN \@@_sub_back_near_after:wNNNNw
- \__int_value:w \__int_eval:w 10#5#6 - #1#2 - 11
+ \int_value:w \@@_int_eval:w 10#5#6 - #1#2 - 11
\exp_after:wN \@@_sub_back_near_pack:NNNNNNw
- \__int_value:w \__int_eval:w 11#7#8 - #3#4 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 11#7#8 - #3#4 \exp_after:wN ;
}
\cs_new:Npn \@@_sub_back_near_pack:NNNNNNw #1#2#3#4#5#6#7 ;
{ + #1#2 ; {#3#4#5#6} {#7} ; }
@@ -543,7 +543,7 @@
\cs_new:Npn \@@_sub_back_shift:wnnnn ; #1#2
{
\exp_after:wN \@@_sub_back_shift_ii:ww
- \__int_value:w #1 #2 0 ;
+ \int_value:w #1 #2 0 ;
}
\cs_new:Npn \@@_sub_back_shift_ii:ww #1 0 ; #2#3 ;
{
@@ -551,7 +551,7 @@
- 7
- \exp_after:wN \use_i:nnn
\exp_after:wN \@@_sub_back_shift_iii:NNNNNNNNw
- \__int_value:w #2#3 0 ~ 123456789;
+ \int_value:w #2#3 0 ~ 123456789;
\else:
- \@@_sub_back_shift_iii:NNNNNNNNw #1 123456789;
\fi:
@@ -559,7 +559,7 @@
\exp_after:wN \@@_pack_twice_four:wNNNNNNNN
\exp_after:wN \@@_sub_back_shift_iv:nnnnw
\exp_after:wN ;
- \__int_value:w
+ \int_value:w
#1 ~ #2#3 0 ~ 0000 0000 0000 000 ;
}
\cs_new:Npn \@@_sub_back_shift_iii:NNNNNNNNw #1#2#3#4#5#6#7#8#9; {#8}
@@ -658,9 +658,9 @@
{
- 1
\exp_after:wN \@@_sub_back_near_after:wNNNNw
- \__int_value:w \__int_eval:w 1#30 - #1 - 11
+ \int_value:w \@@_int_eval:w 1#30 - #1 - 11
\exp_after:wN \@@_sub_back_near_pack:NNNNNNw
- \__int_value:w \__int_eval:w 11 0000 0000 + #40 - #2
+ \int_value:w \@@_int_eval:w 11 0000 0000 + #40 - #2
- \exp_after:wN \@@_round_neg:NNN
\exp_after:wN #6
\use_none:nnnnnnn #2 #5
@@ -678,7 +678,7 @@
% complicated: we have two \meta{rounding} digits |#3| and |#6| (from
% the decimation, and from the new shift) to take into account, and
% getting the parity of the main result requires a computation. The
-% first \cs{__int_value:w} triggers the second one because the number
+% first \cs{int_value:w} triggers the second one because the number
% is unfinished; we can thus not use $0$ in place of $2$ there.
% \begin{macrocode}
\cs_new:Npn \@@_sub_back_very_far_o:wwwwNN #1#2#3#4#5#6#7
@@ -691,15 +691,15 @@
\cs_new:Npn \@@_sub_back_very_far_ii_o:nnNwwNN #1#2 ; #3 ; #4 ~ #5; #6#7
{
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1#4 - #1 - 1
+ \int_value:w \@@_int_eval:w 1#4 - #1 - 1
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 2#5 - #2
+ \int_value:w \@@_int_eval:w 2#5 - #2
- \exp_after:wN \@@_round_neg:NNN
\exp_after:wN #7
- \__int_value:w
- \if_int_odd:w \__int_eval:w #5 - #2 \__int_eval_end:
+ \int_value:w
+ \if_int_odd:w \@@_int_eval:w #5 - #2 \@@_int_eval_end:
1 \else: 2 \fi:
- \__int_value:w \@@_round_digit:Nw #3 #6 ;
+ \int_value:w \@@_round_digit:Nw #3 #6 ;
\exp_after:wN ;
}
% \end{macrocode}
@@ -752,7 +752,7 @@
\cs_new:Npn \@@_mul_cases_o:NnNnww
#1#2#3#4 \s_@@ \@@_chk:w #5#6#7; \s_@@ \@@_chk:w #8#9
{
- \if_case:w \__int_eval:w
+ \if_case:w \@@_int_eval:w
\if_int_compare:w #5 #8 = 11 ~
1
\else:
@@ -771,7 +771,7 @@
\fi:
\fi:
\if_meaning:w #6 #9 - 1 \fi:
- \__int_eval_end:
+ \@@_int_eval_end:
\@@_case_use:nw { #3 0 }
\or: \@@_case_use:nw { #3 2 }
\or: \@@_case_return_i_o:ww
@@ -802,7 +802,7 @@
% \cs{s_@@} \cs{@@_chk:w} |1| \meta{sign_2} \Arg{exp_2} \meta{body_2} |;|
% \end{quote}
% After the computation, \cs{@@_sanitize:Nw} checks for overflow or
-% underflow. As we did for addition, \cs{__int_eval:w} computes the
+% underflow. As we did for addition, \cs{@@_int_eval:w} computes the
% exponent, catching any shift coming from the computation in the
% significand. The \meta{final sign} is needed to do the rounding
% properly in the significand computation. We setup the post-expansion
@@ -815,7 +815,7 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #1
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
#4 + #8
\@@_mul_significand_o:nnnnNnnnn #5 #1 #9
}
@@ -834,7 +834,7 @@
% the last \cs{@@_mul_significand_drop:NNNNNw}; one is for
% \cs{@@_round_digit:Nw} later on; and one, preceded by
% \cs{exp_after:wN}, which is correctly expanded (within an
-% \cs{__int_eval:w}), is used by \cs{@@_basics_pack_low:NNNNNw}.
+% \cs{@@_int_eval:w}), is used by \cs{@@_basics_pack_low:NNNNNw}.
%
% The product of two $16$ digit integers has $31$ or $32$ digits,
% but it is impossible to know which one before computing. The place
@@ -844,25 +844,27 @@
% is between $100$ and $9999$ inclusive), and a compact version of
% the remaining $3$ blocks. Afterwards, the number of digits is
% known, and we can do the rounding within yet another set of
-% \cs{__int_eval:w}.
+% \cs{@@_int_eval:w}.
% \begin{macrocode}
\cs_new:Npn \@@_mul_significand_o:nnnnNnnnn #1#2#3#4 #5 #6#7#8#9
{
\exp_after:wN \@@_mul_significand_test_f:NNN
\exp_after:wN #5
- \__int_value:w \__int_eval:w 99990000 + #1*#6 +
+ \int_value:w \@@_int_eval:w 99990000 + #1*#6 +
\exp_after:wN \@@_mul_significand_keep:NNNNNw
- \__int_value:w \__int_eval:w 99990000 + #1*#7 + #2*#6 +
+ \int_value:w \@@_int_eval:w 99990000 + #1*#7 + #2*#6 +
\exp_after:wN \@@_mul_significand_keep:NNNNNw
- \__int_value:w \__int_eval:w 99990000 + #1*#8 + #2*#7 + #3*#6 +
+ \int_value:w \@@_int_eval:w 99990000 + #1*#8 + #2*#7 + #3*#6 +
\exp_after:wN \@@_mul_significand_drop:NNNNNw
- \__int_value:w \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 +
+ \int_value:w \@@_int_eval:w 99990000 + #1*#9 + #2*#8 +
+ #3*#7 + #4*#6 +
\exp_after:wN \@@_mul_significand_drop:NNNNNw
- \__int_value:w \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 +
+ \int_value:w \@@_int_eval:w 99990000 + #2*#9 + #3*#8 +
+ #4*#7 +
\exp_after:wN \@@_mul_significand_drop:NNNNNw
- \__int_value:w \__int_eval:w 99990000 + #3*#9 + #4*#8 +
+ \int_value:w \@@_int_eval:w 99990000 + #3*#9 + #4*#8 +
\exp_after:wN \@@_mul_significand_drop:NNNNNw
- \__int_value:w \__int_eval:w 100000000 + #4*#9 ;
+ \int_value:w \@@_int_eval:w 100000000 + #4*#9 ;
; \exp_after:wN ;
}
\cs_new:Npn \@@_mul_significand_drop:NNNNNw #1#2#3#4#5 #6;
@@ -910,13 +912,13 @@
\cs_new:Npn \@@_mul_significand_large_f:NwwNNNN #1 #2; #3; #4#5#6#7; +
{
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1#2
+ \int_value:w \@@_int_eval:w 1#2
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 1#3#4#5#6#7
+ \int_value:w \@@_int_eval:w 1#3#4#5#6#7
+ \exp_after:wN \@@_round:NNN
\exp_after:wN #1
\exp_after:wN #7
- \__int_value:w \@@_round_digit:Nw
+ \int_value:w \@@_round_digit:Nw
}
% \end{macrocode}
% \end{macro}
@@ -933,13 +935,13 @@
{
- 1
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1#3#4
+ \int_value:w \@@_int_eval:w 1#3#4
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 1#5#6#7
+ \int_value:w \@@_int_eval:w 1#5#6#7
+ \exp_after:wN \@@_round:NNN
\exp_after:wN #1
\exp_after:wN #7
- \__int_value:w \@@_round_digit:Nw
+ \int_value:w \@@_round_digit:Nw
}
% \end{macrocode}
% \end{macro}
@@ -1003,10 +1005,10 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #1
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
#3 - #6
\exp_after:wN \@@_div_significand_i_o:wnnw
- \__int_value:w \__int_eval:w #7 \use_i:nnnn #8 + 1 ;
+ \int_value:w \@@_int_eval:w #7 \use_i:nnnn #8 + 1 ;
#4
{#7}{#8}#9 ;
#1
@@ -1052,7 +1054,7 @@
% \leq 10^{4} \frac{A}{Z}
% \end{equation*}
% Subtracting $1$ at the end takes care of the fact that \eTeX{}'s
-% \cs{__int_eval:w} rounds divisions instead of truncating (really,
+% \cs{@@_int_eval:w} rounds divisions instead of truncating (really,
% $1/2$ would be sufficient, but we work with integers). We add $1$ to
% $Z_{1}$ because $Z_{1} \leq 10^{4}Z < Z_{1}+1$ and we need $Q_{A}$ to
% be an underestimate. However, we are now underestimating $Q_{A}$ too
@@ -1196,21 +1198,21 @@
% \meta{continuation} arguments for $4$ consecutive calls to
% \cs{@@_div_significand_calc:wwnnnnnnn}. Each of these calls needs
% \meta{y} (|#1|), and it turns out that we need post-expansion there,
-% hence the \cs{__int_value:w}. Here, |#4| is six brace groups, which
+% hence the \cs{int_value:w}. Here, |#4| is six brace groups, which
% give the six first |n|-type arguments of the \texttt{calc} function.
% \begin{macrocode}
\cs_new:Npn \@@_div_significand_i_o:wnnw #1 ; #2#3 #4 ;
{
\exp_after:wN \@@_div_significand_test_o:w
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\exp_after:wN \@@_div_significand_calc:wwnnnnnnn
- \__int_value:w \__int_eval:w 999999 + #2 #3 0 / #1 ;
+ \int_value:w \@@_int_eval:w 999999 + #2 #3 0 / #1 ;
#2 #3 ;
#4
- { \exp_after:wN \@@_div_significand_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_div_significand_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_div_significand_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_div_significand_iii:wwnnnnn \__int_value:w #1 }
+ { \exp_after:wN \@@_div_significand_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_div_significand_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_div_significand_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_div_significand_iii:wwnnnnn \int_value:w #1 }
}
% \end{macrocode}
% \end{macro}
@@ -1282,37 +1284,39 @@
\exp_after:wN \@@_div_significand_calc_ii:wwnnnnnnn
\fi:
}
-\cs_new:Npn \@@_div_significand_calc_i:wwnnnnnnn #1; #2;#3#4 #5#6#7#8 #9
+\cs_new:Npn \@@_div_significand_calc_i:wwnnnnnnn
+ #1; #2;#3#4 #5#6#7#8 #9
{
1 1 #1
#9 \exp_after:wN ;
- \__int_value:w \__int_eval:w \c_@@_Bigg_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_leading_shift_int
+ #2 - #1 * #5 - #5#60
\exp_after:wN \@@_pack_Bigg:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_Bigg_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_middle_shift_int
+ #3 - #1 * #6 - #70
\exp_after:wN \@@_pack_Bigg:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_Bigg_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_middle_shift_int
+ #4 - #1 * #7 - #80
\exp_after:wN \@@_pack_Bigg:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_Bigg_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_trailing_shift_int
- #1 * #8 ;
{#5}{#6}{#7}{#8}
}
-\cs_new:Npn \@@_div_significand_calc_ii:wwnnnnnnn #1; #2;#3#4 #5#6#7#8 #9
+\cs_new:Npn \@@_div_significand_calc_ii:wwnnnnnnn
+ #1; #2;#3#4 #5#6#7#8 #9
{
1 0 #1
#9 \exp_after:wN ;
- \__int_value:w \__int_eval:w \c_@@_Bigg_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_leading_shift_int
+ #2 - #1 * #5
\exp_after:wN \@@_pack_Bigg:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_Bigg_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_middle_shift_int
+ #3 - #1 * #6
\exp_after:wN \@@_pack_Bigg:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_Bigg_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_middle_shift_int
+ #4 - #1 * #7
\exp_after:wN \@@_pack_Bigg:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_Bigg_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_Bigg_trailing_shift_int
- #1 * #8 ;
{#5}{#6}{#7}{#8}
}
@@ -1328,7 +1332,7 @@
% \meta{continuations} \meta{sign}
% \end{quote}
% Compute $Q_{B}$ by evaluating $\meta{B_1}\meta{B_2}0 / y - 1$. The
-% result is output to the left, in an \cs{__int_eval:w} which we
+% result is output to the left, in an \cs{@@_int_eval:w} which we
% start now. Once that is evaluated (and the other $Q_{i}$ also,
% since later expansions are triggered by this one), a packing
% auxiliary takes care of placing the digits of $Q_{B}$ in an
@@ -1339,9 +1343,9 @@
\cs_new:Npn \@@_div_significand_ii:wwn #1; #2;#3
{
\exp_after:wN \@@_div_significand_pack:NNN
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\exp_after:wN \@@_div_significand_calc:wwnnnnnnn
- \__int_value:w \__int_eval:w 999999 + #2 #3 0 / #1 ; #2 #3 ;
+ \int_value:w \@@_int_eval:w 999999 + #2 #3 0 / #1 ; #2 #3 ;
}
% \end{macrocode}
% \end{macro}
@@ -1361,7 +1365,7 @@
{
0
\exp_after:wN \@@_div_significand_iv:wwnnnnnnn
- \__int_value:w \__int_eval:w ( 2 * #2 #3) / #6 #7 ; % <- P
+ \int_value:w \@@_int_eval:w ( 2 * #2 #3) / #6 #7 ; % <- P
#2 ; {#3} {#4} {#5}
{#6} {#7}
}
@@ -1420,17 +1424,17 @@
{
+ 5 * #1
\exp_after:wN \@@_div_significand_vi:Nw
- \__int_value:w \__int_eval:w -20 + 2*#2#3 - #1*#6#7 +
+ \int_value:w \@@_int_eval:w -20 + 2*#2#3 - #1*#6#7 +
\exp_after:wN \@@_div_significand_v:NN
- \__int_value:w \__int_eval:w 199980 + 2*#4 - #1*#8 +
+ \int_value:w \@@_int_eval:w 199980 + 2*#4 - #1*#8 +
\exp_after:wN \@@_div_significand_v:NN
- \__int_value:w \__int_eval:w 200000 + 2*#5 - #1*#9 ;
+ \int_value:w \@@_int_eval:w 200000 + 2*#5 - #1*#9 ;
}
-\cs_new:Npn \@@_div_significand_v:NN #1#2 { #1#2 \__int_eval_end: + }
+\cs_new:Npn \@@_div_significand_v:NN #1#2 { #1#2 \@@_int_eval_end: + }
\cs_new:Npn \@@_div_significand_vi:Nw #1#2;
{
\if_meaning:w 0 #1
- \if_int_compare:w \__int_eval:w #2 > 0 + 1 \fi:
+ \if_int_compare:w \@@_int_eval:w #2 > 0 + 1 \fi:
\else:
\if_meaning:w - #1 - \else: + \fi: 1
\fi:
@@ -1500,9 +1504,9 @@
0 #1; #2; #3; #4#5#6#7#8; #9
{
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1 #1#2
+ \int_value:w \@@_int_eval:w 1 #1#2
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 1 #3#4#5#6#7
+ \int_value:w \@@_int_eval:w 1 #3#4#5#6#7
+ \@@_round:NNN #9 #7 #8
\exp_after:wN ;
}
@@ -1524,13 +1528,13 @@
{
+ 1
\exp_after:wN \@@_basics_pack_weird_high:NNNNNNNNw
- \__int_value:w \__int_eval:w 1 #1 #2
+ \int_value:w \@@_int_eval:w 1 #1 #2
\exp_after:wN \@@_basics_pack_weird_low:NNNNw
- \__int_value:w \__int_eval:w 1 #3 #4 #5 #6 +
+ \int_value:w \@@_int_eval:w 1 #3 #4 #5 #6 +
\exp_after:wN \@@_round:NNN
\exp_after:wN #9
\exp_after:wN #6
- \__int_value:w \@@_round_digit:Nw #7 #8 ;
+ \int_value:w \@@_round_digit:Nw #7 #8 ;
\exp_after:wN ;
}
% \end{macrocode}
@@ -1574,7 +1578,7 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN 0
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_int_odd:w #1 \exp_stop_f:
\exp_after:wN \@@_sqrt_npos_auxi_o:wwnnN
\fi:
@@ -1663,11 +1667,11 @@
{
\if_int_compare:w #1 = #2 \exp_stop_f:
\exp_after:wN \@@_sqrt_auxi_o:NNNNwnnN
- \__int_value:w \__int_eval:w 9999 9999 +
+ \int_value:w \@@_int_eval:w 9999 9999 +
\exp_after:wN \@@_use_none_until_s:w
\fi:
\exp_after:wN \@@_sqrt_Newton_o:wwn
- \__int_value:w \__int_eval:w (#1 + #3 * 1 0000 0000 / #1) / 2 ;
+ \int_value:w \@@_int_eval:w (#1 + #3 * 1 0000 0000 / #1) / 2 ;
#1; {#3}
}
% \end{macrocode}
@@ -1756,32 +1760,32 @@
\cs_new:Npn \@@_sqrt_auxii_o:NnnnnnnnN #1 #2#3#4#5#6 #7#8#9
{
\exp_after:wN #1
- \__int_value:w \__int_eval:w \c_@@_big_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_leading_shift_int
+ #7 - #2 * #2
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
- 2 * #2 * #3
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
+ #8 - #3 * #3 - 2 * #2 * #4
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
- 2 * #3 * #4 - 2 * #2 * #5
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
+ #9 000 0000 - #4 * #4 - 2 * #3 * #5 - 2 * #2 * #6
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
- 2 * #4 * #5 - 2 * #3 * #6
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
- #5 * #5 - 2 * #4 * #6
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\c_@@_big_middle_shift_int
- 2 * #5 * #6
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\c_@@_big_trailing_shift_int
- #6 * #6 ;
% (
@@ -1839,18 +1843,18 @@
{
\if_int_compare:w #1 > 1 \exp_stop_f:
\exp_after:wN \@@_sqrt_auxiv_o:NNNNNw
- \__int_value:w \__int_eval:w (#1#2 %)
+ \int_value:w \@@_int_eval:w (#1#2 %)
\else:
\if_int_compare:w #1#2 > 1 \exp_stop_f:
\exp_after:wN \@@_sqrt_auxv_o:NNNNNw
- \__int_value:w \__int_eval:w (#1#2#3 %)
+ \int_value:w \@@_int_eval:w (#1#2#3 %)
\else:
\if_int_compare:w #1#2#3 > 1 \exp_stop_f:
\exp_after:wN \@@_sqrt_auxvi_o:NNNNNw
- \__int_value:w \__int_eval:w (#1#2#3#4 %)
+ \int_value:w \@@_int_eval:w (#1#2#3#4 %)
\else:
\exp_after:wN \@@_sqrt_auxvii_o:NNNNNw
- \__int_value:w \__int_eval:w (#1#2#3#4#5 %)
+ \int_value:w \@@_int_eval:w (#1#2#3#4#5 %)
\fi:
\fi:
\fi:
@@ -1880,11 +1884,11 @@
\cs_new:Npn \@@_sqrt_auxviii_o:nnnnnnn #1#2 #3#4#5#6#7
{
\exp_after:wN \@@_sqrt_auxix_o:wnwnw
- \__int_value:w \__int_eval:w #3
+ \int_value:w \@@_int_eval:w #3
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w #1 + 1#4#5
+ \int_value:w \@@_int_eval:w #1 + 1#4#5
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w #2 + 1#6#7 ;
+ \int_value:w \@@_int_eval:w #2 + 1#6#7 ;
}
\cs_new:Npn \@@_sqrt_auxix_o:wnwnw #1; #2#3; #4#5;
{
@@ -1930,7 +1934,7 @@
\cs_new:Npn \@@_sqrt_auxx_o:Nnnnnnnn #1#2#3 #4#5#6#7#8
{
\exp_after:wN \@@_sqrt_auxxi_o:wwnnN
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
(#8 + 2499) / 5000 * 5000 ;
{#4} {#5} {#6} {#7} ;
}
@@ -1969,10 +1973,10 @@
\fi:
\fi:
\exp_after:wN \@@_sqrt_auxxiv_o:wnnnnnnnN
- \__int_value:w 9998
+ \int_value:w 9998
\else:
\exp_after:wN \@@_sqrt_auxxiv_o:wnnnnnnnN
- \__int_value:w 10000
+ \int_value:w 10000
\fi:
;
}
@@ -2008,18 +2012,18 @@
\cs_new:Npn \@@_sqrt_auxxiv_o:wnnnnnnnN #1; #2#3#4#5#6 #7#8#9
{
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1 0000 0000 + #2#3
+ \int_value:w \@@_int_eval:w 1 0000 0000 + #2#3
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 1 0000 0000
+ \int_value:w \@@_int_eval:w 1 0000 0000
+ #4#5
\if_int_compare:w #6 > #1 \exp_stop_f: + 1 \fi:
+ \exp_after:wN \@@_round:NNN
\exp_after:wN 0
\exp_after:wN 0
- \__int_value:w
+ \int_value:w
\exp_after:wN \use_i:nn
\exp_after:wN \@@_round_digit:Nw
- \__int_value:w \__int_eval:w #6 + 19999 - #1 ;
+ \int_value:w \@@_int_eval:w #6 + 19999 - #1 ;
\exp_after:wN ;
}
% \end{macrocode}
@@ -2061,7 +2065,7 @@
\exp_after:wN \s_@@
\exp_after:wN \@@_chk:w
\exp_after:wN #2
- \__int_value:w
+ \int_value:w
\if_case:w #3 \exp_stop_f: #1 \or: 1 \or: 0 \fi: \exp_stop_f:
#4;
}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -109,11 +109,11 @@
\cs_new:Npn \@@_trim_zeros:w #1 ;
{
\@@_trim_zeros_loop:w #1
- ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s__stop
+ ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s_stop
}
\cs_new:Npn \@@_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 }
\cs_new:Npn \@@_trim_zeros_dot:w #1 .; { \@@_trim_zeros_end:w #1 ; }
-\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s__stop { #1 }
+\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s_stop { #1 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -203,7 +203,7 @@
{
\exp_after:wN \@@_to_scientific_normal:wNw
\exp_after:wN e
- \__int_value:w \__int_eval:w #2 - 1
+ \int_value:w \@@_int_eval:w #2 - 1
; #3 #4 #5 #6 ;
}
\cs_new:Npn \@@_to_scientific_normal:wNw #1 ; #2#3;
@@ -265,7 +265,7 @@
% most likely won't be needed. Normal numbers with an exponent in the
% range $[1,15]$ have that number of digits before the decimal
% separator: \enquote{decimate} them, and remove leading zeros with
-% \cs{__int_value:w}, then trim trailing zeros and dot. Normal
+% \cs{int_value:w}, then trim trailing zeros and dot. Normal
% numbers with an exponent $16$ or larger have no decimal separator,
% we only need to add trailing zeros. When the exponent is
% non-positive, the result should be $0.\meta{zeros}\meta{digits}$,
@@ -321,7 +321,7 @@
}
\cs_new:Npn \@@_to_decimal_large:Nnnw #1#2#3#4;
{
- \exp_after:wN \@@_trim_zeros:w \__int_value:w
+ \exp_after:wN \@@_trim_zeros:w \int_value:w
\if_int_compare:w #2 > 0 \exp_stop_f:
#2
\fi:
@@ -397,7 +397,7 @@
{
\exp_after:wN \@@_to_tl_scientific:wNw
\exp_after:wN e
- \__int_value:w \__int_eval:w #2 - 1
+ \int_value:w \@@_int_eval:w #2 - 1
; #3 #4 #5 #6 ;
}
\cs_new:Npn \@@_to_tl_scientific:wNw #1 ; #2#3;
@@ -503,7 +503,7 @@
\exp_after:wN \@@_from_dim_test:ww
\exp_after:wN 0
\exp_after:wN ,
- \__int_value:w \etex_glueexpr:D #1 ;
+ \int_value:w \etex_glueexpr:D #1 ;
}
\cs_new:Npn \@@_from_dim_test:ww #1, #2
{
@@ -511,11 +511,11 @@
\@@_case_return:nw { \exp_after:wN \c_zero_fp }
\else:
\exp_after:wN \@@_from_dim:wNw
- \__int_value:w \__int_eval:w #1 - 4
+ \int_value:w \@@_int_eval:w #1 - 4
\if_meaning:w - #2
- \exp_after:wN , \exp_after:wN 2 \__int_value:w
+ \exp_after:wN , \exp_after:wN 2 \int_value:w
\else:
- \exp_after:wN , \exp_after:wN 0 \__int_value:w #2
+ \exp_after:wN , \exp_after:wN 0 \int_value:w #2
\fi:
\fi:
}
@@ -593,8 +593,8 @@
\@@_expand:n
{
{ \use_ii:nn }
- \@@_array_to_clist_loop:Nw #1 { ? \__prg_break: } ;
- \__prg_break_point:
+ \@@_array_to_clist_loop:Nw #1 { ? \prg_break: } ;
+ \prg_break_point:
}
}
}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3fp-expo.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-expo.dtx Copyright (C) 2011-2018 The 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
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -176,7 +176,7 @@
\cs_new:Npn \@@_ln_npos_o:w \s_@@ \@@_chk:w 10#1#2#3;
{ %^^A todo: ln(1) should be "exact zero", not "underflow"
\exp_after:wN \@@_sanitize:Nw
- \__int_value:w % for the overall sign
+ \int_value:w % for the overall sign
\if_int_compare:w #1 < 1 \exp_stop_f:
2
\else:
@@ -183,7 +183,7 @@
0
\fi:
\exp_after:wN \exp_stop_f:
- \__int_value:w \__int_eval:w % for the exponent
+ \int_value:w \@@_int_eval:w % for the exponent
\@@_ln_significand:NNNNnnnN #2#3
\@@_ln_exponent:wn {#1}
}
@@ -203,11 +203,11 @@
\cs_new:Npn \@@_ln_significand:NNNNnnnN #1#2#3#4
{
\exp_after:wN \@@_ln_x_ii:wnnnn
- \__int_value:w
+ \int_value:w
\if_case:w #1 \exp_stop_f:
\or:
\if_int_compare:w #2 < 4 \exp_stop_f:
- \__int_eval:w 10 - #2
+ \@@_int_eval:w 10 - #2
\else:
6
\fi:
@@ -230,14 +230,14 @@
\cs_new:Npn \@@_ln_x_ii:wnnnn #1; #2#3#4#5
{
\exp_after:wN \@@_ln_div_after:Nw
- \cs:w c_@@_ln_ \__int_to_roman:w #1 _fixed_tl \exp_after:wN \cs_end:
- \__int_value:w
+ \cs:w c_@@_ln_ \@@_int_to_roman:w #1 _fixed_tl \exp_after:wN \cs_end:
+ \int_value:w
\exp_after:wN \@@_ln_x_iv:wnnnnnnnn
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\exp_after:wN \@@_ln_x_iii_var:NNNNNw
- \__int_value:w \__int_eval:w 9999 9990 + #1*#2#3 +
+ \int_value:w \@@_int_eval:w 9999 9990 + #1*#2#3 +
\exp_after:wN \@@_ln_x_iii:NNNNNNw
- \__int_value:w \__int_eval:w 10 0000 0000 + #1*#4#5 ;
+ \int_value:w \@@_int_eval:w 10 0000 0000 + #1*#4#5 ;
{20000} {0000} {0000} {0000}
} %^^A todo: reoptimize (a generalization attempt failed).
\cs_new:Npn \@@_ln_x_iii:NNNNNNw #1#2 #3#4#5#6 #7;
@@ -280,7 +280,7 @@
% \frac {\left\lfloor 10^8 \cdot A\right\rfloor} {y} - \frac{1}{2}
% \right\rfloor.
% \]
-% (The $1/2$ comes from how e\TeX{} rounds.) As for division, it is
+% (The $1/2$ comes from how \eTeX{} rounds.) As for division, it is
% easy to see that $Q_{1} \leq 10^4 A / Z$, \emph{i.e.}, $Q_{1}$
% is an underestimate.
%
@@ -322,33 +322,33 @@
\cs_new:Npn \@@_ln_x_iv:wnnnnnnnn #1; #2#3#4#5 #6#7#8#9
{
\exp_after:wN \@@_div_significand_pack:NNN
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\@@_ln_div_i:w #1 ;
#6 #7 ; {#8} {#9}
{#2} {#3} {#4} {#5}
- { \exp_after:wN \@@_ln_div_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_ln_div_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_ln_div_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_ln_div_ii:wwn \__int_value:w #1 }
- { \exp_after:wN \@@_ln_div_vi:wwn \__int_value:w #1 }
+ { \exp_after:wN \@@_ln_div_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_ln_div_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_ln_div_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_ln_div_ii:wwn \int_value:w #1 }
+ { \exp_after:wN \@@_ln_div_vi:wwn \int_value:w #1 }
}
\cs_new:Npn \@@_ln_div_i:w #1;
{
\exp_after:wN \@@_div_significand_calc:wwnnnnnnn
- \__int_value:w \__int_eval:w 999999 + 2 0000 0000 / #1 ; % Q1
+ \int_value:w \@@_int_eval:w 999999 + 2 0000 0000 / #1 ; % Q1
}
\cs_new:Npn \@@_ln_div_ii:wwn #1; #2;#3 % y; B1;B2 <- for k=1
{
\exp_after:wN \@@_div_significand_pack:NNN
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\exp_after:wN \@@_div_significand_calc:wwnnnnnnn
- \__int_value:w \__int_eval:w 999999 + #2 #3 / #1 ; % Q2
+ \int_value:w \@@_int_eval:w 999999 + #2 #3 / #1 ; % Q2
#2 #3 ;
}
\cs_new:Npn \@@_ln_div_vi:wwn #1; #2;#3#4#5 #6#7#8#9 %y;F1;F2F3F4x1x2x3x4
{
\exp_after:wN \@@_div_significand_pack:NNN
- \__int_value:w \__int_eval:w 1000000 + #2 #3 / #1 ; % Q6
+ \int_value:w \@@_int_eval:w 1000000 + #2 #3 / #1 ; % Q6
}
% \end{macrocode}
% We now have essentially
@@ -396,12 +396,12 @@
\exp_after:wN \@@_ln_t_large:NNw
\exp_after:wN + % <sign>
\exp_after:wN #1
- \__int_value:w \__int_eval:w 9999 - #2 \exp_after:wN ;
- \__int_value:w \__int_eval:w 9999 - #3 \exp_after:wN ;
- \__int_value:w \__int_eval:w 9999 - #4 \exp_after:wN ;
- \__int_value:w \__int_eval:w 9999 - #5 \exp_after:wN ;
- \__int_value:w \__int_eval:w 9999 - #6 \exp_after:wN ;
- \__int_value:w \__int_eval:w 1 0000 - #7 ;
+ \int_value:w \@@_int_eval:w 9999 - #2 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 9999 - #3 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 9999 - #4 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 9999 - #5 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 9999 - #6 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 1 0000 - #7 ;
}
% \end{macrocode}
%
@@ -418,29 +418,30 @@
\cs_new:Npn \@@_ln_t_large:NNw #1 #2 #3; #4; #5; #6; #7; #8;
{
\exp_after:wN \@@_ln_square_t_after:w
- \__int_value:w \__int_eval:w 9999 0000 + #3*#3
+ \int_value:w \@@_int_eval:w 9999 0000 + #3*#3
\exp_after:wN \@@_ln_square_t_pack:NNNNNw
- \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#4
+ \int_value:w \@@_int_eval:w 9999 0000 + 2*#3*#4
\exp_after:wN \@@_ln_square_t_pack:NNNNNw
- \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#5 + #4*#4
+ \int_value:w \@@_int_eval:w 9999 0000 + 2*#3*#5 + #4*#4
\exp_after:wN \@@_ln_square_t_pack:NNNNNw
- \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#6 + 2*#4*#5
+ \int_value:w \@@_int_eval:w 9999 0000 + 2*#3*#6 + 2*#4*#5
\exp_after:wN \@@_ln_square_t_pack:NNNNNw
- \__int_value:w \__int_eval:w 1 0000 0000 + 2*#3*#7 + 2*#4*#6 + #5*#5
+ \int_value:w \@@_int_eval:w
+ 1 0000 0000 + 2*#3*#7 + 2*#4*#6 + #5*#5
+ (2*#3*#8 + 2*#4*#7 + 2*#5*#6) / 1 0000
% ; ; ;
\exp_after:wN \@@_ln_twice_t_after:w
- \__int_value:w \__int_eval:w -1 + 2*#3
+ \int_value:w \@@_int_eval:w -1 + 2*#3
\exp_after:wN \@@_ln_twice_t_pack:Nw
- \__int_value:w \__int_eval:w 9999 + 2*#4
+ \int_value:w \@@_int_eval:w 9999 + 2*#4
\exp_after:wN \@@_ln_twice_t_pack:Nw
- \__int_value:w \__int_eval:w 9999 + 2*#5
+ \int_value:w \@@_int_eval:w 9999 + 2*#5
\exp_after:wN \@@_ln_twice_t_pack:Nw
- \__int_value:w \__int_eval:w 9999 + 2*#6
+ \int_value:w \@@_int_eval:w 9999 + 2*#6
\exp_after:wN \@@_ln_twice_t_pack:Nw
- \__int_value:w \__int_eval:w 9999 + 2*#7
+ \int_value:w \@@_int_eval:w 9999 + 2*#7
\exp_after:wN \@@_ln_twice_t_pack:Nw
- \__int_value:w \__int_eval:w 10000 + 2*#8 ; ;
+ \int_value:w \@@_int_eval:w 10000 + 2*#8 ; ;
{ \@@_ln_c:NwNw #1 }
#2
}
@@ -494,7 +495,7 @@
\@@_fixed_mul:wwn #3;
{
\exp_after:wN \@@_ln_Taylor_loop:www
- \__int_value:w \__int_eval:w #1 - 2 ;
+ \int_value:w \@@_int_eval:w #1 - 2 ;
}
#3;
}
@@ -502,7 +503,7 @@
{
\fi:
\exp_after:wN \@@_fixed_mul:wwn
- \exp_after:wN { \__int_value:w \__int_eval:w 10000 + #2 } #3;
+ \exp_after:wN { \int_value:w \@@_int_eval:w 10000 + #2 } #3;
}
% \end{macrocode}
% \end{macro}
@@ -556,16 +557,16 @@
\if_case:w #2 \exp_stop_f:
0 \@@_case_return:nw { \@@_fixed_to_float_o:Nw 2 }
\or:
- \exp_after:wN \@@_ln_exponent_one:ww \__int_value:w
+ \exp_after:wN \@@_ln_exponent_one:ww \int_value:w
\else:
\if_int_compare:w #2 > 0 \exp_stop_f:
\exp_after:wN \@@_ln_exponent_small:NNww
\exp_after:wN 0
- \exp_after:wN \@@_fixed_sub:wwn \__int_value:w
+ \exp_after:wN \@@_fixed_sub:wwn \int_value:w
\else:
\exp_after:wN \@@_ln_exponent_small:NNww
\exp_after:wN 2
- \exp_after:wN \@@_fixed_add:wwn \__int_value:w -
+ \exp_after:wN \@@_fixed_add:wwn \int_value:w -
\fi:
\fi:
#2; #1;
@@ -648,7 +649,7 @@
\else:
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN 0
- \__int_value:w #1 \__int_eval:w
+ \int_value:w #1 \@@_int_eval:w
\if_int_compare:w #4 < 0 \exp_stop_f:
\exp_after:wN \use_i:nn
\else:
@@ -698,7 +699,7 @@
; #2#3#4 0000 0000 ;
}
\cs_new:Npn \@@_exp_Taylor_ii:ww #1; #2;
- { \@@_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s__stop }
+ { \@@_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s_stop }
\cs_new:Npn \@@_exp_Taylor_loop:www #1; #2; #3;
{
\if_int_compare:w #1 = 1 \exp_stop_f:
@@ -709,11 +710,11 @@
\@@_fixed_mul:wwn #2 ;
{
\exp_after:wN \@@_exp_Taylor_loop:www
- \__int_value:w \__int_eval:w #1 - 1 ;
+ \int_value:w \@@_int_eval:w #1 - 1 ;
#2 ;
}
}
-\cs_new:Npn \@@_exp_Taylor_break:Nww #1 #2; #3 \s__stop
+\cs_new:Npn \@@_exp_Taylor_break:Nww #1 #2; #3 \s_stop
{ \@@_fixed_add_one:wN #2 ; }
% \end{macrocode}
% \end{macro}
@@ -742,7 +743,7 @@
% current total. The loop is done by having the auxiliary for one
% exponent call the auxiliary for the next exponent. The current
% total is expressed by leaving the exponent behind in the input
-% stream (we are currently within an \cs{__int_eval:w}), and keeping
+% stream (we are currently within an \cs{@@_int_eval:w}), and keeping
% track of a fixed point number, |#1| for the numbered auxiliaries.
% Our usage of \cs{if_case:w} is somewhat dirty for optimization:
% \TeX{} jumps to the appropriate case, but we then close the
@@ -752,9 +753,9 @@
\cs_new:Npn \@@_exp_pos_large:NnnNwn #1#2#3 #4#5; #6
{
\exp_after:wN \exp_after:wN
- \cs:w @@_exp_large_ \__int_to_roman:w #6 :wN \exp_after:wN \cs_end:
+ \cs:w @@_exp_large_ \@@_int_to_roman:w #6 :wN \exp_after:wN \cs_end:
\exp_after:wN \c_@@_one_fixed_tl
- \__int_value:w #3 #4 \exp_stop_f:
+ \int_value:w #3 #4 \exp_stop_f:
#5 00000 ;
}
\cs_new:Npn \@@_exp_large:w #1 \or: #2 \fi:
@@ -989,7 +990,7 @@
\cs_new:Npn \@@_pow_normal_o:ww
\s_@@ \@@_chk:w 1 #1#2#3; \s_@@ \@@_chk:w #4#5
{
- \if_int_compare:w \__str_if_eq_x:nn { #2 #3 }
+ \if_int_compare:w \@@_str_if_eq_x:nn { #2 #3 }
{ 1 {1000} {0000} {0000} {0000} } = 0 \exp_stop_f:
\if_int_compare:w #4 #1 = 32 \exp_stop_f:
\exp_after:wN \@@_case_return_ii_o:ww
@@ -1036,7 +1037,7 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN 0
- \__int_value:w
+ \int_value:w
\if:w #1 \if_int_compare:w #3 > 0 \exp_stop_f: 0 \else: 2 \fi:
\exp_after:wN \@@_pow_npos_aux:NNnww
\exp_after:wN +
@@ -1060,7 +1061,7 @@
\cs_new:Npn \@@_pow_npos_aux:NNnww #1#2#3#4#5; \s_@@ \@@_chk:w 1#6#7#8;
{
#1
- \__int_eval:w
+ \@@_int_eval:w
\@@_ln_significand:NNNNnnnN #4#5
\@@_pow_exponent:wnN {#3}
\@@_fixed_mul:wwn #8 {0000}{0000} ;
@@ -1081,21 +1082,21 @@
\cs_new:Npn \@@_pow_exponent:Nwnnnnnw #1#2; #3#4#5#6#7#8;
{ %^^A todo: use that in ln.
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_leading_shift_int
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
#1#2*23025 - #1 #3
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
#1 #2*8509 - #1 #4
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
#1 #2*2994 - #1 #5
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
#1 #2*0456 - #1 #6
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_trailing_shift_int
#1 #2*8401 - #1 #7
#1 ( #2*7991 - #8 ) / 1 0000 ; ;
}
@@ -1102,16 +1103,16 @@
\cs_new:Npn \@@_pow_B:wwN #1#2#3#4#5#6; #7;
{
\if_int_compare:w #7 < 0 \exp_stop_f:
- \exp_after:wN \@@_pow_C_neg:w \__int_value:w -
+ \exp_after:wN \@@_pow_C_neg:w \int_value:w -
\else:
\if_int_compare:w #7 < 22 \exp_stop_f:
- \exp_after:wN \@@_pow_C_pos:w \__int_value:w
+ \exp_after:wN \@@_pow_C_pos:w \int_value:w
\else:
- \exp_after:wN \@@_pow_C_overflow:w \__int_value:w
+ \exp_after:wN \@@_pow_C_overflow:w \int_value:w
\fi:
\fi:
#7 \exp_after:wN ;
- \__int_value:w \__int_eval:w 10 0000 + #1 \__int_eval_end:
+ \int_value:w \@@_int_eval:w 10 0000 + #1 \@@_int_eval_end:
#2#3#4#5#6 0000 0000 0000 0000 0000 0000 ; %^^A todo: how many 0?
}
\cs_new:Npn \@@_pow_C_overflow:w #1; #2; #3
@@ -1133,11 +1134,11 @@
\exp_after:wN #2
\else:
\if_meaning:w 0 #2
- \exp_after:wN \@@_pow_C_pos_loop:wN \__int_value:w
+ \exp_after:wN \@@_pow_C_pos_loop:wN \int_value:w
\else:
- \exp_after:wN \@@_pow_C_overflow:w \__int_value:w
+ \exp_after:wN \@@_pow_C_overflow:w \int_value:w
\fi:
- \__int_eval:w #1 - 1 \exp_after:wN ;
+ \@@_int_eval:w #1 - 1 \exp_after:wN ;
\fi:
}
\cs_new:Npn \@@_pow_C_pack:w
@@ -1162,7 +1163,7 @@
\if_case:w \@@_pow_neg_case:w #4 ;
\exp_after:wN \@@_pow_neg_aux:wNN
\or:
- \if_int_compare:w \__int_eval:w #1 / 2 = 1 \exp_stop_f:
+ \if_int_compare:w \@@_int_eval:w #1 / 2 = 1 \exp_stop_f:
\@@_invalid_operation_o:Nww ^ #3; #4;
\exp:w \exp_end_continue_f:w
\exp_after:wN \exp_after:wN
@@ -1178,7 +1179,7 @@
\exp_after:wN \s_@@
\exp_after:wN \@@_chk:w
\exp_after:wN #2
- \__int_value:w \__int_eval:w 2 - #3 \__int_eval_end:
+ \int_value:w \@@_int_eval:w 2 - #3 \@@_int_eval_end:
}
% \end{macrocode}
% ^^A todo: is this \@@_exp_after_o:w necessary? Appropriate?
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3fp-extended.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-extended.dtx Copyright (C) 2011-2018 The 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
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -134,7 +134,7 @@
\cs_new:Npn \@@_fixed_add_one:wN #1#2; #3
{
\exp_after:wN #3 \exp_after:wN
- { \__int_value:w \__int_eval:w \c_@@_myriad_int + #1 } #2 ;
+ { \int_value:w \@@_int_eval:w \c_@@_myriad_int + #1 } #2 ;
}
% \end{macrocode}
% \end{macro}
@@ -150,9 +150,9 @@
\cs_new:Npn \@@_fixed_div_myriad:wn #1#2#3#4#5#6;
{
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_leading_shift_int
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_trailing_shift_int
+ #1 ; {#2}{#3}{#4}{#5};
}
% \end{macrocode}
@@ -188,22 +188,22 @@
\cs_new:Npn \@@_fixed_mul_short:wwn #1#2#3#4#5#6; #7#8#9;
{
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_leading_shift_int
+ #1*#7
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #1*#8 + #2*#7
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #1*#9 + #2*#8 + #3*#7
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #2*#9 + #3*#8 + #4*#7
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #3*#9 + #4*#8 + #5*#7
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_trailing_shift_int
+ #4*#9 + #5*#8 + #6*#7
+ ( #5*#9 + #6*#8 + #6*#9 / \c_@@_myriad_int )
/ \c_@@_myriad_int ; ;
@@ -268,7 +268,7 @@
{
\exp_after:wN \@@_fixed_div_int_after:Nw
\exp_after:wN #8
- \__int_value:w \__int_eval:w - 1
+ \int_value:w \@@_int_eval:w - 1
\@@_fixed_div_int:wnN
#1; {#7} \@@_fixed_div_int_auxi:wnn
#2; {#7} \@@_fixed_div_int_auxi:wnn
@@ -280,7 +280,7 @@
\cs_new:Npn \@@_fixed_div_int:wnN #1; #2 #3
{
\exp_after:wN #3
- \__int_value:w \__int_eval:w #1 / #2 - 1 ;
+ \int_value:w \@@_int_eval:w #1 / #2 - 1 ;
{#2}
{#1}
}
@@ -288,9 +288,9 @@
{
+ #1
\exp_after:wN \@@_fixed_div_int_pack:Nw
- \__int_value:w \__int_eval:w 9999
+ \int_value:w \@@_int_eval:w 9999
\exp_after:wN \@@_fixed_div_int:wnN
- \__int_value:w \__int_eval:w #3 - #1*#2 \__int_eval_end:
+ \int_value:w \@@_int_eval:w #3 - #1*#2 \@@_int_eval_end:
}
\cs_new:Npn \@@_fixed_div_int_auxii:wnn #1; #2 #3 { + #1 + 2 ; }
\cs_new:Npn \@@_fixed_div_int_pack:Nw #1 #2; { + #1; {#2} }
@@ -332,9 +332,9 @@
\cs_new:Npn \@@_fixed_add:Nnnnnwnn #1 #2#3#4#5 #6; #7#8
{
\exp_after:wN \@@_fixed_add_after:NNNNNwn
- \__int_value:w \__int_eval:w 9 9999 9998 + #2#3 #1 #7#8
+ \int_value:w \@@_int_eval:w 9 9999 9998 + #2#3 #1 #7#8
\exp_after:wN \@@_fixed_add_pack:NNNNNwn
- \__int_value:w \__int_eval:w 1 9999 9998 + #4#5
+ \int_value:w \@@_int_eval:w 1 9999 9998 + #4#5
\@@_fixed_add:nnNnnnwn #6 #1
}
\cs_new:Npn \@@_fixed_add:nnNnnnwn #1#2 #3 #4#5 #6#7 ; #8
@@ -341,7 +341,7 @@
{
#3 #4#5
\exp_after:wN \@@_fixed_add_pack:NNNNNwn
- \__int_value:w \__int_eval:w 2 0000 0000 #3 #6#7 + #1#2 ; {#8} ;
+ \int_value:w \@@_int_eval:w 2 0000 0000 #3 #6#7 + #1#2 ; {#8} ;
}
\cs_new:Npn \@@_fixed_add_pack:NNNNNwn #1 #2#3#4#5 #6; #7
{ + #1 ; {#7} {#2#3#4#5} {#6} }
@@ -401,21 +401,21 @@
\cs_new:Npn \@@_fixed_mul:wwn #1#2#3#4 #5; #6#7#8#9
{
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_leading_shift_int
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #1*#6
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #1*#7 + #2*#6
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #1*#8 + #2*#7 + #3*#6
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #1*#9 + #2*#8 + #3*#7 + #4*#6
\exp_after:wN \@@_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_trailing_shift_int
+ #2*#9 + #3*#8 + #4*#7
+ ( #3*#9 + #4*#8
+ \@@_fixed_mul:nnnnnnnw #5 {#6}{#7} {#1}{#2}
@@ -485,9 +485,9 @@
\cs_new:Npn \@@_fixed_mul_add:wwwn #1; #2; #3#4#5#6#7#8;
{
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_big_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_leading_shift_int
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int + #3 #4
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int + #3 #4
\@@_fixed_mul_add:Nwnnnwnnn +
+ #5 #6 ; #2 ; #1 ; #2 ; +
+ #7 #8 ; ;
@@ -495,9 +495,9 @@
\cs_new:Npn \@@_fixed_mul_sub_back:wwwn #1; #2; #3#4#5#6#7#8;
{
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_big_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_leading_shift_int
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int + #3 #4
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int + #3 #4
\@@_fixed_mul_add:Nwnnnwnnn -
+ #5 #6 ; #2 ; #1 ; #2 ; -
+ #7 #8 ; ;
@@ -505,9 +505,10 @@
\cs_new:Npn \@@_fixed_one_minus_mul:wwn #1; #2;
{
\exp_after:wN \@@_fixed_mul_after:wwn
- \__int_value:w \__int_eval:w \c_@@_big_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_leading_shift_int
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int + 1 0000 0000
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int +
+ 1 0000 0000
\@@_fixed_mul_add:Nwnnnwnnn -
; #2 ; #1 ; #2 ; -
; ;
@@ -537,13 +538,13 @@
{
#1 #7*#3
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
#1 #7*#4 #1 #8*#3
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
#1 #7*#5 #1 #8*#4 #1 #9*#3 #2
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_middle_shift_int
#1 \@@_fixed_mul_add:nnnnwnnnn {#7}{#8}{#9}
}
% \end{macrocode}
@@ -575,7 +576,7 @@
{
( #1*#9 + #2*#8 + #3*#7 + #4*#6 )
\exp_after:wN \@@_pack_big:NNNNNNw
- \__int_value:w \__int_eval:w \c_@@_big_trailing_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_big_trailing_shift_int
\@@_fixed_mul_add:nnnnwnnwN
{ #6 + #4*#7 + #3*#8 + #2*#9 + #1 }
{ #7 + #4*#8 + #3*#9 + #2 }
@@ -631,7 +632,7 @@
\cs_new:Npn \@@_ep_to_fixed:wwn #1,#2
{
\exp_after:wN \@@_ep_to_fixed_auxi:www
- \__int_value:w \__int_eval:w 1 0000 0000 + #2 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w 1 0000 0000 + #2 \exp_after:wN ;
\exp:w \exp_end_continue_f:w
\prg_replicate:nn { 4 - \int_max:nn {#1} { -32 } } { 0 } ;
}
@@ -672,10 +673,10 @@
\cs_new:Npn \@@_ep_to_ep:wwN #1,#2#3#4#5#6#7; #8
{
\exp_after:wN #8
- \__int_value:w \__int_eval:w #1 + 4
+ \int_value:w \@@_int_eval:w #1 + 4
\exp_after:wN \use_i:nn
\exp_after:wN \@@_ep_to_ep_loop:N
- \__int_value:w \__int_eval:w 1 0000 0000 + #2 \__int_eval_end:
+ \int_value:w \@@_int_eval:w 1 0000 0000 + #2 \@@_int_eval_end:
#3#4#5#6#7 ; ; !
}
\cs_new:Npn \@@_ep_to_ep_loop:N #1
@@ -756,7 +757,7 @@
\cs_new:Npn \@@_ep_mul_raw:wwwwN #1,#2; #3,#4; #5
{
\@@_fixed_mul:wwn #2; #4;
- { \exp_after:wN #5 \__int_value:w \__int_eval:w #1 + #3 , }
+ { \exp_after:wN #5 \int_value:w \@@_int_eval:w #1 + #3 , }
}
% \end{macrocode}
% \end{macro}
@@ -932,15 +933,15 @@
\cs_new:Npn \@@_ep_div_esti:wwwwn #1,#2#3; #4,
{
\exp_after:wN \@@_ep_div_estii:wwnnwwn
- \__int_value:w \__int_eval:w 10 0000 0000 / ( #2 + 1 )
+ \int_value:w \@@_int_eval:w 10 0000 0000 / ( #2 + 1 )
\exp_after:wN ;
- \__int_value:w \__int_eval:w #4 - #1 + 1 ,
+ \int_value:w \@@_int_eval:w #4 - #1 + 1 ,
{#2} #3;
}
\cs_new:Npn \@@_ep_div_estii:wwnnwwn #1; #2,#3#4#5; #6; #7
{
\exp_after:wN \@@_ep_div_estiii:NNNNNwwwn
- \__int_value:w \__int_eval:w 10 0000 0000 - 1750
+ \int_value:w \@@_int_eval:w 10 0000 0000 - 1750
+ #1 000 + (10 0000 0000 / #3 - #1) * (1000 - #4 / 10) ;
{#3}{#4}#5; #6; { #7 #2, }
}
@@ -975,11 +976,11 @@
\cs_new:Npn \@@_ep_div_epsi:wnNNNNNn #1#2#3#4#5#6;
{
\exp_after:wN \@@_ep_div_epsii:wwnNNNNNn
- \__int_value:w \__int_eval:w 1 9998 - #2
+ \int_value:w \@@_int_eval:w 1 9998 - #2
\exp_after:wN \@@_ep_div_eps_pack:NNNNNw
- \__int_value:w \__int_eval:w 1 9999 9998 - #3#4
+ \int_value:w \@@_int_eval:w 1 9999 9998 - #3#4
\exp_after:wN \@@_ep_div_eps_pack:NNNNNw
- \__int_value:w \__int_eval:w 2 0000 0000 - #5#6 ; ;
+ \int_value:w \@@_int_eval:w 2 0000 0000 - #5#6 ; ;
}
\cs_new:Npn \@@_ep_div_eps_pack:NNNNNw #1#2#3#4#5#6;
{ + #1 ; {#2#3#4#5} {#6} }
@@ -1049,7 +1050,7 @@
\cs_new:Npn \@@_ep_isqrt_auxi:wwn #1,
{
\exp_after:wN \@@_ep_isqrt_auxii:wwnnnwn
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\int_if_odd:nTF {#1}
{ (1 - #1) / 2 , 535 , { 0 } { } }
{ 1 - #1 / 2 , 168 , { } { 0 } }
@@ -1092,7 +1093,7 @@
\exp_after:wN \@@_ep_isqrt_estii:wwwnnwn
\fi:
\exp_after:wN \@@_ep_isqrt_esti:wwwnnwn
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
(#1 + 1 0050 0000 #4 / (#1 * #3)) / 2 ,
#1, #3, {#4}
}
@@ -1099,8 +1100,8 @@
\cs_new:Npn \@@_ep_isqrt_estii:wwwnnwn #1, #2, #3, #4#5
{
\exp_after:wN \@@_ep_isqrt_estiii:NNNNNwwwn
- \__int_value:w \__int_eval:w 1000 0000 + #2 * #2 #5 * 5
- \exp_after:wN , \__int_value:w \__int_eval:w 10000 + #2 ;
+ \int_value:w \@@_int_eval:w 1000 0000 + #2 * #2 #5 * 5
+ \exp_after:wN , \int_value:w \@@_int_eval:w 10000 + #2 ;
}
\cs_new:Npn \@@_ep_isqrt_estiii:NNNNNwwwn 1#1#2#3#4#5#6, 1#7#8; #9;
{
@@ -1149,7 +1150,7 @@
% integer expression then convert the fixed point number.
% \begin{macrocode}
\cs_new:Npn \@@_ep_to_float_o:wwN #1,
- { + \__int_eval:w #1 \@@_fixed_to_float_o:wN }
+ { + \@@_int_eval:w #1 \@@_fixed_to_float_o:wN }
\cs_new:Npn \@@_ep_inv_to_float_o:wwN #1,#2;
{
\@@_ep_div:wwwwn 1,{1000}{0000}{0000}{0000}{0000}{0000}; #1,#2;
@@ -1184,7 +1185,7 @@
% \begin{macro}[rEXP]
% {\@@_fixed_to_float_o:wN, \@@_fixed_to_float_o:Nw}
% \begin{syntax}
-% \ldots{} \cs{__int_eval:w} \meta{exponent} \cs{@@_fixed_to_float_o:wN} \Arg{a_1} \Arg{a_2} \Arg{a_3} \Arg{a_4} \Arg{a_5} \Arg{a_6} |;| \meta{sign}
+% \ldots{} \cs{@@_int_eval:w} \meta{exponent} \cs{@@_fixed_to_float_o:wN} \Arg{a_1} \Arg{a_2} \Arg{a_3} \Arg{a_4} \Arg{a_5} \Arg{a_6} |;| \meta{sign}
% \end{syntax}
% yields
% \begin{quote}
@@ -1198,18 +1199,19 @@
%
%^^A todo: round properly when rounding to infinity: I need the sign.
% \begin{macrocode}
-\cs_new:Npn \@@_fixed_to_float_o:Nw #1#2; { \@@_fixed_to_float_o:wN #2; #1 }
+\cs_new:Npn \@@_fixed_to_float_o:Nw #1#2;
+ { \@@_fixed_to_float_o:wN #2; #1 }
\cs_new:Npn \@@_fixed_to_float_o:wN #1#2#3#4#5#6; #7
- {
- + \__int_eval:w \c_@@_block_int % for the 8-digit-at-the-start thing.
+ { % for the 8-digit-at-the-start thing
+ + \@@_int_eval:w \c_@@_block_int
\exp_after:wN \exp_after:wN
\exp_after:wN \@@_fixed_to_loop:N
\exp_after:wN \use_none:n
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
1 0000 0000 + #1 \exp_after:wN \@@_use_none_stop_f:n
- \__int_value:w 1#2 \exp_after:wN \@@_use_none_stop_f:n
- \__int_value:w 1#3#4 \exp_after:wN \@@_use_none_stop_f:n
- \__int_value:w 1#5#6
+ \int_value:w 1#2 \exp_after:wN \@@_use_none_stop_f:n
+ \int_value:w 1#3#4 \exp_after:wN \@@_use_none_stop_f:n
+ \int_value:w 1#5#6
\exp_after:wN ;
\exp_after:wN ;
}
@@ -1250,9 +1252,9 @@
\cs_new:Npn \@@_fixed_to_float_round_up:wnnnnw ; #1#2#3#4 ;
{
\exp_after:wN \@@_basics_pack_high:NNNNNw
- \__int_value:w \__int_eval:w 1 #1#2
+ \int_value:w \@@_int_eval:w 1 #1#2
\exp_after:wN \@@_basics_pack_low:NNNNNw
- \__int_value:w \__int_eval:w 1 #3#4 + 1 ;
+ \int_value:w \@@_int_eval:w 1 #3#4 + 1 ;
}
% \end{macrocode}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -131,7 +131,7 @@
\if_int_compare:w
\exp_after:wN \@@_compare_aux:wn
\exp:w \exp_end_continue_f:w \@@_parse:n {#1} {#3}
- = \__int_eval:w `#2 - `= \__int_eval_end:
+ = \@@_int_eval:w `#2 - `= \@@_int_eval_end:
\prg_return_true:
\else:
\prg_return_false:
@@ -182,7 +182,7 @@
\s_@@ \@@_chk:w #1 #2 #3;
\s_@@ \@@_chk:w #4 #5 #6;
{
- \__int_value:w
+ \int_value:w
\if_meaning:w 3 #1 \exp_after:wN \@@_compare_nan:w \fi:
\if_meaning:w 3 #4 \exp_after:wN \@@_compare_nan:w \fi:
\if_meaning:w 2 #5 - \fi:
@@ -214,7 +214,7 @@
% Tuple and floating point numbers are not comparable so return $2$ in
% mixed cases or when tuples have a different number of items.
% Otherwise compare pairs of items with \cs{@@_compare_back_any:ww}
-% and if any don't match return~$2$ (as \cs{__int_value:w} |02|
+% and if any don't match return~$2$ (as \cs{int_value:w} |02|
% \cs{exp_stop_f:}).
% \begin{macrocode}
\cs_new:Npn \@@_compare_back_tuple:ww #1; #2; { 2 }
@@ -223,13 +223,14 @@
\s_@@_tuple \@@_tuple_chk:w #1;
\s_@@_tuple \@@_tuple_chk:w #2;
{
- \int_compare:nNnTF { \@@_array_count:n {#1} } = { \@@_array_count:n {#2} }
+ \int_compare:nNnTF { \@@_array_count:n {#1} } =
+ { \@@_array_count:n {#2} }
{
- \__int_value:w 0
+ \int_value:w 0
\@@_tuple_compare_back_loop:w
- #1 { \s_@@ \__prg_break: } ; @
- #2 { \s_@@ \__prg_break: } ;
- \__prg_break_point:
+ #1 { \s_@@ \prg_break: } ; @
+ #2 { \s_@@ \prg_break: } ;
+ \prg_break_point:
\exp_stop_f:
}
{ 2 }
@@ -241,7 +242,7 @@
\if_int_compare:w
\@@_compare_back_any:ww #1 #2 ; #4 #5 ; = 0 \exp_stop_f:
\else:
- 2 \exp_after:wN \__prg_break:
+ 2 \exp_after:wN \prg_break:
\fi:
\@@_tuple_compare_back_loop:w #3 @
}
@@ -256,7 +257,7 @@
% \Arg{expo_1} \meta{body_1} |;|
% \Arg{expo_2} \meta{body_2} |;|
% \end{quote}
-% Within an \cs{__int_value:w} \ldots{} \cs{exp_stop_f:} construction,
+% Within an \cs{int_value:w} \ldots{} \cs{exp_stop_f:} construction,
% this expands to $0$ if the two numbers are equal, $-1$ if the first
% is smaller, and $1$ if the first is bigger. First compare the
% exponents: the larger one denotes the larger number. If they are
@@ -398,11 +399,11 @@
% \begin{macrocode}
\cs_new:Npn \@@_step:wwwN #1#2; #3#4; #5#6; #7
{
- \@@_if_type_fp:NTwFw #1 { } \s_@@ \__prg_break: \q_stop
- \@@_if_type_fp:NTwFw #3 { } \s_@@ \__prg_break: \q_stop
- \@@_if_type_fp:NTwFw #5 { } \s_@@ \__prg_break: \q_stop
+ \@@_if_type_fp:NTwFw #1 { } \s_@@ \prg_break: \q_stop
+ \@@_if_type_fp:NTwFw #3 { } \s_@@ \prg_break: \q_stop
+ \@@_if_type_fp:NTwFw #5 { } \s_@@ \prg_break: \q_stop
\use_i:nnnn { \@@_step_fp:wwwN #1#2; #3#4; #5#6; #7 }
- \__prg_break_point:
+ \prg_break_point:
\use:n
{
\@@_error:nfff { fp-step-tuple } { \fp_to_tl:n { #1#2 ; } }
@@ -419,8 +420,11 @@
}
{
\token_if_eq_meaning:NNTF #2 0
- { \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#6} }
{
+ \__kernel_msg_expandable_error:nnn { kernel }
+ { zero-step } {#6}
+ }
+ {
\@@_error:nnfn { fp-bad-step } { }
{ \fp_to_tl:n { \s_@@ \@@_chk:w #2#3#4 ; } } {#6}
}
@@ -457,17 +461,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \fp_step_inline:nnnn
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \@@_step:NNnnnn
\cs_gset_protected:Npn
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
}
\cs_new_protected:Npn \fp_step_variable:nnnNn #1#2#3#4#5
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \@@_step:NNnnnn
\cs_gset_protected:Npx
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
{#1} {#2} {#3}
{
\tl_set:Nn \exp_not:N #4 {##1}
@@ -478,7 +482,7 @@
{
#1 #2 ##1 {#6}
\fp_step_function:nnnN {#3} {#4} {#5} #2
- \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__kernel_prg_map_int }
}
% \end{macrocode}
% \end{macro}
@@ -637,7 +641,8 @@
\cs_new:Npn \@@_|_o:ww { \@@_&_o:ww \else: }
\cs_new:Npn \@@_|_tuple_o:ww { \@@_&_tuple_o:ww \else: }
\cs_new:Npn \@@_tuple_|_o:ww #1; #2; { \@@_exp_after_tuple_o:w #1; }
- \cs_new:Npn \@@_tuple_|_tuple_o:ww #1; #2; { \@@_exp_after_tuple_o:w #1; }
+ \cs_new:Npn \@@_tuple_|_tuple_o:ww #1; #2;
+ { \@@_exp_after_tuple_o:w #1; }
\group_end:
\cs_new:Npn \@@_and_return:wNw #1; \fi: #2;
{ \fi: \@@_exp_after_o:w #1; }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -183,11 +183,11 @@
% already been found, and that we want to parse the next number. The
% current status of the code may look as follows.
% \begin{syntax}
-% \cs{exp_after:wN} |\add:ww| \cs{__int_value:w} 12345 \cs{exp_after:wN} ;
+% \cs{exp_after:wN} |\add:ww| \cs{int_value:w} 12345 \cs{exp_after:wN} ;
% \cs{exp:w} |\operand:w| \meta{stuff}
% \end{syntax}
% One step of expansion expands \cs{exp_after:wN}, which triggers the
-% primitive \cs{__int_value:w}, which reads the five digits we have
+% primitive \cs{int_value:w}, which reads the five digits we have
% already found, |12345|. This integer is unfinished, causing the
% second \cs{exp_after:wN} to expand, and to trigger the construction
% \cs{exp:w}, which expands |\operand:w|, defined to read
@@ -195,13 +195,13 @@
% number, and a semicolon in the input stream. Once |\operand:w| is
% done expanding, we obtain essentially
% \begin{syntax}
-% \cs{exp_after:wN} |\add:ww| \cs{__int_value:w} 12345 ;
+% \cs{exp_after:wN} |\add:ww| \cs{int_value:w} 12345 ;
% \cs{exp:w} \cs{exp_end:} 333444 ;
% \end{syntax}
% where in fact \cs{exp_after:wN} has already been expanded,
-% \cs{__int_value:w} has already seen |12345|, and
+% \cs{int_value:w} has already seen |12345|, and
% \cs{exp:w} is still looking for a number. It finds
-% \cs{exp_end:}, hence expands to nothing. Now, \cs{__int_value:w} sees
+% \cs{exp_end:}, hence expands to nothing. Now, \cs{int_value:w} sees
% the \texttt{;}, which cannot be part of a number. The expansion
% stops, and we are left with
% \begin{syntax}
@@ -212,7 +212,7 @@
%
% If we were to continue parsing the expression, then the following
% number should also be cleaned up before the next use of a binary
-% operation such as |\add:ww|. Just like \cs{__int_value:w} |12345|
+% operation such as |\add:ww|. Just like \cs{int_value:w} |12345|
% \cs{exp_after:wN}~|;| expanded what follows once, we need |\add:ww|
% to do the calculation, and in the process to expand the following
% once. This is also true in our real application: all the functions of
@@ -521,7 +521,7 @@
% character code, testing if |`#1| lies in $[65,90]$ (uppercase letters)
% or $[97,112]$ (lowercase letters)
% \begin{verbatim}
-% \if_int_compare:w \__int_eval:w
+% \if_int_compare:w \__fp_int_eval:w
% ( `#1 \if_int_compare:w `#1 > `Z - 32 \fi: ) / 26 = 3 \exp_stop_f:
% is a letter
% \else:
@@ -651,8 +651,8 @@
% \@@_parse_digits_i:N ,
% \@@_parse_digits_:N
% }
-% These functions must be called within an \cs{__int_value:w} or
-% \cs{__int_eval:w} construction. The first token which follows must
+% These functions must be called within an \cs{int_value:w} or
+% \cs{@@_int_eval:w} construction. The first token which follows must
% be \texttt{f}-expanded prior to calling those functions. The
% functions read tokens one by one, and output digits into the input
% stream, until meeting a non-digit, or up to a number of digits equal
@@ -791,7 +791,8 @@
}
\cs_new:cpn { @@_exp_after_?_f:nw } #1#2
{
- \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2}
+ \__kernel_msg_expandable_error:nnn { kernel } { bad-variable }
+ {#2}
\exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
}
%<*package>
@@ -805,9 +806,15 @@
\str_if_eq:nnTF {##2} { \protect }
{
\cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n }
- { \__kernel_msg_expandable_error:nnn { kernel } { fp-robust-cmd } }
+ {
+ \__kernel_msg_expandable_error:nnn { kernel }
+ { fp-robust-cmd }
+ }
}
- { \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {##2} }
+ {
+ \__kernel_msg_expandable_error:nnn { kernel }
+ { bad-variable } {##2}
+ }
}
}
}
@@ -824,8 +831,6 @@
% \@@_parse_one_register_int:www,
% \@@_parse_one_register_mu:www,
% \@@_parse_one_register_dim:ww,
-% \@@_parse_one_register_wd:w,
-% \@@_parse_one_register_wd:Nw,
% }
% This is called whenever~|#2| is a control sequence other than
% \cs{scan_stop:} in meaning. We special-case \tn{wd}, \tn{ht}, \tn{dp}
@@ -840,7 +845,7 @@
% registers, the decimal rounding provided by \TeX{} does not
% accurately represent the binary value that it manipulates, so we
% extract this binary value as a number of scaled points with
-% \cs{__int_value:w} \cs{__dim_eval:w} \meta{decimal value} |pt|, and
+% \cs{int_value:w} \cs{dim_to_decimal_in_sp:n} |{| \meta{decimal value} |pt| |}|, and
% use an auxiliary of \cs{dim_to_fp:n}, which performs the
% multiplication by $2^{-16}$, correctly rounded.
% \begin{macrocode}
@@ -849,12 +854,10 @@
\exp_after:wN \@@_parse_infix_after_operand:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \if_meaning:w \box_wd:N #2 \@@_parse_one_register_wd:w \fi:
- \if_meaning:w \box_ht:N #2 \@@_parse_one_register_wd:w \fi:
- \if_meaning:w \box_dp:N #2 \@@_parse_one_register_wd:w \fi:
+ \@@_parse_one_register_special:N #2
\exp_after:wN \@@_parse_one_register_aux:Nw
\exp_after:wN #2
- \__int_value:w
+ \int_value:w
\exp_after:wN \@@_parse_exponent:N
\exp:w \@@_parse_expand:w
}
@@ -884,10 +887,19 @@
\cs_new:Npn \@@_parse_one_register_dim:ww #1; #2;
{
\exp_after:wN \@@_from_dim_test:ww
- \__int_value:w #2 \exp_after:wN ,
- \__int_value:w \__dim_eval:w #1 pt ;
+ \int_value:w #2 \exp_after:wN ,
+ \int_value:w \dim_to_decimal_in_sp:n { #1 pt } ;
}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_parse_one_register_special:N,
+% \@@_parse_one_register_math:NNw,
+% \@@_parse_one_register_wd:w,
+% \@@_parse_one_register_wd:Nw
+% }
% The \tn{wd}, \tn{dp}, \tn{ht} primitives expect an integer argument.
% We abuse the exponent parser to find the integer argument: simply
% include the exponent marker~|e|. Once that \enquote{exponent} is
@@ -894,6 +906,30 @@
% found, use \cs{tex_the:D} to find the box dimension and then copy
% what we did for dimensions.
% \begin{macrocode}
+\cs_new:Npn \@@_parse_one_register_special:N #1
+ {
+ \if_meaning:w \box_wd:N #1 \@@_parse_one_register_wd:w \fi:
+ \if_meaning:w \box_ht:N #1 \@@_parse_one_register_wd:w \fi:
+ \if_meaning:w \box_dp:N #1 \@@_parse_one_register_wd:w \fi:
+ \if_meaning:w \infty #1
+ \@@_parse_one_register_math:NNw \infty #1
+ \fi:
+ \if_meaning:w \pi #1
+ \@@_parse_one_register_math:NNw \pi #1
+ \fi:
+ }
+\cs_new:Npn \@@_parse_one_register_math:NNw
+ #1#2#3#4 \@@_parse_expand:w
+ {
+ #3
+ \str_if_eq:nnTF {#1} {#2}
+ {
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { fp-infty-pi } {#1}
+ \c_nan_fp
+ }
+ { #4 \@@_parse_expand:w }
+ }
\cs_new:Npn \@@_parse_one_register_wd:w
#1#2 \exp_after:wN #3#4 \@@_parse_expand:w
{
@@ -905,8 +941,7 @@
{
\exp_after:wN \@@_from_dim_test:ww
\exp_after:wN 0 \exp_after:wN ,
- \__int_value:w \__dim_eval:w
- \exp_after:wN \use:n \exp_after:wN { \tex_the:D #1 #2 } ;
+ \int_value:w \dim_to_decimal_in_sp:n { #1 #2 } ;
}
% \end{macrocode}
% \end{macro}
@@ -926,7 +961,7 @@
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
\exp_after:wN \@@_sanitize:wN
- \__int_value:w \__int_eval:w 0 \@@_parse_trim_zeros:N
+ \int_value:w \@@_int_eval:w 0 \@@_parse_trim_zeros:N
}
% \end{macrocode}
% \end{macro}
@@ -941,7 +976,7 @@
\cs_new:Npn \@@_parse_one_other:NN #1 #2
{
\if_int_compare:w
- \__int_eval:w
+ \@@_int_eval:w
( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
= 3 \exp_stop_f:
\exp_after:wN \@@_parse_word:Nw
@@ -984,7 +1019,8 @@
{
\cs_if_exist_use:cF { @@_parse_word_#2:N }
{
- \cs_if_exist_use:cF { @@_parse_caseless_ \str_fold_case:n {#2} :N }
+ \cs_if_exist_use:cF
+ { @@_parse_caseless_ \str_fold_case:n {#2} :N }
{
\__kernel_msg_expandable_error:nnn
{ kernel } { unknown-fp-word } {#2}
@@ -1001,7 +1037,7 @@
\if_catcode:w \scan_stop: \exp_not:N #1
0
\else:
- \__int_eval:w
+ \@@_int_eval:w
( `#1 \if_int_compare:w `#1 > `Z - 32 \fi: ) / 26
\fi:
= 3 \exp_stop_f:
@@ -1144,7 +1180,7 @@
\cs_new:Npn \@@_parse_zero:
{
\exp_after:wN ; \exp_after:wN 1
- \__int_value:w \@@_parse_exponent:N
+ \int_value:w \@@_parse_exponent:N
}
% \end{macrocode}
% \end{macro}
@@ -1156,11 +1192,11 @@
% and removed all leading zeros from the significand. It is followed
% by a non-zero digit (with any catcode). The goal is to read up to
% $16$ digits. But we can't do that all at once, because
-% \cs{__int_value:w} (which allows us to collect digits and continue
+% \cs{int_value:w} (which allows us to collect digits and continue
% expanding) can only go up to $9$ digits. Hence we grab digits in
% two steps of $8$ digits. Since |#1| is a digit, read seven more
% digits using \cs{@@_parse_digits_vii:N}. The \texttt{small_leading}
-% auxiliary leaves those digits in the \cs{__int_value:w}, and
+% auxiliary leaves those digits in the \cs{int_value:w}, and
% grabs some more, or stops if there are no more digits. Then the
% \texttt{pack_leading} auxiliary puts the various parts in the
% appropriate order for the processing further up.
@@ -1168,9 +1204,9 @@
\cs_new:Npn \@@_parse_small:N #1
{
\exp_after:wN \@@_parse_pack_leading:NNNNNww
- \__int_value:w \__int_eval:w 1 \token_to_str:N #1
+ \int_value:w \@@_int_eval:w 1 \token_to_str:N #1
\exp_after:wN \@@_parse_small_leading:wwNN
- \__int_value:w 1
+ \int_value:w 1
\exp_after:wN \@@_parse_digits_vii:N
\exp:w \@@_parse_expand:w
}
@@ -1196,11 +1232,11 @@
#1 #2
\exp_after:wN \@@_parse_pack_trailing:NNNNNNww
\exp_after:wN 0
- \__int_value:w \__int_eval:w 1
+ \int_value:w \@@_int_eval:w 1
\if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
\token_to_str:N #4
\exp_after:wN \@@_parse_small_trailing:wwNN
- \__int_value:w 1
+ \int_value:w 1
\exp_after:wN \@@_parse_digits_vi:N
\exp:w
\else:
@@ -1294,7 +1330,7 @@
\cs_new:Npn \@@_parse_large:N #1
{
\exp_after:wN \@@_parse_large_leading:wwNN
- \__int_value:w 1 \token_to_str:N #1
+ \int_value:w 1 \token_to_str:N #1
\exp_after:wN \@@_parse_digits_vii:N
\exp:w \@@_parse_expand:w
}
@@ -1320,19 +1356,19 @@
{
+ \c_@@_half_prec_int - #3
\exp_after:wN \@@_parse_pack_leading:NNNNNww
- \__int_value:w \__int_eval:w 1 #1
+ \int_value:w \@@_int_eval:w 1 #1
\if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
\exp_after:wN \@@_parse_large_trailing:wwNN
- \__int_value:w 1 \token_to_str:N #4
+ \int_value:w 1 \token_to_str:N #4
\exp_after:wN \@@_parse_digits_vi:N
\exp:w
\else:
\if:w . \exp_not:N #4
\exp_after:wN \@@_parse_small_leading:wwNN
- \__int_value:w 1
+ \int_value:w 1
\cs:w
@@_parse_digits_
- \__int_to_roman:w #3
+ \@@_int_to_roman:w #3
:N \exp_after:wN
\cs_end:
\exp:w
@@ -1340,7 +1376,7 @@
#2
\exp_after:wN \@@_parse_pack_trailing:NNNNNNww
\exp_after:wN 0
- \__int_value:w 1 0000 0000
+ \int_value:w 1 0000 0000
\@@_parse_exponent:Nw #4
\fi:
\fi:
@@ -1372,20 +1408,20 @@
\if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
\exp_after:wN \@@_parse_pack_trailing:NNNNNNww
\exp_after:wN \c_@@_half_prec_int
- \__int_value:w \__int_eval:w 1 #1 \token_to_str:N #4
+ \int_value:w \@@_int_eval:w 1 #1 \token_to_str:N #4
\exp_after:wN \@@_parse_large_round:NN
\exp_after:wN #4
\exp:w
\else:
\exp_after:wN \@@_parse_pack_trailing:NNNNNNww
- \__int_value:w \__int_eval:w 7 - #3 \exp_stop_f:
- \__int_value:w \__int_eval:w 1 #1
+ \int_value:w \@@_int_eval:w 7 - #3 \exp_stop_f:
+ \int_value:w \@@_int_eval:w 1 #1
\if:w . \exp_not:N #4
\exp_after:wN \@@_parse_small_trailing:wwNN
- \__int_value:w 1
+ \int_value:w 1
\cs:w
@@_parse_digits_
- \__int_to_roman:w #3
+ \@@_int_to_roman:w #3
:N \exp_after:wN
\cs_end:
\exp:w
@@ -1450,7 +1486,7 @@
\cs_new:Npn \@@_parse_round_after:wN #1; #2
{
+ #2 \exp_after:wN ;
- \__int_value:w \__int_eval:w #1 + \@@_parse_exponent:N
+ \int_value:w \@@_int_eval:w #1 + \@@_parse_exponent:N
}
% \end{macrocode}
% \end{macro}
@@ -1478,9 +1514,9 @@
\exp_after:wN 0
\exp_after:wN #1
\exp_after:wN #2
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\exp_after:wN \@@_parse_round_after:wN
- \__int_value:w \__int_eval:w 0 * \__int_eval:w 0
+ \int_value:w \@@_int_eval:w 0 * \@@_int_eval:w 0
\exp_after:wN \@@_parse_round_loop:N
\exp:w
\else:
@@ -1519,9 +1555,9 @@
\exp_after:wN 0
\exp_after:wN #1
\exp_after:wN #2
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\exp_after:wN \@@_parse_large_round_aux:wNN
- \__int_value:w \__int_eval:w 1
+ \int_value:w \@@_int_eval:w 1
\exp_after:wN \@@_parse_round_loop:N
\else: %^^A could be dot, or e, or other
\exp_after:wN \@@_parse_large_round_test:NN
@@ -1544,9 +1580,9 @@
{
+ #2
\exp_after:wN \@@_parse_round_after:wN
- \__int_value:w \__int_eval:w #1
+ \int_value:w \@@_int_eval:w #1
\if:w . \exp_not:N #3
- + 0 * \__int_eval:w 0
+ + 0 * \@@_int_eval:w 0
\exp_after:wN \@@_parse_round_loop:N
\exp:w \exp_after:wN \@@_parse_expand:w
\else:
@@ -1591,12 +1627,12 @@
% This auxiliary is convenient to smuggle some material through
% \cs{fi:} ending conditional processing. We place those \cs{fi:}
% (argument~|#2|) at a very odd place because this allows us to insert
-% \cs{__int_eval:w} \ldots{} there if needed.
+% \cs{@@_int_eval:w} \ldots{} there if needed.
% \begin{macrocode}
\cs_new:Npn \@@_parse_exponent:Nw #1 #2 \@@_parse_expand:w
{
\exp_after:wN ;
- \__int_value:w #2 \@@_parse_exponent:N #1
+ \int_value:w #2 \@@_parse_exponent:N #1
}
% \end{macrocode}
% \end{macro}
@@ -1603,7 +1639,7 @@
%
% \begin{macro}[rEXP]
% {\@@_parse_exponent:N, \@@_parse_exponent_aux:N}
-% This function should be called within an \cs{__int_value:w}
+% This function should be called within an \cs{int_value:w}
% expansion (or within an integer expression). It leaves digits of the
% exponent behind it in the input stream, and terminates the expansion
% with a semicolon. If there is no~|e|, leave an exponent of~$0$. If
@@ -1716,7 +1752,7 @@
\if_catcode:w \scan_stop: \exp_not:N #1
\if_meaning:w \scan_stop: #1
\if_int_compare:w
- \__str_if_eq_x:nn { \s_@@ } { \exp_not:N #1 }
+ \@@_str_if_eq_x:nn { \s_@@ } { \exp_not:N #1 }
= 0 \exp_stop_f:
0
\__kernel_msg_expandable_error:nnn
@@ -1730,9 +1766,9 @@
\fi:
\else:
\if_int_compare:w
- \__str_if_eq_x:nn { \__int_value:w #1 } { \tex_the:D #1 }
+ \@@_str_if_eq_x:nn { \int_value:w #1 } { \tex_the:D #1 }
= 0 \exp_stop_f:
- \__int_value:w #1
+ \int_value:w #1
\else:
0
\__kernel_msg_expandable_error:nnn
@@ -1870,7 +1906,7 @@
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
\exp_after:wN \@@_sanitize:wN
- \__int_value:w \__int_eval:w 0 \@@_parse_strim_zeros:N
+ \int_value:w \@@_int_eval:w 0 \@@_parse_strim_zeros:N
}
% \end{macrocode}
% \end{macro}
@@ -2032,7 +2068,7 @@
{
\exp_after:wN \@@_from_dim_test:ww
\exp_after:wN 0 \exp_after:wN ,
- \__int_value:w \__dim_eval:w 1 #1 \exp_after:wN ;
+ \int_value:w \dim_to_decimal_in_sp:n { 1 #1 } \exp_after:wN ;
\exp:w \exp_end_continue_f:w \@@_parse_infix:NN
}
}
@@ -2224,7 +2260,7 @@
{
\if_catcode:w \scan_stop: \exp_not:N #2
\if_int_compare:w
- \__str_if_eq_x:nn { \s_@@_mark } { \exp_not:N #2 }
+ \@@_str_if_eq_x:nn { \s_@@_mark } { \exp_not:N #2 }
= 0 \exp_stop_f:
\exp_after:wN \exp_after:wN
\exp_after:wN \@@_parse_infix_mark:NNN
@@ -2234,7 +2270,7 @@
\fi:
\else:
\if_int_compare:w
- \__int_eval:w
+ \@@_int_eval:w
( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
= 3 \exp_stop_f:
\exp_after:wN \exp_after:wN
@@ -2563,7 +2599,8 @@
\cs_new:Npn \@@_parse_compare_auxi:NNNNNNN #1#2#3#4#5#6#7
{
\if_case:w
- \__int_eval:w \exp_after:wN ` \token_to_str:N #7 - `< \__int_eval_end:
+ \@@_int_eval:w \exp_after:wN ` \token_to_str:N #7 - `<
+ \@@_int_eval_end:
\@@_parse_compare_auxii:NNNNN #2#2#4#5#6
\or: \@@_parse_compare_auxii:NNNNN #2#3#2#5#6
\or: \@@_parse_compare_auxii:NNNNN #2#3#4#2#6
@@ -2732,8 +2769,8 @@
\exp_after:wN {
\exp:w \exp_end_continue_f:w
\@@_tuple_map_loop_o:nw {#1} #2
- { \s_@@ \__prg_break: } ;
- \__prg_break_point:
+ { \s_@@ \prg_break: } ;
+ \prg_break_point:
\exp_after:wN } \exp_after:wN ;
}
\cs_new:Npn \@@_tuple_map_loop_o:nw #1#2#3 ;
@@ -2759,9 +2796,9 @@
\exp_after:wN {
\exp:w \exp_end_continue_f:w
\@@_tuple_mapthread_loop_o:nw {#1}
- #2 { \s_@@ \__prg_break: } ; @
- #3 { \s_@@ \__prg_break: } ;
- \__prg_break_point:
+ #2 { \s_@@ \prg_break: } ; @
+ #3 { \s_@@ \prg_break: } ;
+ \prg_break_point:
\exp_after:wN } \exp_after:wN ;
}
\cs_new:Npn \@@_tuple_mapthread_loop_o:nw #1#2#3 ; #4 @ #5#6 ;
@@ -2820,7 +2857,7 @@
{
\exp_after:wN \@@_function_args:Nwn
\exp_after:wN #2
- \__int_value:w #3 \exp_after:wN ; \exp_after:wN
+ \int_value:w #3 \exp_after:wN ; \exp_after:wN
}
\exp:w
\@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w
@@ -2913,6 +2950,8 @@
{ #1~expects~between~#2~and~#3~arguments. }
\__kernel_msg_new:nnn { kernel } { fp-bad-args }
{ Arguments~in~#1#2~are~invalid. }
+\__kernel_msg_new:nnn { kernel } { fp-infty-pi }
+ { Math~command~#1 is~not~an~fp }
%<*package>
\cs_if_exist:cT { @unexpandable at protect }
{
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -71,10 +71,9 @@
%
% \subsection{Engine support}
%
-% At present, \XeTeX{}, \pTeX{} and \upTeX{} do not provide random
-% numbers, while \LuaTeX{} and \pdfTeX{} provide the primitive
-% \cs{pdftex_uniformdeviate:D} (\tn{pdfuniformdeviate} in \pdfTeX{} and
-% \tn{uniformdeviate} in \LuaTeX{}). We write the test twice simply in
+% At present, \XeTeX{} does not provide random
+% numbers, while \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{} provide the primitive
+% \cs{pdftex_uniformdeviate:D}. We write the test twice simply in
% order to write the \texttt{false} branch first.
% \begin{macrocode}
\cs_if_exist:NF \pdftex_uniformdeviate:D
@@ -87,6 +86,11 @@
\exp_after:wN \c_nan_fp
}
\cs_new_eq:NN \@@_randint_o:Nw \@@_rand_o:Nw
+ \cs_new:Npn \int_rand:nn #1#2
+ {
+ \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
+ \int_eval:n {#1}
+ }
}
\cs_if_exist:NT \pdftex_uniformdeviate:D
{
@@ -109,11 +113,11 @@
% of \cs{int_rand:nn}. We also use variants of this number
% rounded down to multiples of $10^4$ and $10^8$.
% \begin{macrocode}
-\cs_new:Npn \@@_rand_uniform:
- { \pdftex_uniformdeviate:D \c_@@_rand_size_int }
-\int_const:Nn \c_@@_rand_size_int { 268 435 456 }
-\int_const:Nn \c_@@_rand_four_int { 268 430 000 }
-\int_const:Nn \c_@@_rand_eight_int { 200 000 000 }
+ \cs_new:Npn \@@_rand_uniform:
+ { \pdftex_uniformdeviate:D \c_@@_rand_size_int }
+ \int_const:Nn \c_@@_rand_size_int { 268 435 456 }
+ \int_const:Nn \c_@@_rand_four_int { 268 430 000 }
+ \int_const:Nn \c_@@_rand_eight_int { 200 000 000 }
% \end{macrocode}
% \end{variable}
% \end{macro}
@@ -137,50 +141,50 @@
% characters from the input stream with \cs{use_i:nnn}, \cs{use_i:nn}
% or nothing.
% \begin{macrocode}
-\cs_new:Npn \@@_rand_myriads:n #1
- {
- \@@_rand_myriads_loop:nn #1
- { ? \use_i_delimit_by_q_stop:nw \@@_rand_myriads_last: }
- { ? \use_none_delimit_by_q_stop:w } \q_stop
- }
-\cs_new:Npn \@@_rand_myriads_loop:nn #1#2
- {
- \use_none:n #2
- \exp_after:wN \@@_rand_myriads_get:w
- \__int_value:w \@@_rand_uniform: ; {#1}{#2}
- }
-\cs_new:Npn \@@_rand_myriads_get:w #1 ;
- {
- \if_int_compare:w #1 < \c_@@_rand_eight_int
- \exp_after:wN \use_none:n
- \__int_value:w \__int_eval:w
- \c_@@_rand_eight_int + #1 \__int_eval_end:
- \exp_after:wN \use_i:nnn
- \else:
- \if_int_compare:w #1 < \c_@@_rand_four_int
- \exp_after:wN \use_none:nnnnn
- \__int_value:w \__int_eval:w
- \c_@@_rand_four_int + #1 \__int_eval_end:
- \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn
- \fi:
- \fi:
- \@@_rand_myriads_loop:nn
- }
-\cs_new:Npn \@@_rand_myriads_last:
- {
- \exp_after:wN \@@_rand_myriads_last:w
- \__int_value:w \@@_rand_uniform: ;
- }
-\cs_new:Npn \@@_rand_myriads_last:w #1 ;
- {
- \if_int_compare:w #1 < \c_@@_rand_four_int
- \exp_after:wN \use_none:nnnnn
- \__int_value:w \__int_eval:w
- \c_@@_rand_four_int + #1 \__int_eval_end:
- \else:
- \exp_after:wN \@@_rand_myriads_last:
- \fi:
- }
+ \cs_new:Npn \@@_rand_myriads:n #1
+ {
+ \@@_rand_myriads_loop:nn #1
+ { ? \use_i_delimit_by_q_stop:nw \@@_rand_myriads_last: }
+ { ? \use_none_delimit_by_q_stop:w } \q_stop
+ }
+ \cs_new:Npn \@@_rand_myriads_loop:nn #1#2
+ {
+ \use_none:n #2
+ \exp_after:wN \@@_rand_myriads_get:w
+ \int_value:w \@@_rand_uniform: ; {#1}{#2}
+ }
+ \cs_new:Npn \@@_rand_myriads_get:w #1 ;
+ {
+ \if_int_compare:w #1 < \c_@@_rand_eight_int
+ \exp_after:wN \use_none:n
+ \int_value:w \@@_int_eval:w
+ \c_@@_rand_eight_int + #1 \@@_int_eval_end:
+ \exp_after:wN \use_i:nnn
+ \else:
+ \if_int_compare:w #1 < \c_@@_rand_four_int
+ \exp_after:wN \use_none:nnnnn
+ \int_value:w \@@_int_eval:w
+ \c_@@_rand_four_int + #1 \@@_int_eval_end:
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn
+ \fi:
+ \fi:
+ \@@_rand_myriads_loop:nn
+ }
+ \cs_new:Npn \@@_rand_myriads_last:
+ {
+ \exp_after:wN \@@_rand_myriads_last:w
+ \int_value:w \@@_rand_uniform: ;
+ }
+ \cs_new:Npn \@@_rand_myriads_last:w #1 ;
+ {
+ \if_int_compare:w #1 < \c_@@_rand_four_int
+ \exp_after:wN \use_none:nnnnn
+ \int_value:w \@@_int_eval:w
+ \c_@@_rand_four_int + #1 \@@_int_eval_end:
+ \else:
+ \exp_after:wN \@@_rand_myriads_last:
+ \fi:
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -192,18 +196,18 @@
% First we check that |random| was called without argument. Then get
% four blocks of four digits.
% \begin{macrocode}
-\cs_new:Npn \@@_rand_o:Nw ? #1 @
- {
- \tl_if_empty:nTF {#1}
- { \@@_rand_o: }
+ \cs_new:Npn \@@_rand_o:Nw ? #1 @
{
- \__kernel_msg_expandable_error:nnnnn
- { kernel } { fp-num-args } { rand() } { 0 } { 0 }
- \exp_after:wN \c_nan_fp
+ \tl_if_empty:nTF {#1}
+ { \@@_rand_o: }
+ {
+ \__kernel_msg_expandable_error:nnnnn
+ { kernel } { fp-num-args } { rand() } { 0 } { 0 }
+ \exp_after:wN \c_nan_fp
+ }
}
- }
-\cs_new:Npn \@@_rand_o:
- { \@@_parse_o:n { . \@@_rand_myriads:n { xxxx } } }
+ \cs_new:Npn \@@_rand_o:
+ { \@@_parse_o:n { . \@@_rand_myriads:n { xxxx } } }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -244,89 +248,172 @@
% bound. The result is compared to the upper bound and the process
% repeats if needed.
% \begin{macrocode}
-\cs_new:Npn \@@_randint_o:Nw ?
- {
- \@@_parse_function_one_two:nnw
- { randint }
- { \@@_randint_default:w \@@_randint_o:w }
- }
-\cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
-\cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
- {
- \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
+ \cs_new:Npn \@@_randint_o:Nw ?
{
- \if_meaning:w 1 #1
- \if_int_compare:w
- \use_i_delimit_by_q_stop:nw #3 \q_stop > \c_@@_prec_int
- 1 \exp_stop_f:
- \fi:
+ \@@_parse_function_one_two:nnw
+ { randint }
+ { \@@_randint_default:w \@@_randint_o:w }
+ }
+ \cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
+ \cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
+ {
+ \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
+ {
+ \if_meaning:w 1 #1
+ \if_int_compare:w
+ \use_i_delimit_by_q_stop:nw #3 \q_stop > \c_@@_prec_int
+ 1 \exp_stop_f:
+ \fi:
+ \fi:
+ }
+ { 1 \exp_stop_f: }
+ }
+ \cs_new:Npn \@@_randint_o:w #1; #2; @
+ {
+ \if_case:w
+ \@@_randint_badarg:w #1;
+ \@@_randint_badarg:w #2;
+ \fp_compare:nNnTF { #1; } > { #2; } { 1 } { 0 } \exp_stop_f:
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_randint_e:wnn
+ \@@_parse:n { #2; - #1; } { #1; } { #2; }
+ \or:
+ \@@_invalid_operation_tl_o:ff
+ { randint } { \@@_array_to_clist:n { #1; #2; } }
+ \exp:w
\fi:
+ \exp_after:wN \exp_end:
}
- { 1 \exp_stop_f: }
- }
-\cs_new:Npn \@@_randint_o:w #1; #2; @
- {
- \if_case:w
- \@@_randint_badarg:w #1;
- \@@_randint_badarg:w #2;
- \fp_compare:nNnTF { #1; } > { #2; } { 1 } { 0 } \exp_stop_f:
- \exp_after:wN \exp_after:wN \exp_after:wN \@@_randint_e:wnn
- \@@_parse:n { #2; - #1; } { #1; } { #2; }
- \or:
- \@@_invalid_operation_tl_o:ff
- { randint } { \@@_array_to_clist:n { #1; #2; } }
- \exp:w
- \fi:
- \exp_after:wN \exp_end:
- }
-\cs_new:Npn \@@_randint_e:wnn #1;
- {
- \exp_after:wN \@@_randint_e:wwNnn
- \__int_value:w \@@_rand_uniform: \exp_after:wN ;
- \exp:w \exp_end_continue_f:w
- \fp_compare:nNnTF { #1 ; } < \c_@@_rand_size_int
- { \fp_to_int:n { #1 ; + 1 } ; \@@_randint_narrow_e:nnnn }
- { \fp_to_int:n { floor(#1 ; * 1e-8 + 1) } ; \@@_randint_wide_e:nnnn }
- }
-\cs_new:Npn \@@_randint_e:wwNnn #1 ; #2 ;
- {
- \exp_after:wN \@@_randint_e:wwwNnn
- \__int_value:w \int_mod:nn {#1} {#2} ; #1 ; #2 ;
- }
-\cs_new:Npn \@@_randint_e:wwwNnn #1 ; #2 ; #3 ; #4
- {
- \int_compare:nNnTF { #2 - #1 + #3 } > \c_@@_rand_size_int
+ \cs_new:Npn \@@_randint_e:wnn #1;
{
\exp_after:wN \@@_randint_e:wwNnn
- \__int_value:w \@@_rand_uniform: ; #3 ; #4
+ \int_value:w \@@_rand_uniform: \exp_after:wN ;
+ \exp:w \exp_end_continue_f:w
+ \fp_compare:nNnTF { #1 ; } < \c_@@_rand_size_int
+ { \fp_to_int:n { #1 ; + 1 } ; \@@_randint_narrow_e:nnnn }
+ {
+ \fp_to_int:n { floor(#1 ; * 1e-8 + 1) } ;
+ \@@_randint_wide_e:nnnn
+ }
}
- { #4 {#1} {#3} }
- }
-\cs_new:Npn \@@_randint_narrow_e:nnnn #1#2#3#4
- { \@@_parse_o:n { #3 + #1 } \exp:w }
-\cs_new:Npn \@@_randint_wide_e:nnnn #1#2#3#4
- {
- \exp_after:wN \exp_after:wN
- \exp_after:wN \@@_randint_wide_e:wnnn
- \@@_parse:n { #3 + #1e8 + \@@_rand_myriads:n { xx } }
- {#2} {#3} {#4}
- }
-\cs_new:Npn \@@_randint_wide_e:wnnn #1 ; #2#3#4
- {
- \fp_compare:nNnTF { #1 ; } > {#4}
+ \cs_new:Npn \@@_randint_e:wwNnn #1 ; #2 ;
{
- \exp_after:wN \@@_randint_e:wwNnn
- \__int_value:w \@@_rand_uniform: ; #2 ;
- \@@_randint_wide_e:nnnn {#3} {#4}
+ \exp_after:wN \@@_randint_e:wwwNnn
+ \int_value:w \int_mod:nn {#1} {#2} ; #1 ; #2 ;
}
- { \@@_exp_after_o:w #1 ; \exp:w }
- }
+ \cs_new:Npn \@@_randint_e:wwwNnn #1 ; #2 ; #3 ; #4
+ {
+ \int_compare:nNnTF { #2 - #1 + #3 } > \c_@@_rand_size_int
+ {
+ \exp_after:wN \@@_randint_e:wwNnn
+ \int_value:w \@@_rand_uniform: ; #3 ; #4
+ }
+ { #4 {#1} {#3} }
+ }
+ \cs_new:Npn \@@_randint_narrow_e:nnnn #1#2#3#4
+ { \@@_parse_o:n { #3 + #1 } \exp:w }
+ \cs_new:Npn \@@_randint_wide_e:nnnn #1#2#3#4
+ {
+ \exp_after:wN \exp_after:wN
+ \exp_after:wN \@@_randint_wide_e:wnnn
+ \@@_parse:n { #3 + #1e8 + \@@_rand_myriads:n { xx } }
+ {#2} {#3} {#4}
+ }
+ \cs_new:Npn \@@_randint_wide_e:wnnn #1 ; #2#3#4
+ {
+ \fp_compare:nNnTF { #1 ; } > {#4}
+ {
+ \exp_after:wN \@@_randint_e:wwNnn
+ \int_value:w \@@_rand_uniform: ; #2 ;
+ \@@_randint_wide_e:nnnn {#3} {#4}
+ }
+ { \@@_exp_after_o:w #1 ; \exp:w }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\int_rand:nn}
+% \begin{macro}{\@@_randint:ww}
+% \begin{macro}{\@@_randint_narrow:n}
+% \begin{macro}{\@@_randint_narrow:nn}
+% \begin{macro}{\@@_randint_narrow:nnn}
+% Evaluate the argument and filter out the case where the lower
+% bound~|#1| is more than the upper bound~|#2|. Then determine
+% whether the range is narrower than \cs{c_@@_rand_size_int}; |#2-#1|
+% may overflow for very large positive~|#2| and negative~|#1|. If the
+% range is wide, use slower code from \pkg{l3fp}. If the range is
+% narrow, call \cs{@@_randint_narrow:n} \Arg{choices} where
+% \meta{choices} is the number of possible outcomes.
+%
+% One option then would be to reduce a random number modulo
+% \meta{choices}, but the low-order bits of random numbers provided by
+% the primitive have poor randomness: empirical tests indicate that
+% taking random numbers modulo~$2$ gives only two possible sequences
+% of bits depending on the seed's parity. Instead, fit in the output
+% range $[0,\cs{c_@@_rand_size_int}-1]$ of the random number generator
+% \meta{choices} equal-size intervals of maximum possible size
+% (obtained using \cs{int_div_truncate:nn}). Given a random number,
+% divide it by the size to determine which interval it falls into; if
+% it is beyond \meta{choices}, try another random number.
+% \begin{macrocode}
+ \cs_new:Npn \int_rand:nn #1#2
+ {
+ \exp_after:wN \@@_randint:ww
+ \int_value:w \int_eval:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n {#2} ;
+ }
+ \cs_new:Npn \@@_randint:ww #1; #2;
+ {
+ \int_compare:nNnTF {#1} > {#2}
+ {
+ \__kernel_msg_expandable_error:nnnn
+ { kernel } { randint-backward-range } {#1} {#2}
+ \@@_randint:ww #2; #1;
+ }
+ {
+ \int_compare:nNnTF {#1} > 0
+ { \int_compare:nNnTF { #2 - #1 } < \c_@@_rand_size_int }
+ { \int_compare:nNnTF {#2} < { #1 + \c_@@_rand_size_int } }
+ {
+ \int_eval:n
+ {
+ #1 +
+ \exp_args:Nf \@@_randint_narrow:n
+ { \int_eval:n { #2 - #1 + 1 } }
+ }
+ }
+ { \fp_to_int:n { randint(#1,#2) } }
+ }
+ }
+ \cs_new:Npn \@@_randint_narrow:n #1
+ {
+ \exp_args:Nf \@@_randint_narrow:nn
+ { \int_div_truncate:nn \c_@@_rand_size_int {#1} } {#1}
+ }
+ \cs_new:Npn \@@_randint_narrow:nn #1
+ {
+ \exp_args:Nf \@@_randint_narrow:nnn
+ {
+ \int_div_truncate:nn
+ { \pdftex_uniformdeviate:D \c_@@_rand_size_int } {#1}
+ }
+ {#1}
+ }
+ \cs_new:Npn \@@_randint_narrow:nnn #1#2#3
+ {
+ \int_compare:nNnTF {#1} < {#3}
+ {#1}
+ { \@@_randint_narrow:nn {#2} {#3} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% End the initial conditional that ensures these commands are only
-% defined in \pdfTeX{} and \LuaTeX{}.
+% defined in engines that support random numbers.
% \begin{macrocode}
}
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -166,7 +166,7 @@
% \meta{digit_1}.\meta{digit_2}$ to an integer rounds it towards zero
% (truncates it), this function expands to |0\exp_stop_f:|, and otherwise
% to |1\exp_stop_f:|. Typically used within the scope of an
-% \cs{__int_eval:w}, to add~$1$ if needed, and thereby round
+% \cs{@@_int_eval:w}, to add~$1$ if needed, and thereby round
% correctly. The result depends on the rounding mode.
%
% It is very important that \meta{final sign} be the final sign of the
@@ -272,7 +272,7 @@
% \meta{digit}.\meta{more digits}$ to an integer truncates, and to
% |1\exp_stop_f:;| otherwise. The \meta{more digits} part must be a digit,
% followed by something that does not overflow a \cs{int_use:N}
-% \cs{__int_eval:w} construction. The only relevant information about
+% \cs{@@_int_eval:w} construction. The only relevant information about
% this piece is whether it is zero or not.
% \begin{macrocode}
\cs_new:Npn \@@_round_s:NNNw #1 #2 #3 #4;
@@ -280,11 +280,11 @@
\exp_after:wN \@@_round:NNN
\exp_after:wN #1
\exp_after:wN #2
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_int_odd:w 0 \if_meaning:w 0 #3 1 \fi:
\if_meaning:w 5 #3 1 \fi:
\exp_stop_f:
- \if_int_compare:w \__int_eval:w #4 > 0 \exp_stop_f:
+ \if_int_compare:w \@@_int_eval:w #4 > 0 \exp_stop_f:
1 +
\fi:
\fi:
@@ -296,11 +296,11 @@
%
% \begin{macro}[EXP]{\@@_round_digit:Nw}
% \begin{syntax}
-% \cs{__int_value:w} \cs{@@_round_digit:Nw} \meta{digit} \meta{intexpr} |;|
+% \cs{int_value:w} \cs{@@_round_digit:Nw} \meta{digit} \meta{intexpr} |;|
% \end{syntax}
-% This function should always be called within an \cs{__int_value:w}
-% or \cs{__int_eval:w} expansion; it may add an extra
-% \cs{__int_eval:w}, which means that the integer or integer
+% This function should always be called within an \cs{int_value:w}
+% or \cs{@@_int_eval:w} expansion; it may add an extra
+% \cs{@@_int_eval:w}, which means that the integer or integer
% expression should not be ended with a synonym of \tn{relax}, but
% with a semi-colon for instance.
% \begin{macrocode}
@@ -309,8 +309,8 @@
\if_int_odd:w \if_meaning:w 0 #1 1 \else:
\if_meaning:w 5 #1 1 \else:
0 \fi: \fi: \exp_stop_f:
- \if_int_compare:w \__int_eval:w #2 > 0 \exp_stop_f:
- \__int_eval:w 1 +
+ \if_int_compare:w \@@_int_eval:w #2 > 0 \exp_stop_f:
+ \@@_int_eval:w 1 +
\fi:
\fi:
#1
@@ -355,7 +355,8 @@
}
\cs_new_eq:NN \@@_round_to_pinf_neg:NNN \@@_round_to_ninf:NNN
\cs_new_eq:NN \@@_round_to_nearest_neg:NNN \@@_round_to_nearest:NNN
-\cs_new_eq:NN \@@_round_to_nearest_ninf_neg:NNN \@@_round_to_nearest_pinf:NNN
+\cs_new_eq:NN \@@_round_to_nearest_ninf_neg:NNN
+ \@@_round_to_nearest_pinf:NNN
\cs_new:Npn \@@_round_to_nearest_zero_neg:NNN #1 #2 #3
{
\if_int_compare:w #3 < \c_@@_five_int \else:
@@ -363,7 +364,8 @@
\fi:
0 \exp_stop_f:
}
-\cs_new_eq:NN \@@_round_to_nearest_pinf_neg:NNN \@@_round_to_nearest_ninf:NNN
+\cs_new_eq:NN \@@_round_to_nearest_pinf_neg:NNN
+ \@@_round_to_nearest_ninf:NNN
\cs_new_eq:NN \@@_round_neg:NNN \@@_round_to_nearest_neg:NNN
% \end{macrocode}
% \end{macro}
@@ -390,7 +392,7 @@
\cs_new:Npn \@@_round_aux_o:Nw #1#2 @
{
\if_case:w
- \__int_eval:w \@@_array_count:n {#2} \__int_eval_end:
+ \@@_int_eval:w \@@_array_count:n {#2} \@@_int_eval_end:
\@@_round_no_arg_o:Nw #1 \exp:w
\or: \@@_round:Nwn #1 #2 {0} \exp:w
\or: \@@_round:Nww #1 #2 \exp:w
@@ -494,7 +496,7 @@
\if_meaning:w 1 #2
\exp_after:wN \@@_round_normal:NwNNnw
\exp_after:wN #1
- \__int_value:w #5
+ \int_value:w #5
\else:
\exp_after:wN \@@_exp_after_o:w
\fi:
@@ -508,14 +510,14 @@
\cs_new:Npn \@@_round_normal:NnnwNNnn #1#2#3#4; #5#6
{
\exp_after:wN \@@_round_normal:NNwNnn
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_int_compare:w #2 > 0 \exp_stop_f:
- 1 \__int_value:w #2
+ 1 \int_value:w #2
\exp_after:wN \@@_round_pack:Nw
- \__int_value:w \__int_eval:w 1#3 +
+ \int_value:w \@@_int_eval:w 1#3 +
\else:
\if_int_compare:w #3 > 0 \exp_stop_f:
- 1 \__int_value:w #3 +
+ 1 \int_value:w #3 +
\fi:
\fi:
\exp_after:wN #5
@@ -522,11 +524,11 @@
\exp_after:wN #6
\use_none:nnnnnnn #3
#1
- \__int_eval_end:
+ \@@_int_eval_end:
0000 0000 0000 0000 ; #6
}
\cs_new:Npn \@@_round_pack:Nw #1
- { \if_meaning:w 2 #1 + 1 \fi: \__int_eval_end: }
+ { \if_meaning:w 2 #1 + 1 \fi: \@@_int_eval_end: }
\cs_new:Npn \@@_round_normal:NNwNnn #1 #2
{
\if_meaning:w 0 #2
@@ -551,7 +553,7 @@
\else:
\exp_after:wN \@@_round_special_aux:Nw
\exp_after:wN #4
- \__int_value:w \__int_eval:w 1
+ \int_value:w \@@_int_eval:w 1
\if_meaning:w 1 #1 -#6 \else: +#5 \fi:
\fi:
;
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
% \maketitle
%
% \begin{documentation}
@@ -163,7 +163,7 @@
{
#1
\@@_error:nnfn { fp-invalid } {##2} { \fp_to_tl:n { ##3; } } { }
- \flag_raise:n { fp_invalid_operation }
+ \flag_raise_if_clear:n { fp_invalid_operation }
##1
}
\exp_args:Nno \use:n
@@ -172,7 +172,7 @@
#1
\@@_error:nffn { fp-invalid-ii }
{ \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1}
- \flag_raise:n { fp_invalid_operation }
+ \flag_raise_if_clear:n { fp_invalid_operation }
\exp_after:wN \c_nan_fp
}
\exp_args:Nno \use:n
@@ -180,7 +180,7 @@
{
#1
\@@_error:nffn { fp-invalid } {##1} {##2} { }
- \flag_raise:n { fp_invalid_operation }
+ \flag_raise_if_clear:n { fp_invalid_operation }
\exp_after:wN \c_nan_fp
}
}
@@ -213,7 +213,7 @@
{
#1
\@@_error:nnfn { fp-zero-div } {##2} { \fp_to_tl:n { ##3; } } { }
- \flag_raise:n { fp_division_by_zero }
+ \flag_raise_if_clear:n { fp_division_by_zero }
\exp_after:wN ##1
}
\exp_args:Nno \use:n
@@ -222,7 +222,7 @@
#1
\@@_error:nffn { fp-zero-div-ii }
{ \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2}
- \flag_raise:n { fp_division_by_zero }
+ \flag_raise_if_clear:n { fp_division_by_zero }
\exp_after:wN ##1
}
}
@@ -285,7 +285,7 @@
{ \fp_to_tl:n { \s_@@ \@@_chk:w ##1##2##3; } }
{ \token_if_eq_meaning:NNF 0 ##2 { - } #4 }
{#2}
- \flag_raise:n { fp_#2 }
+ \flag_raise_if_clear:n { fp_#2 }
#3 ##2
}
}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -38,7 +38,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -363,7 +363,7 @@
\exp_after:wN #2
\exp_after:wN #3
\exp_after:wN #4
- \__int_value:w \__int_eval:w #5
+ \int_value:w \@@_int_eval:w #5
\exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN
\if_int_compare:w #7 > #1 0 1 \exp_stop_f:
#1 \@@_trig_large:ww \@@_trigd_large:ww
@@ -455,8 +455,8 @@
\cs_new:Npn \@@_trigd_large_auxi:nnnnwNNNN #1#2#3#4#5; #6#7#8#9
{
\exp_after:wN \@@_trigd_large_auxii:wNw
- \__int_value:w \__int_eval:w #1 + #2
- - (#1 + #2 - 4) / 9 * 9 \__int_eval_end:
+ \int_value:w \@@_int_eval:w #1 + #2
+ - (#1 + #2 - 4) / 9 * 9 \@@_int_eval_end:
#3;
#4; #5{#6#7#8#9};
}
@@ -464,8 +464,8 @@
{
+ (#1#2 - 4) / 9 * 2
\exp_after:wN \@@_trigd_large_auxiii:www
- \__int_value:w \__int_eval:w #1#2
- - (#1#2 - 4) / 9 * 9 \__int_eval_end: #3 ;
+ \int_value:w \@@_int_eval:w #1#2
+ - (#1#2 - 4) / 9 * 9 \@@_int_eval_end: #3 ;
}
\cs_new:Npn \@@_trigd_large_auxiii:www #1; #2; #3!
{
@@ -710,9 +710,9 @@
\cs_new:Npn \@@_trig_large:ww #1, #2#3#4#5#6;
{
\exp_after:wN \@@_trig_large_auxi:wwwwww
- \__int_value:w \__int_eval:w (#1 - 32) / 64 \exp_after:wN ,
- \__int_value:w \__int_eval:w (#1 - 4) / 8 \exp_after:wN ,
- \__int_value:w #1 \@@_trig_inverse_two_pi: ;
+ \int_value:w \@@_int_eval:w (#1 - 32) / 64 \exp_after:wN ,
+ \int_value:w \@@_int_eval:w (#1 - 4) / 8 \exp_after:wN ,
+ \int_value:w #1 \@@_trig_inverse_two_pi: ;
{#2}{#3}{#4}{#5} ;
}
\cs_new:Npn \@@_trig_large_auxi:wwwwww #1, #2, #3, #4!
@@ -761,7 +761,7 @@
{
\exp_after:wN \@@_use_i_until_s:nw
\exp_after:wN \@@_trig_large_auxvii:w
- \__int_value:w \__int_eval:w \c_@@_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_leading_shift_int
\prg_replicate:nn { 13 }
{ \@@_trig_large_auxvi:wnnnnnnnn }
+ \c_@@_trailing_shift_int - \c_@@_middle_shift_int
@@ -771,7 +771,7 @@
\cs_new:Npn \@@_trig_large_auxvi:wnnnnnnnn #1; #2#3#4#5#6#7#8#9
{
\exp_after:wN \@@_trig_large_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
+ #2*#9 + #3*#8 + #4*#7 + #5*#6
#1; {#2}{#3}{#4}{#5} {#7}{#8}{#9}
}
@@ -809,7 +809,7 @@
\cs_new:Npn \@@_trig_large_auxvii:w #1#2#3
{
\exp_after:wN \@@_trig_large_auxviii:ww
- \__int_value:w \__int_eval:w (#1#2#3 - 62) / 125 ;
+ \int_value:w \@@_int_eval:w (#1#2#3 - 62) / 125 ;
#1#2#3
}
\cs_new:Npn \@@_trig_large_auxviii:ww #1;
@@ -827,7 +827,7 @@
{
\exp_after:wN \@@_use_i_until_s:nw
\exp_after:wN \@@_trig_large_auxxi:w
- \__int_value:w \__int_eval:w \c_@@_leading_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_leading_shift_int
\prg_replicate:nn { 13 }
{ \@@_trig_large_auxx:wNNNNN }
+ \c_@@_trailing_shift_int - \c_@@_middle_shift_int
@@ -836,7 +836,7 @@
\cs_new:Npn \@@_trig_large_auxx:wNNNNN #1; #2 #3#4#5#6
{
\exp_after:wN \@@_trig_large_pack:NNNNNw
- \__int_value:w \__int_eval:w \c_@@_middle_shift_int
+ \int_value:w \@@_int_eval:w \c_@@_middle_shift_int
#2 8 * #3#4#5#6
#1; #2
}
@@ -843,7 +843,7 @@
\cs_new:Npn \@@_trig_large_auxxi:w #1;
{
\exp_after:wN \@@_ep_mul_raw:wwwwN
- \__int_value:w \__int_eval:w 0 \@@_ep_to_ep_loop:N #1 ; ; !
+ \int_value:w \@@_int_eval:w 0 \@@_ep_to_ep_loop:N #1 ; ; !
0,{7853}{9816}{3397}{4483}{0961}{5661};
\@@_trig_small:ww
}
@@ -890,8 +890,8 @@
{
\exp_after:wN \@@_sin_series_aux_o:NNnwww
\exp_after:wN #1
- \__int_value:w
- \if_int_odd:w \__int_eval:w (#3 + 2) / 4 \__int_eval_end:
+ \int_value:w
+ \if_int_odd:w \@@_int_eval:w (#3 + 2) / 4 \@@_int_eval_end:
#2
\else:
\if_meaning:w #2 0 2 \else: 0 \fi:
@@ -901,7 +901,7 @@
}
\cs_new:Npn \@@_sin_series_aux_o:NNnwww #1#2#3 #4; #5,#6;
{
- \if_int_odd:w \__int_eval:w #3 / 2 \__int_eval_end:
+ \if_int_odd:w \@@_int_eval:w #3 / 2 \@@_int_eval_end:
\exp_after:wN \use_i:nn
\else:
\exp_after:wN \use_ii:nn
@@ -934,7 +934,7 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #2
- \__int_value:w \__int_eval:w #1
+ \int_value:w \@@_int_eval:w #1
}
#2
}
@@ -953,7 +953,7 @@
% $\tan\lvert x\rvert\geq 0$ coincide with those for which $\lfloor
% (|#3| + 1) / 2\rfloor$ is odd. We also have to take into account
% the original sign of $x$ to get the sign of the final result; it is
-% straightforward to check that the first \cs{__int_value:w} expansion
+% straightforward to check that the first \cs{int_value:w} expansion
% produces $0$ for a positive final result, and $2$ otherwise. A
% similar story holds for $\cot(x)$.
%
@@ -978,8 +978,8 @@
\@@_fixed_mul:wwn #4; #4;
{
\exp_after:wN \@@_tan_series_aux_o:Nnwww
- \__int_value:w
- \if_int_odd:w \__int_eval:w #3 / 2 \__int_eval_end:
+ \int_value:w
+ \if_int_odd:w \@@_int_eval:w #3 / 2 \@@_int_eval_end:
\exp_after:wN \reverse_if:N
\fi:
\if_meaning:w #1#2 2 \else: 0 \fi:
@@ -1004,7 +1004,7 @@
\@@_fixed_mul_sub_back:wwwn#3;{10000}{0000}{0000}{0000}{0000}{0000};
{
\reverse_if:N \if_int_odd:w
- \__int_eval:w (#2 - 1) / 2 \__int_eval_end:
+ \@@_int_eval:w (#2 - 1) / 2 \@@_int_eval_end:
\exp_after:wN \@@_reverse_args:Nww
\fi:
\@@_ep_div:wwwwn 0,
@@ -1013,7 +1013,7 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #1
- \__int_value:w \__int_eval:w \@@_ep_to_float_o:wwN
+ \int_value:w \@@_int_eval:w \@@_ep_to_float_o:wwN
}
#1
}
@@ -1170,7 +1170,7 @@
{
\exp_after:wN \@@_atan_combine_o:NwwwwwN
\exp_after:wN #2
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_meaning:w 2 #5 7 - \fi: #3 \exp_after:wN ;
\c_@@_one_fixed_tl
{0000}{0000}{0000}{0000}{0000}{0000};
@@ -1217,9 +1217,9 @@
{
\exp_after:wN \@@_atan_combine_o:NwwwwwN
\exp_after:wN #1
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_meaning:w 2 #4
- 7 - \__int_eval:w
+ 7 - \@@_int_eval:w
\fi:
\if_int_compare:w
\@@_ep_compare:wwww #2,#3; #5,#6; > 0 \exp_stop_f:
@@ -1249,8 +1249,9 @@
\cs_new:Npn \@@_atan_div:wnwwnw #1,#2#3; #4,#5#6;
{
\if_int_compare:w
- \__int_eval:w 41421 * #5 < #2 000
- \if_case:w \__int_eval:w #4 - #1 \__int_eval_end: 00 \or: 0 \fi:
+ \@@_int_eval:w 41421 * #5 < #2 000
+ \if_case:w \@@_int_eval:w #4 - #1 \@@_int_eval_end:
+ 00 \or: 0 \fi:
\exp_stop_f:
\exp_after:wN \@@_atan_near:wwwn
\fi:
@@ -1315,7 +1316,7 @@
\@@_rrot:www \@@_fixed_mul_sub_back:wwwn #2; #3;
{
\exp_after:wN \@@_atan_Taylor_loop:www
- \__int_value:w \__int_eval:w #1 - 2 ;
+ \int_value:w \@@_int_eval:w #1 - 2 ;
}
#3;
}
@@ -1354,7 +1355,7 @@
{
\exp_after:wN \@@_sanitize:Nw
\exp_after:wN #1
- \__int_value:w \__int_eval:w
+ \int_value:w \@@_int_eval:w
\if_meaning:w 0 #2
\exp_after:wN \use_i:nn
\else:
@@ -1365,7 +1366,7 @@
\@@_fixed_mul:wwn #3; #4;
{
\exp_after:wN \@@_atan_combine_aux:ww
- \__int_value:w \__int_eval:w #2 / 2 ; #2;
+ \int_value:w \@@_int_eval:w #2 / 2 ; #2;
}
}
{ #7 \@@_fixed_to_float_o:wN \@@_fixed_to_float_rad_o:wN }
@@ -1463,7 +1464,7 @@
\if_int_compare:w #5 < 1 \exp_stop_f:
\exp_after:wN \@@_use_none_until_s:w
\fi:
- \if_int_compare:w \__int_eval:w #5 + #6#7 + #8#9 = 1000 0001 ~
+ \if_int_compare:w \@@_int_eval:w #5 + #6#7 + #8#9 = 1000 0001 ~
\exp_after:wN \@@_use_none_until_s:w
\fi:
\@@_use_i:ww
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -35,7 +35,7 @@
%
%
% \title{^^A
-% The \textsf{l3fp} package: floating points^^A
+% The \textsf{l3fp} package: Floating points^^A
% }
%
% \author{^^A
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -102,7 +102,7 @@
% towards $+\infty$ if $t>0$ and towards $-\infty$ if $t<0$. And
% \emph{(not yet)} modulo, and \enquote{quantize}.
% \item Random numbers: $\mathop{rand}()$, $\mathop{randint}(m,n)$ in
-% \pdfTeX{} and \LuaTeX{} engines.
+% all engines except \XeTeX{}.
% \item Constants: \texttt{pi}, \texttt{deg} (one degree in radians).
% \item Dimensions, automatically expressed in points, \emph{e.g.},
% \texttt{pc} is~$12$.
@@ -129,9 +129,12 @@
% \LaTeX{} can now compute: $ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3}
% = \ExplSyntaxOn \fp_to_decimal:n {sin(3.5)/2 + 2e-3} $.
% \end{verbatim}
-% But in all fairness, this module is mostly meant as an underlying tool
-% for higher-level commands. For example, one could provide a function
-% to typeset nicely the result of floating point computations.
+% The operation \texttt{round} can be used to limit the result's
+% precision. Adding $+0$ avoids the possibly undesirable output |-0|,
+% replacing it by |+0|. However, the \pkg{l3fp} module is mostly meant
+% as an underlying tool for higher-level commands. For example, one
+% could provide a function to typeset nicely the result of floating
+% point computations.
% \begin{verbatim}
% \documentclass{article}
% \usepackage{xparse, siunitx}
@@ -143,6 +146,8 @@
% \calcnum { 2 pi * sin ( 2.3 ^ 5 ) }
% \end{document}
% \end{verbatim}
+% See the documentation of \pkg{siunitx} for various options of
+% \cs{num}.
%
% \section{Creating and initialising floating point variables}
%
@@ -398,7 +403,7 @@
% This is experimental.
% \end{function}
%
-% \begin{function}[EXP, pTF, updated = 2012-12-14,
+% \begin{function}[EXP, pTF, updated = 2013-12-14,
% tested = m3fp-logic001]{\fp_compare:n}
% \begin{syntax}
% \cs{fp_compare_p:n} \\
@@ -500,7 +505,7 @@
% \texttt{false}.
% \end{function}
%
-% \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003]
+% \begin{function}[rEXP, added = 2012-08-16, updated = 2013-12-14, tested = m3fp-logic003]
% {\fp_do_until:nn}
% \begin{syntax}
% \cs{fp_do_until:nn} \{ \meta{fpexpr_1} \meta{relation} \meta{fpexpr_2} \} \Arg{code}
@@ -513,7 +518,7 @@
% \meta{relation} is \texttt{true}.
% \end{function}
%
-% \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003]
+% \begin{function}[rEXP, added = 2012-08-16, updated = 2013-12-14, tested = m3fp-logic003]
% {\fp_do_while:nn}
% \begin{syntax}
% \cs{fp_do_while:nn} \{ \meta{fpexpr_1} \meta{relation} \meta{fpexpr_2} \} \Arg{code}
@@ -526,7 +531,7 @@
% is \texttt{false}.
% \end{function}
%
-% \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003]
+% \begin{function}[rEXP, added = 2012-08-16, updated = 2013-12-14, tested = m3fp-logic003]
% {\fp_until_do:nn}
% \begin{syntax}
% \cs{fp_until_do:nn} \{ \meta{fpexpr_1} \meta{relation} \meta{fpexpr_2} \} \Arg{code}
@@ -539,7 +544,7 @@
% \texttt{true}.
% \end{function}
%
-% \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003]
+% \begin{function}[rEXP, added = 2012-08-16, updated = 2013-12-14, tested = m3fp-logic003]
% {\fp_while_do:nn}
% \begin{syntax}
% \cs{fp_while_do:nn} \{ \meta{fpexpr_1} \meta{relation} \meta{fpexpr_2} \} \Arg{code}
@@ -637,7 +642,7 @@
% The value of the base of the natural logarithm, $\mathrm{e} = \exp(1)$.
% \end{variable}
%
-% \begin{variable}[updated = 2012-05-08, updated = 2013-11-17]{\c_pi_fp}
+% \begin{variable}[updated = 2013-11-17]{\c_pi_fp}
% The value of~$\pi$. This can be input directly in a floating point
% expression as~\texttt{pi}.
% \end{variable}
@@ -823,6 +828,11 @@
% preceded by any sign, but that sign is ignored.
% \item Any unrecognizable string triggers an error, and produces a
% \nan{}.
+% \item Note that commands such as \tn{infty}, \tn{pi}, or \tn{sin}
+% \emph{do not} work in floating point expressions. They may
+% silently be interpreted as completely unexpected numbers, because
+% integer constants (allowed in expressions) are commonly stored as
+% mathematical characters.
% \end{itemize}
%
% \subsection{Precedence of operators}
@@ -1253,27 +1263,21 @@
% \cs{fp_eval:n} \{ |rand()| \}
% \end{syntax}
% Produces a pseudo-random floating-point number (multiple of
-% $10^{-16}$) between $0$~included and $1$~excluded. Available in
-% \pdfTeX{} and \LuaTeX{} engines only.
+% $10^{-16}$) between $0$~included and $1$~excluded. This is not yet
+% available in \XeTeX{}. The random seed can be queried using
+% \cs{sys_rand_seed:} and set using \cs{sys_gset_rand_seed:n}.
% \begin{texnote}
% This is based on pseudo-random numbers provided by the engine's
-% primitive \tn{pdfuniformdeviate} in \pdfTeX{} and
-% \tn{uniformdeviate} in \LuaTeX{}. The underlying code in
-% \pdfTeX{} and \LuaTeX{} is based on Metapost, which follows an
-% additive scheme recommended in Section 3.6 of \enquote{The Art of
-% Computer Programming, Volume~2}.
+% primitive \tn{pdfuniformdeviate} in \pdfTeX{}, \pTeX{}, \upTeX{}
+% and \tn{uniformdeviate} in \LuaTeX{}. The underlying code is
+% based on Metapost, which follows an additive scheme recommended in
+% Section 3.6 of \enquote{The Art of Computer Programming,
+% Volume~2}.
%
% While we are more careful than \tn{uniformdeviate} to preserve
% uniformity of the underlying stream of $28$-bit pseudo-random
% integers, these pseudo-random numbers should of course not be
% relied upon for serious numerical computations nor cryptography.
-%
-% The random seed can be queried using \tn{pdfrandomseed} and set
-% using \tn{pdfsetrandomseed} (in \LuaTeX{} \tn{randomseed} and
-% \tn{setrandomseed}). While a $32$-bit (signed) integer can be
-% given as a seed, only the absolute value is used and any number
-% beyond $2^{28}$ is divided by an appropriate power of~$2$. We
-% recommend using an integer in $[0,2^{28}-1]$.
% \end{texnote}
% \end{function}
%
@@ -1366,9 +1370,7 @@
% \item Function to count items in a tuple (and to determine if something is a tuple).
% \item Decide what exponent range to consider.
% \item Support signalling \texttt{nan}.
-% \item Modulo and remainder, and rounding functions |quantize|,
-% |quantize0|, |quantize+|, |quantize-|, |quantize=|, |round=|.
-% Should the modulo also be provided as (catcode 12) |%|?
+% \item Modulo and remainder, and rounding function |quantize| (and its friends analogous to |trunc|, |ceil|, |floor|).
% \item \cs{fp_format:nn} \Arg{fpexpr} \Arg{format}, but what should
% \meta{format} be? More general pretty printing?
% \item Add |and|, |or|, |xor|? Perhaps under the names \texttt{all},
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -92,6 +92,17 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[EXP, added = 2018-03-30]{\int_eval:w}
+% \begin{syntax}
+% \cs{int_eval:w} \Arg{integer expression}
+% \end{syntax}
+% Evaluates the \meta{integer expression} as described for
+% \cs{int_eval:n}. The end of the expression is the first token
+% encountered that cannot form part of such an expression.
+% If that token is \cs{scan_stop:} it is removed, otherwise not.
+% Spaces do \emph{not} terminate the expression.
+% \end{function}
+%
% \begin{function}[EXP, updated = 2012-09-26]{\int_abs:n}
% \begin{syntax}
% \cs{int_abs:n} \Arg{integer expression}
@@ -481,9 +492,11 @@
%
% \section{Integer step functions}
%
-% \begin{function}[added = 2012-06-04, updated = 2014-05-30, rEXP]
-% {\int_step_function:nnnN}
+% \begin{function}[added = 2012-06-04, updated = 2018-04-22, rEXP]
+% {\int_step_function:nN, \int_step_function:nnN, \int_step_function:nnnN}
% \begin{syntax}
+% \cs{int_step_function:nN} \Arg{final value} \meta{function}
+% \cs{int_step_function:nnN} \Arg{initial value} \Arg{final value} \meta{function}
% \cs{int_step_function:nnnN} \Arg{initial value} \Arg{step} \Arg{final value} \meta{function}
% \end{syntax}
% This function first evaluates the \meta{initial value}, \meta{step}
@@ -508,11 +521,18 @@
% [I saw 4] \quad
% [I saw 5] \quad
% \end{quote}
+%
+% The functions \cs{int_step_function:nN} and \cs{int_step_function:nnN}
+% both use a fixed \meta{step} of $1$, and in the case of
+% \cs{int_step_function:nN} the \meta{initial value} is also fixed as
+% $1$. These functions are provided as simple short-cuts for code clarity.
% \end{function}
%
-% \begin{function}[added = 2012-06-04, updated = 2014-05-30]
-% {\int_step_inline:nnnn}
+% \begin{function}[added = 2012-06-04, updated = 2018-04-22]
+% {\int_step_inline:nn, \int_step_inline:nnn, \int_step_inline:nnnn}
% \begin{syntax}
+% \cs{int_step_inline:nn} \Arg{final value} \Arg{code}
+% \cs{int_step_inline:nnn} \Arg{initial value} \Arg{final value} \Arg{code}
% \cs{int_step_inline:nnnn} \Arg{initial value} \Arg{step} \Arg{final value} \Arg{code}
% \end{syntax}
% This function first evaluates the \meta{initial value}, \meta{step}
@@ -522,13 +542,19 @@
% \meta{value}), the \meta{code} is inserted into the input stream
% with |#1| replaced by the current \meta{value}. Thus the
% \meta{code} should define a function of one argument~(|#1|).
+%
+% The functions \cs{int_step_inline:nn} and \cs{int_step_inline:nnn}
+% both use a fixed \meta{step} of $1$, and in the case of
+% \cs{int_step_inline:nn} the \meta{initial value} is also fixed as
+% $1$. These functions are provided as simple short-cuts for code clarity.
% \end{function}
%
-% \begin{function}[added = 2012-06-04, updated = 2014-05-30]
-% {\int_step_variable:nnnNn}
+% \begin{function}[added = 2012-06-04, updated = 2018-04-22]
+% {\int_step_variable:nnn, \int_step_variable:nnnn, \int_step_variable:nnnnn}
% \begin{syntax}
-% \cs{int_step_variable:nnnNn} \\
-% ~~\Arg{initial value} \Arg{step} \Arg{final value} \meta{tl~var} \Arg{code}
+% \cs{int_step_variable:nNn} \Arg{final value} \meta{tl~var} \Arg{code}
+% \cs{int_step_variable:nnNn} \Arg{initial value} \Arg{final value} \meta{tl~var} \Arg{code}
+% \cs{int_step_variable:nnnNn} \Arg{initial value} \Arg{step} \Arg{final value} \meta{tl~var} \Arg{code}
% \end{syntax}
% This function first evaluates the \meta{initial value}, \meta{step}
% and \meta{final value}, all of which should be integer expressions.
@@ -537,6 +563,11 @@
% \meta{value}), the \meta{code} is inserted into the input stream,
% with the \meta{tl~var} defined as the current \meta{value}. Thus
% the \meta{code} should make use of the \meta{tl~var}.
+%
+% The functions \cs{int_step_variable:nNn} and \cs{int_step_variable:nnNn}
+% both use a fixed \meta{step} of $1$, and in the case of
+% \cs{int_step_variable:nNn} the \meta{initial value} is also fixed as
+% $1$. These functions are provided as simple short-cuts for code clarity.
% \end{function}
%
% \section{Formatting integers}
@@ -753,6 +784,17 @@
% \cs{int_to_Base:nn}.
% \end{function}
%
+% \section{Random integers}
+%
+% \begin{function}[EXP, added = 2016-12-06, updated = 2018-04-27]{\int_rand:nn}
+% \begin{syntax}
+% \cs{int_rand:nn} \Arg{intexpr_1} \Arg{intexpr_2}
+% \end{syntax}
+% Evaluates the two \meta{integer expressions} and produces a
+% pseudo-random number between the two (with bounds included). This
+% is not yet available in \XeTeX{}.
+% \end{function}
+%
% \section{Viewing integers}
%
% \begin{function}{\int_show:N, \int_show:c}
@@ -846,6 +888,38 @@
% code and so should only be used for short-term storage.
% \end{variable}
%
+% \subsection{Direct number expansion}
+%
+% \begin{function}[EXP, added = 2018-03-27]{\int_value:w}
+% \begin{syntax}
+% \cs{int_value:w} \meta{integer}
+% \cs{int_value:w} \meta{integer denotation} \meta{optional space}
+% \end{syntax}
+% Expands the following tokens until an \meta{integer} is formed, and
+% leaves a normalized form (no leading sign except for negative
+% numbers, no leading digit~|0| except for zero) in the input stream
+% as category code $12$ (other) characters. The \meta{integer} can
+% consist of any number of signs (with intervening spaces) followed
+% by
+% \begin{itemize}
+% \item an integer variable (in fact, any \TeX{} register except
+% \tn{toks}) or
+% \item explicit digits (or by |'|\meta{octal digits} or |"|\meta{hexadecimal digits} or |`|\meta{character}).
+% \end{itemize}
+% In this last case expansion stops once a non-digit is found; if that is a
+% space it is removed as in \texttt{f}-expansion, and so \cs{exp_stop_f:}
+% may be employed as an end marker. Note that protected functions
+% \emph{are} expanded by this process.
+%
+% This function requires exactly one expansion to produce a value, and so
+% is suitable for use in cases where a number is required \enquote{directly}.
+% In general, \cs{int_eval:n} is the preferred approach to generating
+% numbers.
+% \begin{texnote}
+% This is the \TeX{} primitive \tn{number}.
+% \end{texnote}
+% \end{function}
+%
% \section{Primitive conditionals}
%
% \begin{function}[EXP]{\if_int_compare:w}
@@ -898,86 +972,6 @@
% \end{texnote}
% \end{function}
%
-% \section{Internal functions}
-%
-% \begin{function}[EXP]{\__int_value:w}
-% \begin{syntax}
-% \cs{__int_value:w} \meta{integer}
-% \cs{__int_value:w} \meta{integer denotation} \meta{optional space}
-% \end{syntax}
-% Expands the following tokens until an \meta{integer} is formed, and
-% leaves a normalized form (no leading sign except for negative
-% numbers, no leading digit~|0| except for zero) in the input stream
-% as category code $12$ (other) characters. The \meta{integer} can
-% consist of any number of signs (with intervening spaces) followed
-% by
-% \begin{itemize}
-% \item an integer variable (in fact, any \TeX{} register except
-% \tn{toks}) or
-% \item \cs{__int_eval:w} \meta{intexpr} \cs{__int_eval_end:} (or
-% another \eTeX{} expression) or
-% \item explicit digits (or by |'|\meta{octal digits} or |"|\meta{hexadecimal digits} or |`|\meta{character}
-% \end{itemize}
-% In this last case expansion stops once a non-digit is found; if that is a space it is removed as in \texttt{f}-expansion.
-% Note that protected functions \emph{are} expanded by this process
-% \begin{texnote}
-% This is the \TeX{} primitive \tn{number}.
-% \end{texnote}
-% \end{function}
-%
-% \begin{function}[EXP]{\__int_to_roman:w}
-% \begin{syntax}
-% \cs{__int_to_roman:w} \meta{integer}
-% \cs{__int_to_roman:w} \meta{integer denotation} \meta{optional space}
-% \end{syntax}
-% Converts an \meta{integer} to lower case Roman representation. The
-% \meta{integer} is found as in \cs{__int_value:w} by expanding what
-% follows exhaustively. One (optional) space is lost if the
-% \meta{integer} is given by explicit digits. Note that this function
-% produces a string of letters with category code~$12$. Negative
-% \meta{integer} values result in no output, although the function
-% does not terminate expansion until a suitable endpoint is found in
-% the same way as for positive numbers.
-% \begin{texnote}
-% This is the \TeX{} primitive \tn{romannumeral} renamed.
-% \end{texnote}
-% \end{function}
-%
-% \begin{function}[EXP]{\__int_eval:w, \__int_eval_end:}
-% \begin{syntax}
-% \cs{__int_eval:w} \meta{intexpr} \cs{__int_eval_end:}
-% \end{syntax}
-% Evaluates \meta{integer expression} as described for \cs{int_eval:n}.
-% The evaluation stops when an unexpandable token which is not a valid
-% part of an integer 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 \tn{numexpr}.
-% \end{texnote}
-% \end{function}
-%
-% \begin{function}[EXP]{\__int_eval:n}
-% \begin{syntax}
-% \cs{__int_eval:n} \Arg{intexpr}
-% \end{syntax}
-% By default this expands to \cs{__int_eval:w} \meta{intexpr}
-% \cs{__int_eval_end:} but when debugging is enabled this expands to a
-% more complicated construction that evaluates \meta{intexpr} with
-% parentheses and within a brace group to detect early termination.
-% \end{function}
-%
-% \begin{function}{\__prg_compare_error:, \__prg_compare_error:Nw}
-% \begin{syntax}
-% \cs{__prg_compare_error:}
-% \cs{__prg_compare_error:Nw} \meta{token}
-% \end{syntax}
-% These are used within \cs{int_compare:nTF}, \cs{dim_compare:nTF}
-% and so on to recover correctly if the \texttt{n}-type argument does not
-% contain a properly-formed relation.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -1008,7 +1002,7 @@
% Done in \pkg{l3basics}.
% \end{macro}
%
-% \begin{macro}{\@@_value:w}
+% \begin{macro}{\int_value:w}
% \begin{macro}{\@@_eval:w}
% \begin{macro}{\@@_eval_end:}
% \begin{macro}{\if_int_odd:w}
@@ -1016,7 +1010,7 @@
% Here are the remaining primitives for number comparisons and
% expressions.
% \begin{macrocode}
-\cs_new_eq:NN \@@_value:w \tex_number:D
+\cs_new_eq:NN \int_value:w \tex_number:D
\cs_new_eq:NN \@@_eval:w \etex_numexpr:D
\cs_new_eq:NN \@@_eval_end: \tex_relax:D
\cs_new_eq:NN \if_int_odd:w \tex_ifodd:D
@@ -1031,6 +1025,7 @@
% \subsection{Integer expressions}
%
% \begin{macro}{\int_eval:n}
+% \begin{macro}{\int_eval:w}
% Wrapper for \cs{@@_eval:w}: can be used in an integer expression
% or directly in the input stream.
% When debugging, use parentheses to catch early termination.
@@ -1038,19 +1033,10 @@
\__kernel_patch_args:nNNpn
{ { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_eval:n } }
\cs_new:Npn \int_eval:n #1
- { \@@_value:w \@@_eval:w #1 \@@_eval_end: }
+ { \int_value:w \@@_eval:w #1 \@@_eval_end: }
+\cs_new:Npn \int_eval:w { \int_value:w \@@_eval:w }
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\@@_eval:n}
-% Only differ from \cs{int_eval:n} by the absence of \cs{@@_value:w},
-% so as to produce an internal integer rather than expanding into
-% characters. This is for use in other modules.
-% \begin{macrocode}
-\__kernel_patch_args:nNNpn
- { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } }
-\cs_new:Npn \@@_eval:n #1 { \@@_eval:w #1 \@@_eval_end: }
-% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\int_abs:n}
@@ -1069,8 +1055,8 @@
{ { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_abs:n } }
\cs_new:Npn \int_abs:n #1
{
- \@@_value:w \exp_after:wN \@@_abs:N
- \@@_value:w \@@_eval:w #1 \@@_eval_end:
+ \int_value:w \exp_after:wN \@@_abs:N
+ \int_value:w \@@_eval:w #1 \@@_eval_end:
\exp_stop_f:
}
\cs_new:Npn \@@_abs:N #1
@@ -1082,9 +1068,9 @@
}
\cs_set:Npn \int_max:nn #1#2
{
- \@@_value:w \exp_after:wN \@@_maxmin:wwN
- \@@_value:w \@@_eval:w #1 \exp_after:wN ;
- \@@_value:w \@@_eval:w #2 ;
+ \int_value:w \exp_after:wN \@@_maxmin:wwN
+ \int_value:w \@@_eval:w #1 \exp_after:wN ;
+ \int_value:w \@@_eval:w #2 ;
>
\exp_stop_f:
}
@@ -1095,9 +1081,9 @@
}
\cs_set:Npn \int_min:nn #1#2
{
- \@@_value:w \exp_after:wN \@@_maxmin:wwN
- \@@_value:w \@@_eval:w #1 \exp_after:wN ;
- \@@_value:w \@@_eval:w #2 ;
+ \int_value:w \exp_after:wN \@@_maxmin:wwN
+ \int_value:w \@@_eval:w #1 \exp_after:wN ;
+ \int_value:w \@@_eval:w #2 ;
<
\exp_stop_f:
}
@@ -1144,10 +1130,10 @@
}
\cs_new:Npn \int_div_truncate:nn #1#2
{
- \@@_value:w \@@_eval:w
+ \int_value:w \@@_eval:w
\exp_after:wN \@@_div_truncate:NwNw
- \@@_value:w \@@_eval:w #1 \exp_after:wN ;
- \@@_value:w \@@_eval:w #2 ;
+ \int_value:w \@@_eval:w #1 \exp_after:wN ;
+ \int_value:w \@@_eval:w #2 ;
\@@_eval_end:
}
\cs_new:Npn \@@_div_truncate:NwNw #1#2; #3#4;
@@ -1167,7 +1153,7 @@
% For the sake of completeness:
% \begin{macrocode}
\cs_new:Npn \int_div_round:nn #1#2
- { \@@_value:w \@@_eval:w ( #1 ) / ( #2 ) \@@_eval_end: }
+ { \int_value:w \@@_eval:w ( #1 ) / ( #2 ) \@@_eval_end: }
% \end{macrocode}
% Finally there's the modulus operation.
% \begin{macrocode}
@@ -1178,9 +1164,9 @@
}
\cs_new:Npn \int_mod:nn #1#2
{
- \@@_value:w \@@_eval:w \exp_after:wN \@@_mod:ww
- \@@_value:w \@@_eval:w #1 \exp_after:wN ;
- \@@_value:w \@@_eval:w #2 ;
+ \int_value:w \@@_eval:w \exp_after:wN \@@_mod:ww
+ \int_value:w \@@_eval:w #1 \exp_after:wN ;
+ \int_value:w \@@_eval:w #2 ;
\@@_eval_end:
}
\cs_new:Npn \@@_mod:ww #1; #2;
@@ -1205,7 +1191,7 @@
%<*package>
\cs_new_protected:Npn \int_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs:w newcount \cs_end: #1
}
%</package>
@@ -1215,7 +1201,7 @@
%
% \begin{macro}{\int_const:Nn, \int_const:cn}
% \begin{macro}{\@@_constdef:Nw}
-% \begin{variable}{\c__max_constdef_int}
+% \begin{variable}{\c_@@_max_constdef_int}
% \UnitTested
% As stated, most constants can be defined as \tn{chardef} or
% \tn{mathchardef} but that's engine dependent. As a result, there is some
@@ -1236,13 +1222,13 @@
\tex_global:D
}
{
- \int_compare:nNnTF {#2} > \c__max_constdef_int
+ \int_compare:nNnTF {#2} > \c_@@_max_constdef_int
{
\int_new:N #1
\tex_global:D
}
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\tex_global:D \@@_constdef:Nw
}
}
@@ -1257,10 +1243,10 @@
\cs_if_exist:NTF \uptex_disablecjktoken:D
{ \cs_new_eq:NN \@@_constdef:Nw \uptex_kchardef:D }
{ \cs_new_eq:NN \@@_constdef:Nw \tex_chardef:D }
- \@@_constdef:Nw \c__max_constdef_int 1114111 ~
+ \@@_constdef:Nw \c_@@_max_constdef_int 1114111 ~
\else:
\cs_new_eq:NN \@@_constdef:Nw \tex_mathchardef:D
- \tex_mathchardef:D \c__max_constdef_int 32767 ~
+ \tex_mathchardef:D \c_@@_max_constdef_int 32767 ~
\fi:
% \end{macrocode}
% \end{variable}
@@ -1449,27 +1435,27 @@
%
% \subsection{Integer expression conditionals}
%
-% \begin{macro}[EXP]{\__prg_compare_error:, \__prg_compare_error:Nw}
+% \begin{macro}[EXP]{\@@_compare_error:, \@@_compare_error:Nw}
% Those functions are used for comparison tests which use a simple
% syntax where only one set of braces is required and additional
% operators such as |!=| and |>=| are supported. The tests first
% evaluate their left-hand side, with a trailing
-% \cs{__prg_compare_error:}. This marker is normally not expanded,
+% \cs{@@_compare_error:}. This marker is normally not expanded,
% but if the relation symbol is missing from the test's argument, then
% the marker inserts |=| (and itself) after triggering the relevant
% \TeX{} error. If the first token which appears after evaluating and
% removing the left-hand side is not a known relation symbol, then a
-% judiciously placed \cs{__prg_compare_error:Nw} gets expanded,
+% judiciously placed \cs{@@_compare_error:Nw} gets expanded,
% cleaning up the end of the test and telling the user what the
% problem was.
% \begin{macrocode}
-\cs_new_protected:Npn \__prg_compare_error:
+\cs_new_protected:Npn \@@_compare_error:
{
\if_int_compare:w \c_zero \c_zero \fi:
=
- \__prg_compare_error:
+ \@@_compare_error:
}
-\cs_new:Npn \__prg_compare_error:Nw
+\cs_new:Npn \@@_compare_error:Nw
#1#2 \q_stop
{
{ }
@@ -1513,7 +1499,7 @@
% of the \TeX{} conditional is taken (because of \cs{reverse_if:N}),
% immediately returning \texttt{false} as the result of the test.
% There is no \TeX{} conditional waiting the first operand, so we add
-% an \cs{if_false:} and expand by hand with \cs{@@_value:w}, thus
+% an \cs{if_false:} and expand by hand with \cs{int_value:w}, thus
% skipping \cs{prg_return_false:} on the first iteration.
%
% Before starting the loop, the first step is to make sure that there
@@ -1521,7 +1507,7 @@
% left hand side of the (in)equality using \cs{@@_eval:w}. Since the
% relation symbols |<|, |>|, |=| and |!| are not allowed in integer
% expressions, they would terminate the expression. If the argument contains no
-% relation symbol, \cs{__prg_compare_error:} is expanded,
+% relation symbol, \cs{@@_compare_error:} is expanded,
% inserting~|=| and itself after an error. In all cases,
% \cs{@@_compare:w} receives as its argument an integer, a relation
% symbol, and some more tokens. We then setup the loop, which is
@@ -1531,11 +1517,11 @@
\prg_new_conditional:Npnn \int_compare:n #1 { p , T , F , TF }
{
\exp_after:wN \@@_compare:w
- \@@_value:w \@@_eval:w #1 \__prg_compare_error:
+ \int_value:w \@@_eval:w #1 \@@_compare_error:
}
-\cs_new:Npn \@@_compare:w #1 \__prg_compare_error:
+\cs_new:Npn \@@_compare:w #1 \@@_compare_error:
{
- \exp_after:wN \if_false: \@@_value:w
+ \exp_after:wN \if_false: \int_value:w
\@@_compare:Nw #1 e { = nd_ } \q_stop
}
% \end{macrocode}
@@ -1551,7 +1537,7 @@
% hence the test for that as a second token. If the relation symbol
% is unknown, then the control sequence is turned by \TeX{} into
% \cs{scan_stop:}, ignored thanks to \tn{unexpanded}, and
-% \cs{__prg_compare_error:Nw} raises an error.
+% \cs{@@_compare_error:Nw} raises an error.
% \begin{macrocode}
\cs_new:Npn \@@_compare:Nw #1#2 \q_stop
{
@@ -1561,7 +1547,7 @@
}
\cs_new:Npn \@@_compare:NNw #1#2#3 \q_mark
{
- \etex_unexpanded:D
+ \__kernel_exp_not:w
\use:c
{
@@_compare_ \token_to_str:N #1
@@ -1568,7 +1554,7 @@
\if_meaning:w = #2 = \fi:
:NNw
}
- \__prg_compare_error:Nw #1
+ \@@_compare_error:Nw #1
}
% \end{macrocode}
% When the last \meta{operand} is seen, \cs{@@_compare:NNw} receives
@@ -1596,12 +1582,12 @@
{#2} \exp_stop_f:
\prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w
\fi:
- #1 #2 #3 \exp_after:wN \@@_compare:Nw \@@_value:w \@@_eval:w
+ #1 #2 #3 \exp_after:wN \@@_compare:Nw \int_value:w \@@_eval:w
}
% \end{macrocode}
% The actual comparisons are then simple function calls, using the
% relation as delimiter for a delimited argument and discarding
-% \cs{__prg_compare_error:Nw} \meta{token} responsible for error
+% \cs{@@_compare_error:Nw} \meta{token} responsible for error
% detection.
% \begin{macrocode}
\cs_new:cpn { @@_compare_=:NNw } #1#2#3 =
@@ -1649,7 +1635,7 @@
% \begin{macro}{\@@_case:nw, \@@_case_end:nw}
% For integer cases, the first task to fully expand the check
% condition. The over all idea is then much the same as for
-% \cs{str_case:nn(TF)} as described in \pkg{l3basics}.
+% \cs{tl_case:nn(TF)} as described in \pkg{l3tl}.
% \begin{macrocode}
\cs_new:Npn \int_case:nnTF #1
{
@@ -1679,7 +1665,8 @@
{ \@@_case_end:nw {#3} }
{ \@@_case:nw {#1} }
}
-\cs_new_eq:NN \@@_case_end:nw \__prg_case_end:nw
+\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+ { \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1810,7 +1797,9 @@
% \subsection{Integer step functions}
%
% \begin{macro}{\int_step_function:nnnN}
-% \begin{macro}{\@@_step:wwwN, \@@_step:NnnnN}
+% \begin{macro}{\@@_step:wwwN, \@@_step:NwnnN}
+% \begin{macro}{\int_step_function:nN}
+% \begin{macro}{\int_step_function:nnN}
% Before all else, evaluate the initial value, step, and final value.
% Repeating a function by steps first needs a check on the direction
% of the steps. After that, do the function for the start value then
@@ -1820,70 +1809,96 @@
% \begin{macrocode}
\__kernel_patch_args:nNNpn
{
- { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_step_function:nnnN }
- { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_step_function:nnnN }
- { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \int_step_function:nnnN }
+ {
+ \__kernel_chk_expr:nNnN {#1} \@@_eval:w { }
+ \int_step_function:nnnN
+ }
+ {
+ \__kernel_chk_expr:nNnN {#2} \@@_eval:w { }
+ \int_step_function:nnnN
+ }
+ {
+ \__kernel_chk_expr:nNnN {#3} \@@_eval:w { }
+ \int_step_function:nnnN
+ }
}
\cs_new:Npn \int_step_function:nnnN #1#2#3
{
\exp_after:wN \@@_step:wwwN
- \@@_value:w \@@_eval:w #1 \exp_after:wN ;
- \@@_value:w \@@_eval:w #2 \exp_after:wN ;
- \@@_value:w \@@_eval:w #3 ;
+ \int_value:w \@@_eval:w #1 \exp_after:wN ;
+ \int_value:w \@@_eval:w #2 \exp_after:wN ;
+ \int_value:w \@@_eval:w #3 ;
}
\cs_new:Npn \@@_step:wwwN #1; #2; #3; #4
{
\int_compare:nNnTF {#2} > \c_zero
- { \@@_step:NnnnN > }
+ { \@@_step:NwnnN > }
{
\int_compare:nNnTF {#2} = \c_zero
{
- \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4}
- \use_none:nnnn
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { zero-step } {#4}
+ \prg_break:
}
- { \@@_step:NnnnN < }
+ { \@@_step:NwnnN < }
}
- {#1} {#2} {#3} #4
+ #1 ; {#2} {#3} #4
+ \prg_break_point:
}
-\cs_new:Npn \@@_step:NnnnN #1#2#3#4#5
+\cs_new:Npn \@@_step:NwnnN #1#2 ; #3#4#5
{
- \int_compare:nNnF {#2} #1 {#4}
- {
- #5 {#2}
- \exp_args:NNf \@@_step:NnnnN
- #1 { \int_eval:n { #2 + #3 } } {#3} {#4} #5
- }
+ \if_int_compare:w #2 #1 #4 \exp_stop_f:
+ \prg_break:n
+ \fi:
+ #5 {#2}
+ \exp_after:wN \@@_step:NwnnN
+ \exp_after:wN #1
+ \int_value:w \@@_eval:w #2 + #3 ; {#3} {#4} #5
}
+\cs_new:Npn \int_step_function:nN
+ { \int_step_function:nnnN { 1 } { 1 } }
+\cs_new:Npn \int_step_function:nnN #1
+ { \int_step_function:nnnN {#1} { 1 } }
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\int_step_inline:nnnn}
-% \begin{macro}{\int_step_variable:nnnNn}
+% \begin{macro}{\int_step_inline:nn, \int_step_inline:nnn, \int_step_inline:nnnn}
+% \begin{macro}{\int_step_variable:nNn, \int_step_variable:nnNn, \int_step_variable:nnnNn}
% \UnitTested
% \begin{macro}{\@@_step:NNnnnn}
% The approach here is to build a function, with a global integer
% required to make the nesting safe (as seen in other in line
% functions), and map that function using \cs{int_step_function:nnnN}.
-% We put a \cs{__prg_break_point:Nn} so that \texttt{map_break}
-% functions from other modules correctly decrement \cs{g__prg_map_int}
+% We put a \cs{prg_break_point:Nn} so that \texttt{map_break}
+% functions from other modules correctly decrement \cs{g__kernel_prg_map_int}
% before looking for their own break point. The first argument is
% \cs{scan_stop:}, so that no breaking function recognizes this break
% point as its own.
% \begin{macrocode}
+\cs_new_protected:Npn \int_step_inline:nn
+ { \int_step_inline:nnnn { 1 } { 1 } }
+\cs_new_protected:Npn \int_step_inline:nnn #1
+ { \int_step_inline:nnnn {#1} { 1 } }
\cs_new_protected:Npn \int_step_inline:nnnn
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \@@_step:NNnnnn
\cs_gset_protected:Npn
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
}
+\cs_new_protected:Npn \int_step_variable:nNn
+ { \int_step_variable:nnnNn { 1 } { 1 } }
+\cs_new_protected:Npn \int_step_variable:nnNn #1
+ { \int_step_variable:nnnNn {#1} { 1 } }
\cs_new_protected:Npn \int_step_variable:nnnNn #1#2#3#4#5
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \@@_step:NNnnnn
\cs_gset_protected:Npx
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
{#1}{#2}{#3}
{
\tl_set:Nn \exp_not:N #4 {##1}
@@ -1894,7 +1909,7 @@
{
#1 #2 ##1 {#6}
\int_step_function:nnnN {#3} {#4} {#5} #2
- \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__kernel_prg_map_int }
}
% \end{macrocode}
% \end{macro}
@@ -2139,7 +2154,7 @@
\or: x
\or: y
\or: z
- \else: \@@_value:w \@@_eval:w #1 \exp_after:wN \@@_eval_end:
+ \else: \int_value:w \@@_eval:w #1 \exp_after:wN \@@_eval_end:
\fi:
}
\cs_new:Npn \@@_to_Letter:n #1
@@ -2172,7 +2187,7 @@
\or: X
\or: Y
\or: Z
- \else: \@@_value:w \@@_eval:w #1 \exp_after:wN \@@_eval_end:
+ \else: \int_value:w \@@_eval:w #1 \exp_after:wN \@@_eval_end:
\fi:
}
% \end{macrocode}
@@ -2479,6 +2494,12 @@
% \end{macrocode}
% \end{macro}
%
+%\subsection{Random integers}
+%
+% \begin{macro}{\int_rand:nn}
+% Defined in \pkg{l3fp-random}.
+% \end{macro}
+%
% \subsection{Constant integers}
%
% \begin{variable}{\c_zero}
@@ -2590,16 +2611,23 @@
% \cs{c_minus_one} (as all deprecated commands) is made outer by
% \cs{debug_deprecation_on:}.
% \begin{macrocode}
-%<package>\cs_gset_eq:NN \c__deprecation_minus_one \m at ne
-%<initex>\int_const:Nn \c__deprecation_minus_one { -1 }
-\cs_new_eq:NN \c_minus_one \c__deprecation_minus_one
+%<package>\cs_gset_eq:NN \c_@@_minus_one \m at ne
+%<initex>\int_const:Nn \c_@@_minus_one { -1 }
+\cs_new_eq:NN \c_minus_one \c_@@_minus_one
\__kernel_deprecation_code:nn
- { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
- { \tex_let:D \c_minus_one \c__deprecation_minus_one }
+ { \__kernel_deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
+ { \tex_let:D \c_minus_one \c_@@_minus_one }
% \end{macrocode}
% \end{variable}
%
+% \begin{macro}[deprecated = 2019-12-31]{\@@_value:w}
+% Made public.
% \begin{macrocode}
+\cs_new_eq:NN \@@_value:w \int_value:w
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3intarray.dtx Copyright (C) 2017 The LaTeX3 Project
+%% File: l3intarray.dtx Copyright (C) 2017-2018 The 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
@@ -30,7 +30,7 @@
%
%
% \title{^^A
-% The \textsf{l3intarray} package: low-level arrays of small integers^^A
+% The \textsf{l3intarray} package: fast global integer arrays^^A
% }
%
% \author{^^A
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -50,66 +50,73 @@
%
% \section{\pkg{l3intarray} documentation}
%
-% This module provides no user function: at present it is meant for
-% kernel use only.
+% For applications requiring heavy use of integers, this module provides
+% arrays which can be accessed in constant time (contrast \pkg{l3seq},
+% where access time is linear). These arrays have several important
+% features
+% \begin{itemize}
+% \item The size of the array is fixed and must be given at
+% point of initialisation
+% \item The absolute value of each entry has maximum $2^{30}-1$
+% (\emph{i.e.}~one power lower than the usual \cs{c_max_int}
+% ceiling of $2^{31}-1$)
+% \end{itemize}
+% The use of \texttt{intarray} data is therefore recommended for cases where
+% the need for fast access is of paramount importance.
%
-% It is a wrapper around the \tn{fontdimen} primitive, used to store
-% arrays of integers (with a restricted range: absolute value at most
-% $2^{30}-1$). In contrast to \pkg{l3seq} sequences the access to
-% individual entries is done in constant time rather than linear time,
-% but only integers can be stored. More precisely, the primitive
-% \tn{fontdimen} stores dimensions but the \pkg{l3intarray} package
-% transparently converts these from/to integers. Assignments are always
-% global.
-%
-% While \LuaTeX{}'s memory is extensible, other engines can
-% \enquote{only} deal with a bit less than $4\times 10^6$ entries in all
-% \tn{fontdimen} arrays combined (with default \TeX{}Live settings).
-%
-% \subsection{Internal functions}
-%
-% \begin{function}{\__intarray_new:Nn}
+% \begin{function}[added = 2018-03-29]{\intarray_new:Nn}
% \begin{syntax}
-% \cs{__intarray_new:Nn} \meta{intarray~var} \Arg{size}
+% \cs{intarray_new:Nn} \meta{intarray~var} \Arg{size}
% \end{syntax}
% Evaluates the integer expression \meta{size} and allocates an
% \meta{integer array variable} with that number of (zero) entries.
% \end{function}
%
-% \begin{function}[EXP]{\__intarray_count:N}
+% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N}
% \begin{syntax}
-% \cs{__intarray_count:N} \meta{intarray~var}
+% \cs{intarray_count:N} \meta{intarray~var}
% \end{syntax}
% Expands to the number of entries in the \meta{integer array variable}.
% Contrarily to \cs{seq_count:N} this is performed in constant time.
% \end{function}
%
-% \begin{function}{\__intarray_gset:Nnn, \__intarray_gset_fast:Nnn}
+% \begin{function}[added = 2018-03-29]{\intarray_gset:Nnn}
% \begin{syntax}
-% \cs{__intarray_gset:Nnn} \meta{intarray~var} \Arg{position} \Arg{value}
-% \cs{__intarray_gset_fast:Nnn} \meta{intarray~var} \Arg{position} \Arg{value}
+% \cs{intarray_gset:Nnn} \meta{intarray~var} \Arg{position} \Arg{value}
% \end{syntax}
% Stores the result of evaluating the integer expression \meta{value}
% into the \meta{integer array variable} at the (integer expression)
-% \meta{position}. While \cs{__intarray_gset:Nnn} checks that the
-% \meta{position} is between $1$ and the \cs{__intarray_count:N} and that
-% the \meta{value}'s absolute value is at most $2^{30}-1$, the
-% \enquote{fast} function performs no such bound check.
-% Assignments are always global.
+% \meta{position}. If the \meta{position} is not between $1$ and the
+% \cs{intarray_count:N}, or the \meta{value}'s absolute value is
+% bigger than $2^{30}-1$, an error occurs. Assignments are always
+% global.
% \end{function}
%
-% \begin{function}[EXP]{\__intarray_item:Nn, \__intarray_item_fast:Nn}
+% \begin{function}[EXP, added = 2018-03-29]{\intarray_item:Nn}
% \begin{syntax}
-% \cs{__intarray_item:Nn} \meta{intarray~var} \Arg{position}
-% \cs{__intarray_item_fast:Nn} \meta{intarray~var} \Arg{position}
+% \cs{intarray_item:Nn} \meta{intarray~var} \Arg{position}
% \end{syntax}
% Expands to the integer entry stored at the (integer expression)
-% \meta{position} in the \meta{integer array variable}. While
-% \cs{__intarray_item:Nn} checks that the \meta{position} is between $1$
-% and the \cs{__intarray_count:N}, the \enquote{fast} function performs
-% no such bound check.
+% \meta{position} in the \meta{integer array variable}. If the
+% \meta{position} is not between $1$ and the \cs{intarray_count:N}, an
+% error occurs.
% \end{function}
%
+% \subsection{Implementation notes}
+%
+% It is a wrapper around the \tn{fontdimen} primitive, used to store
+% arrays of integers (with a restricted range: absolute value at most
+% $2^{30}-1$). In contrast to \pkg{l3seq} sequences the access to
+% individual entries is done in constant time rather than linear time,
+% but only integers can be stored. More precisely, the primitive
+% \tn{fontdimen} stores dimensions but the \pkg{l3intarray} package
+% transparently converts these from/to integers. Assignments are always
+% global.
+%
+% While \LuaTeX{}'s memory is extensible, other engines can
+% \enquote{only} deal with a bit less than $4\times 10^6$ entries in all
+% \tn{fontdimen} arrays combined (with default \TeX{}Live settings).
+%
% \end{documentation}
%
% \begin{implementation}
@@ -126,6 +133,13 @@
%
% \subsection{Allocating arrays}
%
+% \begin{variable}{\c_@@_sp_dim}
+% Used to convert integers to dimensions fast.
+% \begin{macrocode}
+\dim_const:Nn \c_@@_sp_dim { 1 sp }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\g_@@_font_int}
% Used to assign one font per array.
% \begin{macrocode}
@@ -133,7 +147,7 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_new:Nn}
+% \begin{macro}{\intarray_new:Nn}
% Declare |#1| to be a font (arbitrarily |cmr10| at a never-used
% size). Store the array's size as the \tn{hyphenchar} of that font
% and make sure enough \tn{fontdimen} are allocated, by setting the
@@ -141,83 +155,121 @@
% It seems \LuaTeX{}'s |cmr10| has an extra \tn{fontdimen} parameter
% number $8$ compared to other engines (for a math font we would
% replace $8$ by $22$ or some such).
+% Every \texttt{intarray} must be global; it's enough to run this
+% check in \cs{intarray_new:Nn}.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_new:Nn #1#2
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN g #1 } { }
+\cs_new_protected:Npn \intarray_new:Nn #1#2
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\int_gincr:N \g_@@_font_int
- \tex_global:D \tex_font:D #1 = cmr10~at~ \g_@@_font_int sp \scan_stop:
+ \tex_global:D \tex_font:D #1
+ = cmr10~at~ \g_@@_font_int \c_@@_sp_dim \scan_stop:
\tex_hyphenchar:D #1 = \int_eval:n {#2} \scan_stop:
\int_compare:nNnT { \tex_hyphenchar:D #1 } > 0
- { \tex_fontdimen:D \tex_hyphenchar:D #1 #1 = 0 sp \scan_stop: }
- \int_step_inline:nnnn { 1 } { 1 } { 8 }
- { \tex_fontdimen:D ##1 #1 = 0 sp \scan_stop: }
+ { \tex_fontdimen:D \tex_hyphenchar:D #1 #1 = \c_zero_dim }
+ \int_step_inline:nn { 8 } { \tex_fontdimen:D ##1 #1 = \c_zero_dim }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_count:N}
+% \begin{macro}[EXP]{\intarray_count:N}
% Size of an array.
% \begin{macrocode}
-\cs_new:Npn \@@_count:N #1 { \tex_the:D \tex_hyphenchar:D #1 }
+\cs_new:Npn \intarray_count:N #1 { \tex_the:D \tex_hyphenchar:D #1 }
% \end{macrocode}
% \end{macro}
%
% \subsection{Array items}
%
-% \begin{macro}{\@@_gset:Nnn, \@@_gset_fast:Nnn}
-% \begin{macro}{\@@_gset_aux:Nnn}
-% Set the appropriate \tn{fontdimen}. The slow version checks the
-% position and value are within bounds.
+% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn}
+% The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share
+% bounds checking. The |T| branch is used if |#3| is within bounds of
+% the array |#2|.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_gset_fast:Nnn #1#2#3
- { \tex_fontdimen:D \int_eval:n {#2} #1 = \int_eval:n {#3} sp \scan_stop: }
-\cs_new_protected:Npn \@@_gset:Nnn #1#2#3
+\cs_new:Npn \@@_bounds:NNnTF #1#2#3#4#5
{
- \exp_args:Nff \@@_gset_aux:Nnn #1
- { \int_eval:n {#2} } { \int_eval:n {#3} }
+ \if_int_compare:w 1 > #3 \exp_stop_f:
+ \@@_bounds_error:NNn #1 #2 {#3}
+ #5
+ \else:
+ \if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
+ \@@_bounds_error:NNn #1 #2 {#3}
+ #5
+ \else:
+ #4
+ \fi:
+ \fi:
}
-\cs_new_protected:Npn \@@_gset_aux:Nnn #1#2#3
+\cs_new:Npn \@@_bounds_error:NNn #1#2#3
{
- \int_compare:nTF { 1 <= #2 <= \@@_count:N #1 }
+ #1 { kernel } { out-of-bounds }
+ { \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intarray_gset:Nnn, \__kernel_intarray_gset:Nnn}
+% \begin{macro}{\@@_gset:Nnn, \@@_gset_overflow:Nnn}
+% Set the appropriate \tn{fontdimen}. The
+% \cs{__kernel_intarray_gset:Nnn} function does not use
+% \cs{int_eval:n}, namely its arguments must be suitable for
+% \cs{int_value:w}. The user version checks the position and value
+% are within bounds.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_intarray_gset:Nnn #1#2#3
+ { \tex_fontdimen:D #2 #1 #3 \c_@@_sp_dim }
+\cs_new_protected:Npn \intarray_gset:Nnn #1#2#3
+ {
+ \exp_after:wN \@@_gset:Nww
+ \exp_after:wN #1
+ \int_value:w \int_eval:n {#2} \exp_after:wN ;
+ \int_value:w \int_eval:n {#3} ;
+ }
+\cs_new_protected:Npn \@@_gset:Nww #1#2 ; #3 ;
+ {
+ \@@_bounds:NNnTF \__kernel_msg_error:nnxxx #1 {#2}
{
- \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim }
- { \@@_gset_fast:Nnn #1 {#2} {#3} }
- {
- \__kernel_msg_error:nnxxxx { kernel } { overflow }
- { \token_to_str:N #1 } {#2} {#3}
- { \int_compare:nNnT {#3} < 0 { - } \__int_value:w \c_max_dim }
- \@@_gset_fast:Nnn #1 {#2}
- { \int_compare:nNnT {#3} < 0 { - } \c_max_dim }
- }
+ \if_int_compare:w \int_abs:n {#3} > \c_max_dim
+ \exp_after:wN \@@_gset_overflow:NNnn
+ \fi:
+ \__kernel_intarray_gset:Nnn #1 {#2} {#3}
}
- {
- \__kernel_msg_error:nnxxx { kernel } { out-of-bounds }
- { \token_to_str:N #1 } {#2} { \@@_count:N #1 }
- }
+ { }
}
+\cs_new_protected:Npn \@@_gset_overflow:NNnn #1#2#3#4
+ {
+ \__kernel_msg_error:nnxxxx { kernel } { overflow }
+ { \token_to_str:N #2 } {#3} {#4}
+ { \int_value:w \int_compare:nNnT {#4} < 0 { - } \c_max_dim }
+ \__kernel_intarray_gset:Nnn #2 {#3}
+ { \int_value:w \int_compare:nNnT {#4} < 0 { - } \c_max_dim }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_item:Nn, \@@_item_fast:Nn}
-% \begin{macro}{\@@_item_aux:Nn}
-% Get the appropriate \tn{fontdimen} and perform bound checks if requested.
+% \begin{macro}[EXP]{\intarray_item:Nn, \__kernel_intarray_item:Nn}
+% \begin{macro}{\@@_item:Nn}
+% Get the appropriate \tn{fontdimen} and perform bound checks. The
+% \cs{__kernel_intarray_item:Nn} function omits bound checks and omits
+% \cs{int_eval:n}, namely its argument must be a \TeX{} integer
+% suitable for \cs{int_value:w}.
% \begin{macrocode}
-\cs_new:Npn \@@_item_fast:Nn #1#2
- { \__int_value:w \tex_fontdimen:D \int_eval:n {#2} #1 }
-\cs_new:Npn \@@_item:Nn #1#2
- { \exp_args:Nf \@@_item_aux:Nn #1 { \int_eval:n {#2} } }
-\cs_new:Npn \@@_item_aux:Nn #1#2
+\cs_new:Npn \__kernel_intarray_item:Nn #1#2
+ { \int_value:w \tex_fontdimen:D #2 #1 }
+\cs_new:Npn \intarray_item:Nn #1#2
{
- \int_compare:nTF { 1 <= #2 <= \@@_count:N #1 }
- { \@@_item_fast:Nn #1 {#2} }
- {
- \__kernel_msg_expandable_error:nnnnn { kernel } { out-of-bounds }
- { \token_to_str:N #1 } {#2} { \@@_count:N #1 }
- 0
- }
+ \exp_after:wN \@@_item:Nw
+ \exp_after:wN #1
+ \int_value:w \int_eval:n {#2} ;
}
+\cs_new:Npn \@@_item:Nw #1#2 ;
+ {
+ \@@_bounds:NNnTF \__kernel_msg_expandable_error:nnfff #1 {#2}
+ { \__kernel_intarray_item:Nn #1 {#2} }
+ { 0 }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -0,0 +1,481 @@
+% \iffalse meta-comment
+%
+%% File: l3kernel-functions.dtx Copyright (C) 2018 The 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
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{l3kernel-functions} package\\ Kernel-reserved functions^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team at latex-project.org}
+% {latex-team at latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2018-04-30}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{Internal kernel functions}
+%
+% \begin{function}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c}
+% \begin{syntax}
+% \cs{__kernel_chk_cs_exist:N} \meta{cs}
+% \end{syntax}
+% This function is only created if debugging is enabled. It checks
+% that \meta{cs} exists according to the criteria for
+% \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
+% \end{function}
+%
+% \begin{function}{\__kernel_chk_defined:NT}
+% \begin{syntax}
+% \cs{__kernel_chk_defined:NT} \meta{variable} \Arg{true code}
+% \end{syntax}
+% If \meta{variable} is not defined (according to
+% \cs{cs_if_exist:NTF}), this triggers an error, otherwise the
+% \meta{true code} is run.
+% \end{function}
+%
+% \begin{function}{\__kernel_chk_expr:nNnN}
+% \begin{syntax}
+% \cs{__kernel_chk_expr:nNnN} \Arg{expr} \meta{eval} \Arg{convert} \meta{caller}
+% \end{syntax}
+% This function is only created if debugging is enabled. By default
+% it is equivalent to \cs{use_i:nnnn}. When expression checking is
+% enabled, it leaves in the input stream the result of \cs{tex_the:D}
+% \meta{eval} \meta{expr} \cs{tex_relax:D} after checking that no
+% token was left over. If any token was not taken as part of the
+% expression, there is an error message displaying the result of the
+% evaluation as well as the \meta{caller}. For instance \meta{eval}
+% can be \cs{__int_eval:w} and \meta{caller} can be \cs{int_eval:n} or
+% \cs{int_set:Nn}. The argument \meta{convert} is empty except for mu
+% expressions where it is \cs{etex_mutoglue:D}, used for internal
+% purposes.
+% \end{function}
+%
+% \begin{function}{\__kernel_chk_var_exist:N}
+% \begin{syntax}
+% \cs{__kernel_chk_var_exist:N} \meta{var}
+% \end{syntax}
+% This function is only created if debugging is enabled. It checks
+% that \meta{var} is defined according to the criteria for
+% \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
+% \end{function}
+%
+% \begin{function}{\__kernel_chk_var_scope:NN}
+% \begin{syntax}
+% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}
+% \end{syntax}
+% Checks the \meta{var} has the correct \meta{scope}, and if not
+% raises a kernel-level error. This function is only created if
+% debugging is enabled. The \meta{scope} is a single letter |l|, |g|,
+% |c| denoting local variables, global variables, or constants. More
+% precisely, if the variable name starts with a letter and an
+% underscore (normal \pkg{expl3} convention) the function checks that
+% this single letter matches the \meta{scope}. Otherwise the function
+% cannot know the scope \meta{var} the first time: instead, it defines
+% |\__debug_chk_/|\meta{var name} to store that information for the
+% next call. Thus, if a given \meta{var} is subject to assignments of
+% different scopes a kernel error will result.
+% \end{function}
+%
+% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
+% \begin{syntax}
+% \cs{__kernel_chk_var_local:N} \meta{var}
+% \cs{__kernel_chk_var_global:N} \meta{var}
+% \end{syntax}
+% Applies \cs{__kernel_chk_var_exist:N} \meta{var}, and assuming that is
+% true applies
+% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where
+% \meta{scope} is |l| or~|g|.
+% \end{function}
+%
+% \begin{function}{\__kernel_cs_parm_from_arg_count:nnF}
+% \begin{syntax}
+% \cs{__kernel_cs_parm_from_arg_count:nnF} \Arg{follow-on} \Arg{args} \Arg{false code}
+% \end{syntax}
+% Evaluates the number of \meta{args} and leaves the \meta{follow-on} code
+% followed by a brace group containing the required number of primitive
+% parameter markers (|#1|, \emph{etc}.). If the number of \meta{args} is outside
+% the range $[0,9]$, the \meta{false code} is inserted \emph{instead} of
+% the \meta{follow-on}.
+% \end{function}
+%
+% \begin{function}{\__kernel_if_debug:TF}
+% \begin{syntax}
+% \cs{__kernel_if_debug:TF} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Runs the \meta{true code} if debugging is enabled, namely only in
+% \LaTeXe{} package mode with one of the options
+% \texttt{check-declarations}, \texttt{enable-debug}, or
+% \texttt{log-functions}. Otherwise runs the \meta{false code}. The
+% |T| and |F| variants are not provided for this low-level
+% conditional.
+% \end{function}
+%
+% \begin{function}{\__kernel_debug_log:x}
+% \begin{syntax}
+% \cs{__kernel_debug_log:x} \Arg{message text}
+% \end{syntax}
+% If the \texttt{log-functions} option is active, this function writes
+% the \meta{message text} to the log file using \cs{iow_log:x}.
+% Otherwise, the \meta{message text} is ignored using \cs{use_none:n}.
+% This function is only created if debugging is enabled.
+% \end{function}
+%
+% \begin{function}[EXP]{\__kernel_exp_not:w}
+% \begin{syntax}
+% \cs{__kernel_exp_not:w} \meta{expandable tokens} \Arg{content}
+% \end{syntax}
+% Carries out expansion on the \meta{expandable tokens} before preventing
+% further expansion of the \meta{content} as for \cs{exp_not:n}. Typically,
+% the \meta{expandable tokens} will alter the nature of the \meta{content},
+% \emph{i.e.}~allow it to be generated in some way.
+% \end{function}
+%
+% \begin{variable}{\l__kernel_expl_bool}
+% A boolean which records the current code syntax status: \texttt{true} if
+% currently inside a code environment. This variable should only be
+% set by \cs{ExplSyntaxOn}/\cs{ExplSyntaxOff}.
+% \end{variable}
+%
+% \begin{function}{\__kernel_file_missing:n}
+% \begin{syntax}
+% \cs{__kernel_file_missing:n} \Arg{name}
+% \end{syntax}
+% Expands the \meta{name} as per \cs{__kernel_file_name_sanitize:nN} then
+% produces an error message indicating that that file was not found.
+% \end{function}
+%
+% \begin{function}{\__kernel_file_name_sanitize:nN}
+% \begin{syntax}
+% \cs{__kernel_file_name_sanitize:nN} \Arg{name} \meta{str var}
+% \end{syntax}
+% For converting a \meta{name} to a string where active characters are treated
+% as strings.
+% \end{function}
+%
+% \begin{function}{\__kernel_file_input_push:n, \__kernel_file_input_pop:}
+% \begin{syntax}
+% \cs{__kernel_file_input_push:n} \Arg{name}
+% \cs{__kernel_file_input_pop:}
+% \end{syntax}
+% Used to push and pop data from the internal file stack: needed only
+% in package mode, where interfacing with the \LaTeXe{} kernel is necessary.
+% \end{function}
+%
+% \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
+% \begin{syntax}
+% \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name}
+% \end{syntax}
+% This function has identical syntax to the public version. However,
+% is does not take precautions against active characters in the
+% \meta{file name}, and it does not attempt to add a \meta{path} to
+% the \meta{file name}: it is therefore intended to be used by
+% higher-level
+% functions which have already fully expanded the \meta{file name} and which
+% need to perform multiple open or close operations. See for example the
+% implementation of \cs{file_get_full_name:nN},
+% \end{function}
+%
+% \begin{function}{\__kernel_iow_with:Nnn}
+% \begin{syntax}
+% \cs{__kernel_iow_with:Nnn} \meta{integer} \Arg{value} \Arg{code}
+% \end{syntax}
+% If the \meta{integer} is equal to the \meta{value} then this
+% function simply runs the \meta{code}. Otherwise it saves the
+% current value of the \meta{integer}, sets it to the \meta{value},
+% runs the \meta{code}, and restores the \meta{integer} to its former
+% value. This is used to ensure that the \tn{newlinechar} is~$10$
+% when writing to a stream, which lets \cs{iow_newline:} work, and
+% that \tn{errorcontextlines} is $-1$ when displaying a message.
+% \end{function}
+%
+% \begin{function}
+% {\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
+% \begin{syntax}
+% \cs{__kernel_msg_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
+% \end{syntax}
+% Creates a kernel \meta{message} for a given \meta{module}.
+% The message is defined to first give \meta{text} and then
+% \meta{more text} if the user requests it. If no \meta{more text} is
+% available then a standard text is given instead. Within \meta{text}
+% and \meta{more text} four parameters (|#1| to |#4|) can be used:
+% these will be supplied and expanded at the time the message is used.
+% An error is raised if the \meta{message} already exists.
+% \end{function}
+%
+% \begin{function}
+% {\__kernel_msg_set:nnnn, \__kernel_msg_set:nnn}
+% \begin{syntax}
+% \cs{__kernel_msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
+% \end{syntax}
+% Sets up the text for a kernel \meta{message} for a given \meta{module}.
+% The message is defined to first give \meta{text} and then
+% \meta{more text} if the user requests it. If no \meta{more text} is
+% available then a standard text is given instead. Within \meta{text}
+% and \meta{more text} four parameters (|#1| to |#4|) can be used:
+% these will be supplied and expanded at the time the message is used.
+% \end{function}
+%
+% \begin{function}
+% {
+% \__kernel_msg_fatal:nnnnnn ,
+% \__kernel_msg_fatal:nnnnn ,
+% \__kernel_msg_fatal:nnnn ,
+% \__kernel_msg_fatal:nnn ,
+% \__kernel_msg_fatal:nn ,
+% \__kernel_msg_fatal:nnxxxx ,
+% \__kernel_msg_fatal:nnxxx ,
+% \__kernel_msg_fatal:nnxx ,
+% \__kernel_msg_fatal:nnx
+% }
+% \begin{syntax}
+% \cs{__kernel_msg_fatal:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
+% to \meta{arg four} to the text-creating functions. After issuing a
+% fatal error the \TeX{} run halts. Cannot be redirected.
+% \end{function}
+%
+% \begin{function}
+% {
+% \__kernel_msg_error:nnnnnn ,
+% \__kernel_msg_error:nnnnn ,
+% \__kernel_msg_error:nnnn ,
+% \__kernel_msg_error:nnn ,
+% \__kernel_msg_error:nn ,
+% \__kernel_msg_error:nnxxxx ,
+% \__kernel_msg_error:nnxxx ,
+% \__kernel_msg_error:nnxx ,
+% \__kernel_msg_error:nnx
+% }
+% \begin{syntax}
+% \cs{__kernel_msg_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
+% to
+% \meta{arg four} to the text-creating functions. The error
+% stops processing and issues the text at the terminal. After user input,
+% the run continues. Cannot be redirected.
+% \end{function}
+%
+% \begin{function}
+% {
+% \__kernel_msg_warning:nnnnnn ,
+% \__kernel_msg_warning:nnnnn ,
+% \__kernel_msg_warning:nnnn ,
+% \__kernel_msg_warning:nnn ,
+% \__kernel_msg_warning:nn ,
+% \__kernel_msg_warning:nnxxxx ,
+% \__kernel_msg_warning:nnxxx ,
+% \__kernel_msg_warning:nnxx ,
+% \__kernel_msg_warning:nnx
+% }
+% \begin{syntax}
+% \cs{__kernel_msg_warning:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues kernel \meta{module} warning \meta{message}, passing
+% \meta{arg one} to
+% \meta{arg four} to the text-creating functions. The warning text
+% is added to the log file, but the \TeX{} run is not interrupted.
+% \end{function}
+%
+% \begin{function}
+% {
+% \__kernel_msg_info:nnnnnn ,
+% \__kernel_msg_info:nnnnn ,
+% \__kernel_msg_info:nnnn ,
+% \__kernel_msg_info:nnn ,
+% \__kernel_msg_info:nn ,
+% \__kernel_msg_info:nnxxxx ,
+% \__kernel_msg_info:nnxxx ,
+% \__kernel_msg_info:nnxx ,
+% \__kernel_msg_info:nnx
+% }
+% \begin{syntax}
+% \cs{__kernel_msg_info:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues kernel \meta{module} information \meta{message}, passing
+% \meta{arg one} to \meta{arg four} to the text-creating functions.
+% The information text is added to the log file.
+% \end{function}
+%
+% \begin{function}[EXP]
+% {
+% \__kernel_msg_expandable_error:nnnnnn,
+% \__kernel_msg_expandable_error:nnnnn,
+% \__kernel_msg_expandable_error:nnnn,
+% \__kernel_msg_expandable_error:nnn,
+% \__kernel_msg_expandable_error:nn,
+% \__kernel_msg_expandable_error:nnffff,
+% \__kernel_msg_expandable_error:nnfff,
+% \__kernel_msg_expandable_error:nnff,
+% \__kernel_msg_expandable_error:nnf,
+% }
+% \begin{syntax}
+% \cs{__kernel_msg_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues an error, passing \meta{arg one} to \meta{arg four}
+% to the text-creating functions. The resulting string must
+% be much shorter than a line, otherwise it is cropped.
+% \end{function}
+%
+% \begin{function}{\__kernel_patch:nnNNpn}
+% \begin{syntax}
+% \cs{__kernel_patch:nnNNpn} \Arg{before} \Arg{after}
+% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
+% \end{syntax}
+% If debugging is not enabled, this function ignores the \meta{before}
+% and \meta{after} code and performs the \meta{definition} with no
+% patching. Otherwise it replaces \meta{code} by \meta{before}
+% \meta{code} \meta{after} (which can involve |#1| and so on) in the
+% \meta{definition} that follows. The \meta{definition} must start
+% with \cs{cs_new:Npn} or \cs{cs_set:Npn} or \cs{cs_gset:Npn} or their
+% \texttt{_protected} counterparts. Other cases can be added as
+% needed.
+% \end{function}
+%
+% \begin{function}{\__kernel_patch_conditional:nNNpnn}
+% \begin{syntax}
+% \cs{__kernel_patch_conditional:nNNpnn} \Arg{before}
+% \meta{definition} \meta{conditional} \meta{parameters} \Arg{type} \Arg{code}
+% \end{syntax}
+% Similar to \cs{__kernel_patch:nnNNpn} for conditionals, namely
+% \meta{definition} must be \cs{prg_new_conditional:Npnn} or its
+% \texttt{_protected} counterpart. There is no \meta{after} code
+% because that would interfere with the action of the conditional.
+% \end{function}
+%
+% \begin{function}
+% {\__kernel_patch_args:nNNpn, \__kernel_patch_conditional_args:nNNpnn}
+% \begin{syntax}
+% \cs{__kernel_patch_args:nNNpn} \Arg{arguments}
+% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
+% \end{syntax}
+% Like \cs{__kernel_patch:nnNNpn}, this tweaks the following
+% definition, but from the \enquote{inside out} (and if debugging is
+% not enabled, the \meta{arguments} are ignored). It replaces |#1|,
+% |#2| and so on in the \meta{code} of the definition as indicated by
+% the \meta{arguments}. More precisely, a temporary function is
+% defined using the \meta{definition} with the \meta{parameters} and
+% \meta{code}, then the result of expanding that function once in
+% front of the \meta{arguments} is used instead of the \meta{code}
+% when defining the actual function. For instance,
+% \begin{quote}
+% \cs{__kernel_patch_args:nNNpn} |{ { (#1) } }| \\
+% \cs{cs_new:Npn} \cs{int_eval:n} |#1| \\
+% ~~|{ \int_value:w \__int_eval:w #1 \__int_eval_end: }|
+% \end{quote}
+% would replace |#1| by |(#1)| in the definition of \cs{int_eval:n} when
+% debugging is enabled. This fails if the \meta{code} contains~|##|.
+% The \cs{__kernel_patch_conditional_args:nNNpnn} function is for use
+% before \cs{prg_new_conditional:Npnn} or its \texttt{_protected}
+% counterpart.
+% \end{function}
+%
+% \begin{function}
+% {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn}
+% \begin{syntax}
+% \cs{__kernel_patch_args:nnnNNpn} \Arg{before} \Arg{after} \Arg{arguments}
+% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
+% \end{syntax}
+% A combination of \cs{__kernel_patch:nnNNpn} and
+% \cs{__kernel_patch_args:nNNpn}.
+% \end{function}
+%
+% \begin{variable}{\g__kernel_prg_map_int}
+% This integer is used by non-expandable mapping functions to track
+% the level of nesting in force. The functions
+% \cs[no-index]{\meta{type}_map_1:w},
+% \cs[no-index]{\meta{type}_map_2:w}, \emph{etc.}, labelled by
+% \cs{g__kernel_prg_map_int}
+% hold functions to be mapped over various list datatypes in inline
+% and variable mappings.
+% \end{variable}
+%
+% \begin{function}{\__kernel_register_show:N, \__kernel_register_show:c}
+% \begin{syntax}
+% \cs{__kernel_register_show:N} \meta{register}
+% \end{syntax}
+% Used to show the contents of a \TeX{} register at the terminal, formatted
+% such that internal parts of the mechanism are not visible.
+% \end{function}
+%
+% \begin{function}
+% {\__kernel_register_log:N, \__kernel_register_log:c}
+% \begin{syntax}
+% \cs{__kernel_register_log:N} \meta{register}
+% \end{syntax}
+% Used to write the contents of a \TeX{} register to the log file in a
+% form similar to \cs{__kernel_register_show:N}.
+% \end{function}
+%
+% \begin{function}[EXP]{\__kernel_str_to_other:n}
+% \begin{syntax}
+% \cs{__kernel_str_to_other:n} \Arg{token list}
+% \end{syntax}
+% Converts the \meta{token list} to a \meta{other string}, where
+% spaces have category code \enquote{other}. This function can be
+% \texttt{f}-expanded without fear of losing a leading space, since
+% spaces do not have category code $10$ in its result. It takes a
+% time quadratic in the character count of the string.
+% \end{function}
+%
+% \begin{function}[rEXP]{\__kernel_str_to_other_fast:n}
+% \begin{syntax}
+% \cs{__kernel_str_to_other_fast:n} \Arg{token list}
+% \end{syntax}
+% Same behaviour \cs{__kernel_str_to_other:n} but only restricted-expandable.
+% It takes a time linear in the character count of the string.
+% \end{function}
+%
+% \begin{function}[EXP]{\__kernel_tl_to_str:w}
+% \begin{syntax}
+% \cs{__kernel_tl_to_str:w} \meta{expandable tokens} \Arg{tokens}
+% \end{syntax}
+% Carries out expansion on the \meta{expandable tokens} before conversion of
+% the \meta{tokens} to a string as describe for \cs{tl_to_str:n}. Typically,
+% the \meta{expandable tokens} will alter the nature of the \meta{tokens},
+% \emph{i.e.}~allow it to be generated in some way. This function requires
+% only a single expansion.
+% \end{function}
+%
+% \end{implementation}
+%
+% \PrintIndex
Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -118,7 +118,7 @@
%
% \section{Creating keys}
%
-% \begin{function}[updated = 2015-11-07]{\keys_define:nn}
+% \begin{function}[updated = 2017-11-14]{\keys_define:nn}
% \begin{syntax}
% \cs{keys_define:nn} \Arg{module} \Arg{keyval list}
% \end{syntax}
@@ -343,9 +343,9 @@
% \meta{key} .meta:n = \Arg{keyval list}
% \end{syntax}
% Makes \meta{key} a meta-key, which will set \meta{keyval list} in
-% one go. If \meta{key} is given with a value at the time the key
-% is used, then the value will be passed through to the subsidiary
-% \meta{keys} for processing (as |#1|).
+% one go. The \meta{keyval list} can refer as |#1| to the value given
+% at the time the \meta{key} is used (or, if no value is given, the
+% \meta{key}'s default value).
% \end{function}
%
% \begin{function}[added = 2013-07-10]{.meta:nn}
@@ -353,10 +353,10 @@
% \meta{key} .meta:nn = \Arg{path} \Arg{keyval list}
% \end{syntax}
% Makes \meta{key} a meta-key, which will set \meta{keyval list} in
-% one go using the \meta{path} in place of the current one.
-% If \meta{key} is given with a value at the time the key
-% is used, then the value will be passed through to the subsidiary
-% \meta{keys} for processing (as |#1|).
+% one go using the \meta{path} in place of the current one. The
+% \meta{keyval list} can refer as |#1| to the value given at the time
+% the \meta{key} is used (or, if no value is given, the \meta{key}'s
+% default value).
% \end{function}
%
% \begin{function}[added = 2011-08-21]{.multichoice:}
@@ -598,7 +598,7 @@
%
% \section{Setting keys}
%
-% \begin{function}[updated = 2015-11-07]
+% \begin{function}[updated = 2017-11-14]
% {\keys_set:nn, \keys_set:nV, \keys_set:nv, \keys_set:no}
% \begin{syntax}
% \cs{keys_set:nn} \Arg{module} \Arg{keyval list}
@@ -757,7 +757,7 @@
%
% \section{Utility functions for keys}
%
-% \begin{function}[EXP, pTF, updated = 2015-11-07]{\keys_if_exist:nn}
+% \begin{function}[EXP, pTF, updated = 2017-11-14]{\keys_if_exist:nn}
% \begin{syntax}
% \cs{keys_if_exist_p:nn} \Arg{module} \Arg{key} \\
% \cs{keys_if_exist:nnTF} \Arg{module} \Arg{key} \Arg{true code} \Arg{false code}
@@ -766,7 +766,7 @@
% has been defined for \meta{key}.
% \end{function}
%
-% \begin{function}[added = 2011-08-21,EXP,pTF, updated = 2015-11-07]
+% \begin{function}[added = 2011-08-21,EXP,pTF, updated = 2017-11-14]
% {\keys_if_choice_exist:nnn}
% \begin{syntax}
% \cs{keys_if_choice_exist_p:nnn} \Arg{module} \Arg{key} \Arg{choice} \\
@@ -913,9 +913,7 @@
% The main function starts off by normalising category codes in package mode.
% That's relatively \enquote{expensive} so is skipped (hopefully) in format
% mode. We then hand off to the parser. The use of \cs{q_mark} here prevents
-% loss of braces from the key argument. This particular quark is chosen as
-% it fits in with \cs{__tl_trim_spaces:nn} and allows a performance enhancement
-% as the token can be carried through. Notice that by passing the two
+% loss of braces from the key argument. Notice that by passing the two
% processor commands along the input stack we avoid the need to track these
% at all.
% \begin{macrocode}
@@ -1043,7 +1041,9 @@
\if_meaning:w \l_@@_key_tl \c_empty_tl
\exp_after:wN \@@_split_tidy:w
\else:
- \exp_after:wN \@@_split_value:NNw \exp_after:wN #1 \exp_after:wN #2
+ \exp_after:wN \@@_split_value:NNw
+ \exp_after:wN #1
+ \exp_after:wN #2
\exp_after:wN \q_mark
\fi:
}
@@ -1053,8 +1053,10 @@
\cs_set:Npx \@@_action:
{ \exp_not:N #1 { \exp_not:o \l_@@_key_tl } }
\else:
- \if:w \scan_stop: \etex_detokenize:D \exp_after:wN { \use_none:n #4 }
+ \if:w
\scan_stop:
+ \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #4 }
+ \scan_stop:
\@@_def:Nn \l_@@_value_tl {#3}
\cs_set:Npx \@@_action:
{
@@ -1064,7 +1066,10 @@
}
\else:
\cs_set:Npn \@@_action:
- { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } }
+ {
+ \__kernel_msg_error:nn { kernel }
+ { misplaced-equals-sign }
+ }
\fi:
\fi:
\@@_action:
@@ -1071,8 +1076,10 @@
}
\cs_new_protected:Npn \@@_split_tidy:w #1 \q_stop
{
- \if:w \scan_stop: \etex_detokenize:D \exp_after:wN { \use_none:n #1 }
+ \if:w
\scan_stop:
+ \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 }
+ \scan_stop:
\else:
\exp_after:wN \@@_empty_key:
\fi:
@@ -1088,15 +1095,16 @@
% \begin{macro}{\@@_def:Nn}
% \begin{macro}[EXP]{\@@_def_aux:n}
% \begin{macro}[EXP]{\@@_def_aux:w}
-% First trim spaces off, then potentially remove a set of braces. By using
-% the internal interface |\__tl_trim_spaces:nn| we can take advantage of the
-% fact it needs a leading |\q_mark| in this process. The |\exp_after:wN|
-% removes the quark, the delimited argument deals with any braces.
+% First remove the leading quark, then trim spaces off, and finally remove
+% a set of braces.
% \begin{macrocode}
\cs_new_protected:Npn \@@_def:Nn #1#2
- { \tl_set:Nx #1 { \__tl_trim_spaces:nn {#2} \@@_def_aux:n } }
+ {
+ \tl_set:Nx #1
+ { \tl_trim_spaces_apply:oN { \use_none:n #2 } \@@_def_aux:n }
+ }
\cs_new:Npn \@@_def_aux:n #1
- { \exp_after:wN \@@_def_aux:w #1 \q_stop }
+ { \@@_def_aux:w #1 \q_stop }
\cs_new:Npn \@@_def_aux:w #1 \q_stop { \exp_not:n {#1} }
% \end{macrocode}
% \end{macro}
@@ -1295,7 +1303,7 @@
{
\tl_if_empty:NF \l_@@_property_tl
{
- \__kernel_msg_error:nnxx { kernel } { property-unknown }
+ \__kernel_msg_error:nnxx { kernel } { key-property-unknown }
{ \l_@@_property_tl } { \l_keys_path_tl }
}
}
@@ -1314,7 +1322,8 @@
\cs_new_protected:Npn \@@_property_find:n #1
{
\tl_set:Nx \l_@@_property_tl { \@@_remove_spaces:n {#1} }
- \exp_after:wN \@@_property_find:w \l_@@_property_tl . . \q_stop {#1}
+ \exp_after:wN \@@_property_find:w \l_@@_property_tl . .
+ \q_stop {#1}
}
\cs_new_protected:Npn \@@_property_find:w #1 . #2 . #3 \q_stop #4
{
@@ -1373,18 +1382,15 @@
{ \use:c { \c_@@_props_root_tl \l_@@_property_tl } }
{
\__kernel_msg_error:nnxx { kernel }
- { property-requires-value } { \l_@@_property_tl }
+ { key-property-requires-value } { \l_@@_property_tl }
{ \l_keys_path_tl }
}
}
{ \use:c { \c_@@_props_root_tl \l_@@_property_tl } {#1} }
}
-\use:x
- {
- \cs_new:Npn \exp_not:N \__keys_define_code:w
- ##1 \c_colon_str ##2 \exp_not:N \q_stop
- }
- { \tl_if_empty:nTF {#2} }
+\exp_last_unbraced:NNNNo
+ \cs_new:Npn \__keys_define_code:w #1 \c_colon_str #2 \q_stop
+ { \tl_if_empty:nTF {#2} }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1454,7 +1460,10 @@
{ \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl }
{
\str_if_eq_x:nnTF
- { \exp_not:v { \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl } }
+ {
+ \exp_not:v
+ { \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl }
+ }
{ choice }
{
\__kernel_msg_error:nnxx { kernel } { nested-choice-key }
@@ -1466,7 +1475,8 @@
}
\cs_new_protected:Npn \@@_choice_make_aux:N #1
{
- \cs_set_nopar:cpn { \c_@@_type_root_tl \l_keys_path_tl } { choice }
+ \cs_set_nopar:cpn { \c_@@_type_root_tl \l_keys_path_tl }
+ { choice }
\@@_cmd_set:nn { \l_keys_path_tl } { #1 {##1} }
\@@_cmd_set:nn { \l_keys_path_tl / unknown }
{
@@ -1495,7 +1505,8 @@
\clist_map_inline:nn {#2}
{
\int_incr:N \l_keys_choice_int
- \@@_cmd_set:nx { \l_keys_path_tl / \@@_remove_spaces:n {##1} }
+ \@@_cmd_set:nx
+ { \l_keys_path_tl / \@@_remove_spaces:n {##1} }
{
\tl_set:Nn \exp_not:N \l_keys_choice_tl {##1}
\int_set:Nn \exp_not:N \l_keys_choice_int
@@ -1658,7 +1669,8 @@
}
}
{
- \__kernel_msg_error:nnx { kernel } { property-boolean-values-only }
+ \__kernel_msg_error:nnx { kernel }
+ { key-property-boolean-values-only }
{ .value_ #1 :n }
}
}
@@ -2332,7 +2344,8 @@
}
}
{
- \cs_if_exist:cTF { \c_@@_code_root_tl \l_@@_module_tl / unknown }
+ \cs_if_exist:cTF
+ { \c_@@_code_root_tl \l_@@_module_tl / unknown }
{
\cs:w \c_@@_code_root_tl \l_@@_module_tl / unknown
\exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
@@ -2458,7 +2471,10 @@
\exp_args:Nnf \msg_show_item_unbraced:nn { code }
{
\exp_args:Nc \token_get_replacement_spec:N
- { \c_@@_code_root_tl \@@_remove_spaces:n { #2 / #3 } }
+ {
+ \c_@@_code_root_tl
+ \@@_remove_spaces:n { #2 / #3 }
+ }
}
}
}
@@ -2480,15 +2496,6 @@
The~key~'#1'~only~accepts~predefined~values,~
and~'#2'~is~not~one~of~these.
}
-\__kernel_msg_new:nnnn { kernel } { key-no-property }
- { No~property~given~in~definition~of~key~'#1'. }
- {
- \c__msg_coding_error_text_tl
- Inside~\keys_define:nn each~key~name~
- needs~a~property: \\ \\
- \iow_indent:n { #1 .<property> } \\ \\
- LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property.
- }
\__kernel_msg_new:nnnn { kernel } { key-unknown }
{ The~key~'#1'~is~unknown~and~is~being~ignored. }
{
@@ -2501,26 +2508,6 @@
The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~
itself~a~choice.
}
-\__kernel_msg_new:nnnn { kernel } { property-boolean-values-only }
- { The~property~'#1'~accepts~boolean~values~only. }
- {
- \c__msg_coding_error_text_tl
- The~property~'#1'~only~accepts~the~values~'true'~and~'false'.
- }
-\__kernel_msg_new:nnnn { kernel } { property-requires-value }
- { The~property~'#1'~requires~a~value. }
- {
- \c__msg_coding_error_text_tl
- LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\
- No~value~was~given~for~the~property,~and~one~is~required.
- }
-\__kernel_msg_new:nnnn { kernel } { property-unknown }
- { The~key~property~'#1'~is~unknown. }
- {
- \c__msg_coding_error_text_tl
- LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~
- this~property~is~not~defined.
- }
\__kernel_msg_new:nnnn { kernel } { value-forbidden }
{ The~key~'#1'~does~not~take~a~value. }
{
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3luatex.dtx Copyright (C) 2010-2017 The LaTeX3 Project
+%% File: l3luatex.dtx Copyright (C) 2010-2018 The 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
@@ -29,7 +29,7 @@
% \fi
%
% \title{^^A
-% The \pkg{l3luatex} package\\LuaTeX-specific functions^^A
+% The \pkg{l3luatex} package: \LuaTeX-specific functions^^A
% }
%
% \author{^^A
@@ -41,22 +41,20 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
% \begin{documentation}
%
-% \section{Breaking out to \Lua{}}
-%
% The \LuaTeX{} engine provides access to the \Lua{} programming language,
% and with it access to the \enquote{internals} of \TeX{}. In order to use
% this within the framework provided here, a family of functions is
-% available. When used with \pdfTeX{} or \XeTeX{} these raise an
+% available. When used with \pdfTeX{}, \pTeX{}, \upTeX{} or \XeTeX{} these raise an
% error: use \cs{sys_if_engine_luatex:T} to avoid this. Details on using
% \Lua{} with the \LuaTeX{} engine are given in the \LuaTeX{} manual.
%
-% \subsection{\TeX{} code interfaces}
+% \section{Breaking out to \Lua{}}
%
% \begin{function}[EXP, added = 2015-06-29]{\lua_now_x:n, \lua_now:n}
% \begin{syntax}
@@ -123,11 +121,16 @@
% \end{texnote}
% \end{function}
%
-% \subsection{Lua interfaces}
+% \section{Lua interfaces}
%
% As well as interfaces for \TeX{}, there are a small number of Lua functions
-% provided here. Currently these are intended for internal use only.
+% provided here.
%
+% \begin{function}{l3kernel}
+% All public interfaces provided by the module are stored within the
+% |l3kernel| table.
+% \end{function}
+%
% \begin{function}{l3kernel.charcat}
% \begin{syntax}
% |l3kernel.charcat||(|\meta{charcode}, \meta{catcode}|)|
@@ -151,8 +154,12 @@
% |l3kernel.filemoddate||(|\meta{file}|)|
% \end{syntax}
% Returns the of the date/time of last modification of the \meta{file} in the
-% format |D:|\meta{year}\meta{month}\meta{day}\meta{hour}\meta{minute}^^A
-% \meta{second}\meta{offset}, where the latter may be |Z| (UTC) or
+% format
+% \begin{quote}
+% |D:|\meta{year}\meta{month}\meta{day}\meta{hour}\meta{minute}^^A
+% \meta{second}\meta{offset}
+% \end{quote}
+% where the latter may be |Z| (UTC) or
% \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|. If the \meta{file} is
% not found, nothing is returned with \emph{no error raised}.
% \end{function}
@@ -189,6 +196,26 @@
%<*tex>
% \end{macrocode}
%
+% \begin{macrocode}
+%<@@=luatex>
+% \end{macrocode}
+%
+% \begin{macro}[EXP]{\@@_escape_x:n, \@@_now_x:n, \@@_shipout_x:n}
+% Copies of primitives.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_escape_x:n \luatex_luaescapestring:D
+\cs_new_eq:NN \@@_now_x:n \luatex_directlua:D
+\cs_new_eq:NN \@@_shipout_x:n \luatex_latelua:D
+% \end{macrocode}
+% \end{macro}
+%
+% These functions are set up in \pkg{l3str} for bootstrapping: we want to
+% replace them with a \enquote{proper} version at this stage, so clean up.
+% \begin{macrocode}
+\cs_undefine:N \lua_escape_x:n
+\cs_undefine:N \lua_now_x:n
+% \end{macrocode}
+%
% \begin{macro}[EXP]{\lua_now_x:n, \lua_now:n}
% \begin{macro}{\lua_shipout_x:n, \lua_shipout:n}
% \begin{macro}[EXP]{\lua_escape_x:n, \lua_escape:n}
@@ -196,18 +223,22 @@
% these have to be macros, we give them the same status in all cases.
% When \LuaTeX{} is not in use, simply give an error message/
% \begin{macrocode}
-\cs_new:Npn \lua_now_x:n #1 { \luatex_directlua:D {#1} }
+\cs_new:Npn \lua_now_x:n #1 { \@@_now_x:n {#1} }
\cs_new:Npn \lua_now:n #1 { \lua_now_x:n { \exp_not:n {#1} } }
-\cs_new_protected:Npn \lua_shipout_x:n #1 { \luatex_latelua:D {#1} }
+\cs_new_protected:Npn \lua_shipout_x:n #1 { \@@_shiphout_x:n {#1} }
\cs_new_protected:Npn \lua_shipout:n #1
{ \lua_shipout_x:n { \exp_not:n {#1} } }
-\cs_new:Npn \lua_escape_x:n #1 { \luatex_luaescapestring:D {#1} }
+\cs_new:Npn \lua_escape_x:n #1 { \@@_escape_x:n {#1} }
\cs_new:Npn \lua_escape:n #1 { \lua_escape_x:n { \exp_not:n {#1} } }
\sys_if_engine_luatex:F
{
\clist_map_inline:nn
- { \lua_now_x:n , \lua_now:n , \lua_escape_x:n , \lua_escape:n }
{
+ \use_x:n ,
+ \lua_escape_x:n , \lua_escape:n ,
+ \lua_now_x:n , \lua_now:n
+ }
+ {
\cs_set:Npn #1 ##1
{
\__kernel_msg_expandable_error:nnn
@@ -292,7 +323,7 @@
local utf8_char = unicode.utf8.char
% \end{macrocode}
%
-% \begin{macro}{escapehex}
+% \begin{macro}[int]{escapehex}
% An internal auxiliary to convert a string to the matching hex escape.
% This works on a byte basis: extension to handled UTF-8 input is
% covered in \pkg{pdftexcmds} but is not currently required here.
@@ -432,13 +463,17 @@
%<*initex>
% \end{macrocode}
%
+% \begin{macrocode}
+%<@@=alloc>
+% \end{macrocode}
+%
% A small amount of generic code is used by almost all \LuaTeX{} material so
% needs to be loaded by the format.
% \begin{macrocode}
-attribute_count_name = "g__alloc_attribute_int"
-bytecode_count_name = "g__alloc_bytecode_int"
-chunkname_count_name = "g__alloc_chunkname_int"
-whatsit_count_name = "g__alloc_whatsit_int"
+attribute_count_name = "g_@@_attribute_int"
+bytecode_count_name = "g_@@_bytecode_int"
+chunkname_count_name = "g_@@_chunkname_int"
+whatsit_count_name = "g_@@_whatsit_int"
require("ltluatex")
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -524,174 +524,6 @@
% documentation for the latter should be consulted for full details.
% \end{function}
%
-% \section{Kernel-specific functions}
-%
-% Messages from \LaTeX3 itself are handled by the general message system,
-% but have their own functions. This allows some text to be pre-defined,
-% and also ensures that serious errors can be handled properly.
-%
-% \begin{function}[added = 2017-12-17]
-% {\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
-% \begin{syntax}
-% \cs{__kernel_msg_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
-% \end{syntax}
-% Creates a kernel \meta{message} for a given \meta{module}.
-% The message is defined to first give \meta{text} and then
-% \meta{more text} if the user requests it. If no \meta{more text} is
-% available then a standard text is given instead. Within \meta{text}
-% and \meta{more text} four parameters (|#1| to |#4|) can be used:
-% these will be supplied and expanded at the time the message is used.
-% An error is raised if the \meta{message} already exists.
-% \end{function}
-%
-% \begin{function}[added = 2017-12-17]
-% {\__kernel_msg_set:nnnn, \__kernel_msg_set:nnn}
-% \begin{syntax}
-% \cs{__kernel_msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
-% \end{syntax}
-% Sets up the text for a kernel \meta{message} for a given \meta{module}.
-% The message is defined to first give \meta{text} and then
-% \meta{more text} if the user requests it. If no \meta{more text} is
-% available then a standard text is given instead. Within \meta{text}
-% and \meta{more text} four parameters (|#1| to |#4|) can be used:
-% these will be supplied and expanded at the time the message is used.
-% \end{function}
-%
-% \begin{function}[added = 2017-12-17]
-% {
-% \__kernel_msg_fatal:nnnnnn ,
-% \__kernel_msg_fatal:nnnnn ,
-% \__kernel_msg_fatal:nnnn ,
-% \__kernel_msg_fatal:nnn ,
-% \__kernel_msg_fatal:nn ,
-% \__kernel_msg_fatal:nnxxxx ,
-% \__kernel_msg_fatal:nnxxx ,
-% \__kernel_msg_fatal:nnxx ,
-% \__kernel_msg_fatal:nnx
-% }
-% \begin{syntax}
-% \cs{__kernel_msg_fatal:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
-% to \meta{arg four} to the text-creating functions. After issuing a
-% fatal error the \TeX{} run halts. Cannot be redirected.
-% \end{function}
-%
-% \begin{function}[added = 2017-12-17]
-% {
-% \__kernel_msg_error:nnnnnn ,
-% \__kernel_msg_error:nnnnn ,
-% \__kernel_msg_error:nnnn ,
-% \__kernel_msg_error:nnn ,
-% \__kernel_msg_error:nn ,
-% \__kernel_msg_error:nnxxxx ,
-% \__kernel_msg_error:nnxxx ,
-% \__kernel_msg_error:nnxx ,
-% \__kernel_msg_error:nnx
-% }
-% \begin{syntax}
-% \cs{__kernel_msg_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
-% to
-% \meta{arg four} to the text-creating functions. The error
-% stops processing and issues the text at the terminal. After user input,
-% the run continues. Cannot be redirected.
-% \end{function}
-%
-% \begin{function}[added = 2017-12-17]
-% {
-% \__kernel_msg_warning:nnnnnn ,
-% \__kernel_msg_warning:nnnnn ,
-% \__kernel_msg_warning:nnnn ,
-% \__kernel_msg_warning:nnn ,
-% \__kernel_msg_warning:nn ,
-% \__kernel_msg_warning:nnxxxx ,
-% \__kernel_msg_warning:nnxxx ,
-% \__kernel_msg_warning:nnxx ,
-% \__kernel_msg_warning:nnx
-% }
-% \begin{syntax}
-% \cs{__kernel_msg_warning:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues kernel \meta{module} warning \meta{message}, passing
-% \meta{arg one} to
-% \meta{arg four} to the text-creating functions. The warning text
-% is added to the log file, but the \TeX{} run is not interrupted.
-% \end{function}
-%
-% \begin{function}[added = 2017-12-17]
-% {
-% \__kernel_msg_info:nnnnnn ,
-% \__kernel_msg_info:nnnnn ,
-% \__kernel_msg_info:nnnn ,
-% \__kernel_msg_info:nnn ,
-% \__kernel_msg_info:nn ,
-% \__kernel_msg_info:nnxxxx ,
-% \__kernel_msg_info:nnxxx ,
-% \__kernel_msg_info:nnxx ,
-% \__kernel_msg_info:nnx
-% }
-% \begin{syntax}
-% \cs{__kernel_msg_info:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues kernel \meta{module} information \meta{message}, passing
-% \meta{arg one} to \meta{arg four} to the text-creating functions.
-% The information text is added to the log file.
-% \end{function}
-%
-% \section{Expandable errors}
-%
-% In a few places, the \LaTeX3 kernel needs to produce errors in an
-% expansion only context. This must be handled internally very
-% differently from normal error messages, as none of the tools
-% to print to the terminal or the log file are expandable.
-% However, the interface is similar, with the important caveat that the
-% message text and arguments are not expanded, and messages should be
-% very short.
-%
-% \begin{function}[EXP, added = 2017-12-17]
-% {
-% \__kernel_msg_expandable_error:nnnnnn,
-% \__kernel_msg_expandable_error:nnnnn,
-% \__kernel_msg_expandable_error:nnnn,
-% \__kernel_msg_expandable_error:nnn,
-% \__kernel_msg_expandable_error:nn
-% }
-% \begin{syntax}
-% \cs{__kernel_msg_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues an error, passing \meta{arg one} to \meta{arg four}
-% to the text-creating functions. The resulting string must
-% be much shorter than a line, otherwise it is cropped.
-% \end{function}
-%
-% \begin{function}[EXP, added = 2011-08-11, updated = 2011-08-13]
-% {\__msg_expandable_error:n}
-% \begin{syntax}
-% \cs{__msg_expandable_error:n} \Arg{error message}
-% \end{syntax}
-% Issues an \enquote{Undefined error} message from \TeX{} itself,
-% and prints the \meta{error message}. The \meta{error message}
-% must be short: it is cropped at the end of one line.
-% \begin{texnote}
-% This function expands to an empty token list after two steps.
-% Tokens inserted in response to \TeX{}'s prompt are read with
-% the current category code setting, and inserted just after
-% the place where the error message was issued.
-% \end{texnote}
-% \end{function}
-%
-% \section{Internal \pkg{l3msg} functions}
-%
-% \begin{variable}{\c__msg_coding_error_text_tl}
-% The text
-% \begin{verbatim}
-% This is a coding error.
-% \end{verbatim}
-% used by kernel functions when erroneous programming input is encountered.
-% \end{variable}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -747,14 +579,17 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\__chk_if_free_msg:nn}
-% This auxiliary is similar to \cs{__chk_if_free_cs:N}, and is used when
+% \begin{macro}{\@@_chk_if_free:nn}
+% This auxiliary is similar to \cs{__kernel_chk_if_free_cs:N}, and is used when
% defining messages with \cs{msg_new:nnnn}.
% \begin{macrocode}
\__kernel_patch:nnNNpn { }
- { \__kernel_debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
-\cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
{
+ \__kernel_debug_log:x
+ { Defining~message~ #1 / #2 ~\msg_line_context: }
+ }
+\cs_new_protected:Npn \@@_chk_free:nn #1#2
+ {
\msg_if_exist:nnT {#1} {#2}
{
\__kernel_msg_error:nnxx { kernel } { message-already-defined }
@@ -772,7 +607,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \msg_new:nnnn #1#2
{
- \__chk_if_free_msg:nn {#1} {#2}
+ \@@_chk_free:nn {#1} {#2}
\msg_gset:nnnn {#1} {#2}
}
\cs_new_protected:Npn \msg_new:nnn #1#2#3
@@ -932,7 +767,7 @@
% inserted by typing |I| in the command-line are inserted after
% the message is entirely cleaned up.
%
-% The \cs{__iow_with:Nnn} auxiliary, defined in \pkg{l3file}, expects
+% The \cs{__kernel_iow_with:Nnn} auxiliary, defined in \pkg{l3file}, expects
% an \meta{integer variable}, an integer \meta{value}, and some
% \meta{code}. It runs the \meta{code} after ensuring that the
% \meta{integer variable} takes the given \meta{value}, then restores
@@ -961,9 +796,9 @@
\iow_newline:
!
}
- \__iow_with:Nnn \tex_newlinechar:D { `\^^J }
+ \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
{
- \__iow_with:Nnn \tex_errorcontextlines:D { -1 }
+ \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
{
\group_begin:
\cs_set_protected:Npn &
@@ -1316,7 +1151,7 @@
% \msg_show:nnxx ,
% \msg_show:nnx
% }
-% \begin{macro}[aux]{\@@_show:n, \@@_show:w, \@@_show_dot:w, \@@_show:nn}
+% \begin{macro}{\@@_show:n, \@@_show:w, \@@_show_dot:w, \@@_show:nn}
% The \texttt{show} message type is used for \cs{seq_show:N} and
% similar complicated data structures. Wrap the given text with a
% trailing dot (important later) then pass it to \cs{@@_show:n}. If
@@ -1353,9 +1188,9 @@
\tl_if_empty:nF {#1}
{ \exp_args:No \iow_term:n { \use_none:n #1 } }
\tl_set:Nn \l_@@_internal_tl {#2}
- \__iow_with:Nnn \tex_newlinechar:D { 10 }
+ \__kernel_iow_with:Nnn \tex_newlinechar:D { 10 }
{
- \__iow_with:Nnn \tex_errorcontextlines:D { -1 }
+ \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
{
\etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
{ \exp_after:wN \l_@@_internal_tl }
@@ -1400,8 +1235,8 @@
% \end{variable}
%
% \begin{variable}{\l_@@_hierarchy_seq}
-% During redirection, split the message name into a sequence with
-% items |{/module/submodule}|, |{/module}|, and |{}|.
+% During redirection, split the message name into a sequence:
+% |{/module/submodule}|, |{/module}|, and |{}|.
% \begin{macrocode}
\seq_new:N \l_@@_hierarchy_seq
% \end{macrocode}
@@ -1426,9 +1261,13 @@
% assignment to \cs{@@_use_code:} is similar to \cs{tl_set:Nn}.
% The message is eventually produced with whatever \cs{l_@@_class_tl}
% is when \cs{@@_use_code:} is called.
+% Here is also a good place to suppress tracing output if the
+% \pkg{trace} package is loaded since all (non-expandable) messages go
+% through this auxiliary.
% \begin{macrocode}
\cs_new_protected:Npn \@@_use:nnnnnnn #1#2#3#4#5#6#7
{
+%<package> \use:c { conditionally at traceoff }
\msg_if_exist:nnTF {#2} {#3}
{
\@@_class_chk_exist:nT {#1}
@@ -1446,12 +1285,14 @@
}
}
{ \__kernel_msg_error:nnxx { kernel } { message-unknown } {#2} {#3} }
+%<package> \use:c { conditionally at traceon }
}
\cs_new_protected:Npn \@@_use_code: { }
% \end{macrocode}
% The first check is for a individual message redirection. If this
% applies then no further redirection is attempted. Otherwise, split
-% the message name into \texttt{module/submodule/message} (with an
+% the message name into \meta{module}, \meta{submodule} and \meta{message}
+% (with an
% arbitrary number of slashes), and store |{/module/submodule}|,
% |{/module}| and |{}| into \cs{l_@@_hierarchy_seq}. We then
% map through this sequence, applying the most specific redirection.
@@ -1793,7 +1634,8 @@
}
% \end{macrocode}
%
-% Messages for earlier kernel modules.
+% Messages for earlier kernel modules plus a few for \pkg{l3keys} which
+% cover coding errors.
% \begin{macrocode}
\__kernel_msg_new:nnnn { kernel } { bad-number-of-arguments }
{ Function~'#1'~cannot~be~defined~with~#2~arguments. }
@@ -1885,6 +1727,8 @@
LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~
Only~expandable~tests~can~have~a~predicate~version.
}
+\__kernel_msg_new:nnn { kernel } { randint-backward-range }
+ { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. }
\__kernel_msg_new:nnnn { kernel } { conditional-form-unknown }
{ Conditional~form~'#1'~for~function~'#2'~unknown. }
{
@@ -1892,6 +1736,35 @@
LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
}
+\__kernel_msg_new:nnnn { kernel } { key-no-property }
+ { No~property~given~in~definition~of~key~'#1'. }
+ {
+ \c_@@_coding_error_text_tl
+ Inside~\keys_define:nn each~key~name~
+ needs~a~property: \\ \\
+ \iow_indent:n { #1 .<property> } \\ \\
+ LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property.
+ }
+\__kernel_msg_new:nnnn { kernel } { key-property-boolean-values-only }
+ { The~property~'#1'~accepts~boolean~values~only. }
+ {
+ \c_@@_coding_error_text_tl
+ The~property~'#1'~only~accepts~the~values~'true'~and~'false'.
+ }
+\__kernel_msg_new:nnnn { kernel } { key-property-requires-value }
+ { The~property~'#1'~requires~a~value. }
+ {
+ \c_@@_coding_error_text_tl
+ LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\
+ No~value~was~given~for~the~property,~and~one~is~required.
+ }
+\__kernel_msg_new:nnnn { kernel } { key-property-unknown }
+ { The~key~property~'#1'~is~unknown. }
+ {
+ \c_@@_coding_error_text_tl
+ LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~
+ this~property~is~not~defined.
+ }
\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined }
{ Scan~mark~#1~already~defined. }
{
@@ -1922,6 +1795,14 @@
with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~
from~type~'#3'~to~type~'#4'.
}
+\__kernel_msg_new:nnnn { kernel } { invalid-exp-args }
+ { Invalid~variant~specifier~'#1'~in~'#2'. }
+ {
+ \c_@@_coding_error_text_tl
+ LaTeX~has~been~asked~to~create~an~\iow_char:N\\exp_args:N...~
+ function~with~signature~'N#2'~but~'#1'~is~not~a~valid~argument~
+ specifier.
+ }
\__kernel_msg_new:nnn { kernel } { deprecated-variant }
{
Variant~form~'#1'~deprecated~for~base~form~'#2'.~
@@ -1941,7 +1822,7 @@
% In format mode the error is somewhat different.
% \begin{macrocode}
%<*package>
-\bool_if:NTF \l at expl@enable at debug@bool
+\__kernel_if_debug:TF
{
\__kernel_msg_new:nnnn { kernel } { debug }
{ The~debugging~option~'#1'~does~not~exist~\msg_line_context:. }
@@ -1955,14 +1836,19 @@
{ Inconsistent~local/global~assignment }
{
\c_@@_coding_error_text_tl
- \if:w l #2 Local \else: Global \fi: \
+ \if:w l #2 Local \else: Global \fi: \ %
assignment~to~a~
- \if:w l #1 local \else: \if:w g #1 global \else: constant \fi: \fi: \
+ \if:w l #1 local
+ \else:
+ \if:w g #1 global \else: constant \fi:
+ \fi:
+ \ %
variable~'#3'.
}
\__kernel_msg_new:nnnn { kernel } { non-declared-variable }
{ The~variable~#1~has~not~been~declared~\msg_line_context:. }
{
+ \c_@@_coding_error_text_tl
Checking~is~active,~and~you~have~tried~do~so~something~like: \\
\ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\
without~first~having: \\
@@ -2103,10 +1989,14 @@
% \__kernel_msg_expandable_error:nnnnn,
% \__kernel_msg_expandable_error:nnnn,
% \__kernel_msg_expandable_error:nnn,
-% \__kernel_msg_expandable_error:nn
+% \__kernel_msg_expandable_error:nn,
+% \__kernel_msg_expandable_error:nnffff,
+% \__kernel_msg_expandable_error:nnfff,
+% \__kernel_msg_expandable_error:nnff,
+% \__kernel_msg_expandable_error:nnf,
% }
% The command built from the csname
-% |\c_@@_text_prefix_tl LaTeX / #1 / #2|
+% \cs{c_@@_text_prefix_tl} |LaTeX / #1 / #2|
% takes four arguments and builds the error text, which is fed to
% \cs{@@_expandable_error:n}.
% \begin{macrocode}
@@ -2139,6 +2029,10 @@
\__kernel_msg_expandable_error:nnnnnn
{#1} {#2} { } { } { } { }
}
+\cs_generate_variant:Nn \__kernel_msg_expandable_error:nnnnnn { nnffff }
+\cs_generate_variant:Nn \__kernel_msg_expandable_error:nnnnn { nnfff }
+\cs_generate_variant:Nn \__kernel_msg_expandable_error:nnnn { nnff }
+\cs_generate_variant:Nn \__kernel_msg_expandable_error:nnn { nnf }
% \end{macrocode}
% \end{macro}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -71,8 +71,8 @@
% \item[{\cs[no-index]{xetex_\ldots}}] Introduced by \XeTeX{};
% \item[{\cs[no-index]{luatex_\ldots}}] Introduced by \LuaTeX{};
% \item[{\cs[no-index]{utex_\ldots}}] Introduced by \XeTeX{} and \LuaTeX{};
-% \item[{\cs[no-index]{ptex_\ldots}}] Introduced by p\TeX{};
-% \item[{\cs[no-index]{uptex_\ldots}}] Introduced by up\TeX{}.
+% \item[{\cs[no-index]{ptex_\ldots}}] Introduced by \pTeX{};
+% \item[{\cs[no-index]{uptex_\ldots}}] Introduced by \upTeX{}.
% \end{itemize}
%
% \end{documentation}
@@ -95,12 +95,6 @@
% names. In format mode, it also deletes all of the existing names (although
% some do come back later).
%
-% \begin{macro}{\tex_undefined:D}
-% This function does not exist at all, but is the name used by the
-% plain \TeX{} format for an undefined function. So it should
-% be marked here as \enquote{taken}.
-% \end{macro}
-%
% The \tn{let} primitive is renamed by hand first as it is essential for
% the entire process to follow. This also uses \tn{global}, as that way
% we avoid leaving an unneeded csname in the hash table.
@@ -141,406 +135,407 @@
% These are given modified new names, so that they may be entered
% without catcode tricks.
% \begin{macrocode}
- \@@_primitive:NN \ \tex_space:D
- \@@_primitive:NN \/ \tex_italiccorrection:D
- \@@_primitive:NN \- \tex_hyphen:D
+ \@@_primitive:NN \ \tex_space:D
+ \@@_primitive:NN \/ \tex_italiccorrection:D
+ \@@_primitive:NN \- \tex_hyphen:D
% \end{macrocode}
%
% Now all the other primitives.
% \begin{macrocode}
- \@@_primitive:NN \above \tex_above:D
- \@@_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D
- \@@_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D
- \@@_primitive:NN \abovewithdelims \tex_abovewithdelims:D
- \@@_primitive:NN \accent \tex_accent:D
- \@@_primitive:NN \adjdemerits \tex_adjdemerits:D
- \@@_primitive:NN \advance \tex_advance:D
- \@@_primitive:NN \afterassignment \tex_afterassignment:D
- \@@_primitive:NN \aftergroup \tex_aftergroup:D
- \@@_primitive:NN \atop \tex_atop:D
- \@@_primitive:NN \atopwithdelims \tex_atopwithdelims:D
- \@@_primitive:NN \badness \tex_badness:D
- \@@_primitive:NN \baselineskip \tex_baselineskip:D
- \@@_primitive:NN \batchmode \tex_batchmode:D
- \@@_primitive:NN \begingroup \tex_begingroup:D
- \@@_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D
- \@@_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D
- \@@_primitive:NN \binoppenalty \tex_binoppenalty:D
- \@@_primitive:NN \botmark \tex_botmark:D
- \@@_primitive:NN \box \tex_box:D
- \@@_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D
- \@@_primitive:NN \brokenpenalty \tex_brokenpenalty:D
- \@@_primitive:NN \catcode \tex_catcode:D
- \@@_primitive:NN \char \tex_char:D
- \@@_primitive:NN \chardef \tex_chardef:D
- \@@_primitive:NN \cleaders \tex_cleaders:D
- \@@_primitive:NN \closein \tex_closein:D
- \@@_primitive:NN \closeout \tex_closeout:D
- \@@_primitive:NN \clubpenalty \tex_clubpenalty:D
- \@@_primitive:NN \copy \tex_copy:D
- \@@_primitive:NN \count \tex_count:D
- \@@_primitive:NN \countdef \tex_countdef:D
- \@@_primitive:NN \cr \tex_cr:D
- \@@_primitive:NN \crcr \tex_crcr:D
- \@@_primitive:NN \csname \tex_csname:D
- \@@_primitive:NN \day \tex_day:D
- \@@_primitive:NN \deadcycles \tex_deadcycles:D
- \@@_primitive:NN \def \tex_def:D
- \@@_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D
- \@@_primitive:NN \defaultskewchar \tex_defaultskewchar:D
- \@@_primitive:NN \delcode \tex_delcode:D
- \@@_primitive:NN \delimiter \tex_delimiter:D
- \@@_primitive:NN \delimiterfactor \tex_delimiterfactor:D
- \@@_primitive:NN \delimitershortfall \tex_delimitershortfall:D
- \@@_primitive:NN \dimen \tex_dimen:D
- \@@_primitive:NN \dimendef \tex_dimendef:D
- \@@_primitive:NN \discretionary \tex_discretionary:D
- \@@_primitive:NN \displayindent \tex_displayindent:D
- \@@_primitive:NN \displaylimits \tex_displaylimits:D
- \@@_primitive:NN \displaystyle \tex_displaystyle:D
- \@@_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D
- \@@_primitive:NN \displaywidth \tex_displaywidth:D
- \@@_primitive:NN \divide \tex_divide:D
- \@@_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D
- \@@_primitive:NN \dp \tex_dp:D
- \@@_primitive:NN \dump \tex_dump:D
- \@@_primitive:NN \edef \tex_edef:D
- \@@_primitive:NN \else \tex_else:D
- \@@_primitive:NN \emergencystretch \tex_emergencystretch:D
- \@@_primitive:NN \end \tex_end:D
- \@@_primitive:NN \endcsname \tex_endcsname:D
- \@@_primitive:NN \endgroup \tex_endgroup:D
- \@@_primitive:NN \endinput \tex_endinput:D
- \@@_primitive:NN \endlinechar \tex_endlinechar:D
- \@@_primitive:NN \eqno \tex_eqno:D
- \@@_primitive:NN \errhelp \tex_errhelp:D
- \@@_primitive:NN \errmessage \tex_errmessage:D
- \@@_primitive:NN \errorcontextlines \tex_errorcontextlines:D
- \@@_primitive:NN \errorstopmode \tex_errorstopmode:D
- \@@_primitive:NN \escapechar \tex_escapechar:D
- \@@_primitive:NN \everycr \tex_everycr:D
- \@@_primitive:NN \everydisplay \tex_everydisplay:D
- \@@_primitive:NN \everyhbox \tex_everyhbox:D
- \@@_primitive:NN \everyjob \tex_everyjob:D
- \@@_primitive:NN \everymath \tex_everymath:D
- \@@_primitive:NN \everypar \tex_everypar:D
- \@@_primitive:NN \everyvbox \tex_everyvbox:D
- \@@_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D
- \@@_primitive:NN \expandafter \tex_expandafter:D
- \@@_primitive:NN \fam \tex_fam:D
- \@@_primitive:NN \fi \tex_fi:D
- \@@_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D
- \@@_primitive:NN \firstmark \tex_firstmark:D
- \@@_primitive:NN \floatingpenalty \tex_floatingpenalty:D
- \@@_primitive:NN \font \tex_font:D
- \@@_primitive:NN \fontdimen \tex_fontdimen:D
- \@@_primitive:NN \fontname \tex_fontname:D
- \@@_primitive:NN \futurelet \tex_futurelet:D
- \@@_primitive:NN \gdef \tex_gdef:D
- \@@_primitive:NN \global \tex_global:D
- \@@_primitive:NN \globaldefs \tex_globaldefs:D
- \@@_primitive:NN \halign \tex_halign:D
- \@@_primitive:NN \hangafter \tex_hangafter:D
- \@@_primitive:NN \hangindent \tex_hangindent:D
- \@@_primitive:NN \hbadness \tex_hbadness:D
- \@@_primitive:NN \hbox \tex_hbox:D
- \@@_primitive:NN \hfil \tex_hfil:D
- \@@_primitive:NN \hfill \tex_hfill:D
- \@@_primitive:NN \hfilneg \tex_hfilneg:D
- \@@_primitive:NN \hfuzz \tex_hfuzz:D
- \@@_primitive:NN \hoffset \tex_hoffset:D
- \@@_primitive:NN \holdinginserts \tex_holdinginserts:D
- \@@_primitive:NN \hrule \tex_hrule:D
- \@@_primitive:NN \hsize \tex_hsize:D
- \@@_primitive:NN \hskip \tex_hskip:D
- \@@_primitive:NN \hss \tex_hss:D
- \@@_primitive:NN \ht \tex_ht:D
- \@@_primitive:NN \hyphenation \tex_hyphenation:D
- \@@_primitive:NN \hyphenchar \tex_hyphenchar:D
- \@@_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D
- \@@_primitive:NN \if \tex_if:D
- \@@_primitive:NN \ifcase \tex_ifcase:D
- \@@_primitive:NN \ifcat \tex_ifcat:D
- \@@_primitive:NN \ifdim \tex_ifdim:D
- \@@_primitive:NN \ifeof \tex_ifeof:D
- \@@_primitive:NN \iffalse \tex_iffalse:D
- \@@_primitive:NN \ifhbox \tex_ifhbox:D
- \@@_primitive:NN \ifhmode \tex_ifhmode:D
- \@@_primitive:NN \ifinner \tex_ifinner:D
- \@@_primitive:NN \ifmmode \tex_ifmmode:D
- \@@_primitive:NN \ifnum \tex_ifnum:D
- \@@_primitive:NN \ifodd \tex_ifodd:D
- \@@_primitive:NN \iftrue \tex_iftrue:D
- \@@_primitive:NN \ifvbox \tex_ifvbox:D
- \@@_primitive:NN \ifvmode \tex_ifvmode:D
- \@@_primitive:NN \ifvoid \tex_ifvoid:D
- \@@_primitive:NN \ifx \tex_ifx:D
- \@@_primitive:NN \ignorespaces \tex_ignorespaces:D
- \@@_primitive:NN \immediate \tex_immediate:D
- \@@_primitive:NN \indent \tex_indent:D
- \@@_primitive:NN \input \tex_input:D
- \@@_primitive:NN \inputlineno \tex_inputlineno:D
- \@@_primitive:NN \insert \tex_insert:D
- \@@_primitive:NN \insertpenalties \tex_insertpenalties:D
- \@@_primitive:NN \interlinepenalty \tex_interlinepenalty:D
- \@@_primitive:NN \jobname \tex_jobname:D
- \@@_primitive:NN \kern \tex_kern:D
- \@@_primitive:NN \language \tex_language:D
- \@@_primitive:NN \lastbox \tex_lastbox:D
- \@@_primitive:NN \lastkern \tex_lastkern:D
- \@@_primitive:NN \lastpenalty \tex_lastpenalty:D
- \@@_primitive:NN \lastskip \tex_lastskip:D
- \@@_primitive:NN \lccode \tex_lccode:D
- \@@_primitive:NN \leaders \tex_leaders:D
- \@@_primitive:NN \left \tex_left:D
- \@@_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D
- \@@_primitive:NN \leftskip \tex_leftskip:D
- \@@_primitive:NN \leqno \tex_leqno:D
- \@@_primitive:NN \let \tex_let:D
- \@@_primitive:NN \limits \tex_limits:D
- \@@_primitive:NN \linepenalty \tex_linepenalty:D
- \@@_primitive:NN \lineskip \tex_lineskip:D
- \@@_primitive:NN \lineskiplimit \tex_lineskiplimit:D
- \@@_primitive:NN \long \tex_long:D
- \@@_primitive:NN \looseness \tex_looseness:D
- \@@_primitive:NN \lower \tex_lower:D
- \@@_primitive:NN \lowercase \tex_lowercase:D
- \@@_primitive:NN \mag \tex_mag:D
- \@@_primitive:NN \mark \tex_mark:D
- \@@_primitive:NN \mathaccent \tex_mathaccent:D
- \@@_primitive:NN \mathbin \tex_mathbin:D
- \@@_primitive:NN \mathchar \tex_mathchar:D
- \@@_primitive:NN \mathchardef \tex_mathchardef:D
- \@@_primitive:NN \mathchoice \tex_mathchoice:D
- \@@_primitive:NN \mathclose \tex_mathclose:D
- \@@_primitive:NN \mathcode \tex_mathcode:D
- \@@_primitive:NN \mathinner \tex_mathinner:D
- \@@_primitive:NN \mathop \tex_mathop:D
- \@@_primitive:NN \mathopen \tex_mathopen:D
- \@@_primitive:NN \mathord \tex_mathord:D
- \@@_primitive:NN \mathpunct \tex_mathpunct:D
- \@@_primitive:NN \mathrel \tex_mathrel:D
- \@@_primitive:NN \mathsurround \tex_mathsurround:D
- \@@_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D
- \@@_primitive:NN \maxdepth \tex_maxdepth:D
- \@@_primitive:NN \meaning \tex_meaning:D
- \@@_primitive:NN \medmuskip \tex_medmuskip:D
- \@@_primitive:NN \message \tex_message:D
- \@@_primitive:NN \mkern \tex_mkern:D
- \@@_primitive:NN \month \tex_month:D
- \@@_primitive:NN \moveleft \tex_moveleft:D
- \@@_primitive:NN \moveright \tex_moveright:D
- \@@_primitive:NN \mskip \tex_mskip:D
- \@@_primitive:NN \multiply \tex_multiply:D
- \@@_primitive:NN \muskip \tex_muskip:D
- \@@_primitive:NN \muskipdef \tex_muskipdef:D
- \@@_primitive:NN \newlinechar \tex_newlinechar:D
- \@@_primitive:NN \noalign \tex_noalign:D
- \@@_primitive:NN \noboundary \tex_noboundary:D
- \@@_primitive:NN \noexpand \tex_noexpand:D
- \@@_primitive:NN \noindent \tex_noindent:D
- \@@_primitive:NN \nolimits \tex_nolimits:D
- \@@_primitive:NN \nonscript \tex_nonscript:D
- \@@_primitive:NN \nonstopmode \tex_nonstopmode:D
- \@@_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D
- \@@_primitive:NN \nullfont \tex_nullfont:D
- \@@_primitive:NN \number \tex_number:D
- \@@_primitive:NN \omit \tex_omit:D
- \@@_primitive:NN \openin \tex_openin:D
- \@@_primitive:NN \openout \tex_openout:D
- \@@_primitive:NN \or \tex_or:D
- \@@_primitive:NN \outer \tex_outer:D
- \@@_primitive:NN \output \tex_output:D
- \@@_primitive:NN \outputpenalty \tex_outputpenalty:D
- \@@_primitive:NN \over \tex_over:D
- \@@_primitive:NN \overfullrule \tex_overfullrule:D
- \@@_primitive:NN \overline \tex_overline:D
- \@@_primitive:NN \overwithdelims \tex_overwithdelims:D
- \@@_primitive:NN \pagedepth \tex_pagedepth:D
- \@@_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D
- \@@_primitive:NN \pagefillstretch \tex_pagefillstretch:D
- \@@_primitive:NN \pagefilstretch \tex_pagefilstretch:D
- \@@_primitive:NN \pagegoal \tex_pagegoal:D
- \@@_primitive:NN \pageshrink \tex_pageshrink:D
- \@@_primitive:NN \pagestretch \tex_pagestretch:D
- \@@_primitive:NN \pagetotal \tex_pagetotal:D
- \@@_primitive:NN \par \tex_par:D
- \@@_primitive:NN \parfillskip \tex_parfillskip:D
- \@@_primitive:NN \parindent \tex_parindent:D
- \@@_primitive:NN \parshape \tex_parshape:D
- \@@_primitive:NN \parskip \tex_parskip:D
- \@@_primitive:NN \patterns \tex_patterns:D
- \@@_primitive:NN \pausing \tex_pausing:D
- \@@_primitive:NN \penalty \tex_penalty:D
- \@@_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D
- \@@_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D
- \@@_primitive:NN \predisplaysize \tex_predisplaysize:D
- \@@_primitive:NN \pretolerance \tex_pretolerance:D
- \@@_primitive:NN \prevdepth \tex_prevdepth:D
- \@@_primitive:NN \prevgraf \tex_prevgraf:D
- \@@_primitive:NN \radical \tex_radical:D
- \@@_primitive:NN \raise \tex_raise:D
- \@@_primitive:NN \read \tex_read:D
- \@@_primitive:NN \relax \tex_relax:D
- \@@_primitive:NN \relpenalty \tex_relpenalty:D
- \@@_primitive:NN \right \tex_right:D
- \@@_primitive:NN \righthyphenmin \tex_righthyphenmin:D
- \@@_primitive:NN \rightskip \tex_rightskip:D
- \@@_primitive:NN \romannumeral \tex_romannumeral:D
- \@@_primitive:NN \scriptfont \tex_scriptfont:D
- \@@_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D
- \@@_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D
- \@@_primitive:NN \scriptspace \tex_scriptspace:D
- \@@_primitive:NN \scriptstyle \tex_scriptstyle:D
- \@@_primitive:NN \scrollmode \tex_scrollmode:D
- \@@_primitive:NN \setbox \tex_setbox:D
- \@@_primitive:NN \setlanguage \tex_setlanguage:D
- \@@_primitive:NN \sfcode \tex_sfcode:D
- \@@_primitive:NN \shipout \tex_shipout:D
- \@@_primitive:NN \show \tex_show:D
- \@@_primitive:NN \showbox \tex_showbox:D
- \@@_primitive:NN \showboxbreadth \tex_showboxbreadth:D
- \@@_primitive:NN \showboxdepth \tex_showboxdepth:D
- \@@_primitive:NN \showlists \tex_showlists:D
- \@@_primitive:NN \showthe \tex_showthe:D
- \@@_primitive:NN \skewchar \tex_skewchar:D
- \@@_primitive:NN \skip \tex_skip:D
- \@@_primitive:NN \skipdef \tex_skipdef:D
- \@@_primitive:NN \spacefactor \tex_spacefactor:D
- \@@_primitive:NN \spaceskip \tex_spaceskip:D
- \@@_primitive:NN \span \tex_span:D
- \@@_primitive:NN \special \tex_special:D
- \@@_primitive:NN \splitbotmark \tex_splitbotmark:D
- \@@_primitive:NN \splitfirstmark \tex_splitfirstmark:D
- \@@_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D
- \@@_primitive:NN \splittopskip \tex_splittopskip:D
- \@@_primitive:NN \string \tex_string:D
- \@@_primitive:NN \tabskip \tex_tabskip:D
- \@@_primitive:NN \textfont \tex_textfont:D
- \@@_primitive:NN \textstyle \tex_textstyle:D
- \@@_primitive:NN \the \tex_the:D
- \@@_primitive:NN \thickmuskip \tex_thickmuskip:D
- \@@_primitive:NN \thinmuskip \tex_thinmuskip:D
- \@@_primitive:NN \time \tex_time:D
- \@@_primitive:NN \toks \tex_toks:D
- \@@_primitive:NN \toksdef \tex_toksdef:D
- \@@_primitive:NN \tolerance \tex_tolerance:D
- \@@_primitive:NN \topmark \tex_topmark:D
- \@@_primitive:NN \topskip \tex_topskip:D
- \@@_primitive:NN \tracingcommands \tex_tracingcommands:D
- \@@_primitive:NN \tracinglostchars \tex_tracinglostchars:D
- \@@_primitive:NN \tracingmacros \tex_tracingmacros:D
- \@@_primitive:NN \tracingonline \tex_tracingonline:D
- \@@_primitive:NN \tracingoutput \tex_tracingoutput:D
- \@@_primitive:NN \tracingpages \tex_tracingpages:D
- \@@_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D
- \@@_primitive:NN \tracingrestores \tex_tracingrestores:D
- \@@_primitive:NN \tracingstats \tex_tracingstats:D
- \@@_primitive:NN \uccode \tex_uccode:D
- \@@_primitive:NN \uchyph \tex_uchyph:D
- \@@_primitive:NN \underline \tex_underline:D
- \@@_primitive:NN \unhbox \tex_unhbox:D
- \@@_primitive:NN \unhcopy \tex_unhcopy:D
- \@@_primitive:NN \unkern \tex_unkern:D
- \@@_primitive:NN \unpenalty \tex_unpenalty:D
- \@@_primitive:NN \unskip \tex_unskip:D
- \@@_primitive:NN \unvbox \tex_unvbox:D
- \@@_primitive:NN \unvcopy \tex_unvcopy:D
- \@@_primitive:NN \uppercase \tex_uppercase:D
- \@@_primitive:NN \vadjust \tex_vadjust:D
- \@@_primitive:NN \valign \tex_valign:D
- \@@_primitive:NN \vbadness \tex_vbadness:D
- \@@_primitive:NN \vbox \tex_vbox:D
- \@@_primitive:NN \vcenter \tex_vcenter:D
- \@@_primitive:NN \vfil \tex_vfil:D
- \@@_primitive:NN \vfill \tex_vfill:D
- \@@_primitive:NN \vfilneg \tex_vfilneg:D
- \@@_primitive:NN \vfuzz \tex_vfuzz:D
- \@@_primitive:NN \voffset \tex_voffset:D
- \@@_primitive:NN \vrule \tex_vrule:D
- \@@_primitive:NN \vsize \tex_vsize:D
- \@@_primitive:NN \vskip \tex_vskip:D
- \@@_primitive:NN \vsplit \tex_vsplit:D
- \@@_primitive:NN \vss \tex_vss:D
- \@@_primitive:NN \vtop \tex_vtop:D
- \@@_primitive:NN \wd \tex_wd:D
- \@@_primitive:NN \widowpenalty \tex_widowpenalty:D
- \@@_primitive:NN \write \tex_write:D
- \@@_primitive:NN \xdef \tex_xdef:D
- \@@_primitive:NN \xleaders \tex_xleaders:D
- \@@_primitive:NN \xspaceskip \tex_xspaceskip:D
- \@@_primitive:NN \year \tex_year:D
+ \@@_primitive:NN \above \tex_above:D
+ \@@_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D
+ \@@_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D
+ \@@_primitive:NN \abovewithdelims \tex_abovewithdelims:D
+ \@@_primitive:NN \accent \tex_accent:D
+ \@@_primitive:NN \adjdemerits \tex_adjdemerits:D
+ \@@_primitive:NN \advance \tex_advance:D
+ \@@_primitive:NN \afterassignment \tex_afterassignment:D
+ \@@_primitive:NN \aftergroup \tex_aftergroup:D
+ \@@_primitive:NN \atop \tex_atop:D
+ \@@_primitive:NN \atopwithdelims \tex_atopwithdelims:D
+ \@@_primitive:NN \badness \tex_badness:D
+ \@@_primitive:NN \baselineskip \tex_baselineskip:D
+ \@@_primitive:NN \batchmode \tex_batchmode:D
+ \@@_primitive:NN \begingroup \tex_begingroup:D
+ \@@_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D
+ \@@_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D
+ \@@_primitive:NN \binoppenalty \tex_binoppenalty:D
+ \@@_primitive:NN \botmark \tex_botmark:D
+ \@@_primitive:NN \box \tex_box:D
+ \@@_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D
+ \@@_primitive:NN \brokenpenalty \tex_brokenpenalty:D
+ \@@_primitive:NN \catcode \tex_catcode:D
+ \@@_primitive:NN \char \tex_char:D
+ \@@_primitive:NN \chardef \tex_chardef:D
+ \@@_primitive:NN \cleaders \tex_cleaders:D
+ \@@_primitive:NN \closein \tex_closein:D
+ \@@_primitive:NN \closeout \tex_closeout:D
+ \@@_primitive:NN \clubpenalty \tex_clubpenalty:D
+ \@@_primitive:NN \copy \tex_copy:D
+ \@@_primitive:NN \count \tex_count:D
+ \@@_primitive:NN \countdef \tex_countdef:D
+ \@@_primitive:NN \cr \tex_cr:D
+ \@@_primitive:NN \crcr \tex_crcr:D
+ \@@_primitive:NN \csname \tex_csname:D
+ \@@_primitive:NN \day \tex_day:D
+ \@@_primitive:NN \deadcycles \tex_deadcycles:D
+ \@@_primitive:NN \def \tex_def:D
+ \@@_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D
+ \@@_primitive:NN \defaultskewchar \tex_defaultskewchar:D
+ \@@_primitive:NN \delcode \tex_delcode:D
+ \@@_primitive:NN \delimiter \tex_delimiter:D
+ \@@_primitive:NN \delimiterfactor \tex_delimiterfactor:D
+ \@@_primitive:NN \delimitershortfall \tex_delimitershortfall:D
+ \@@_primitive:NN \dimen \tex_dimen:D
+ \@@_primitive:NN \dimendef \tex_dimendef:D
+ \@@_primitive:NN \discretionary \tex_discretionary:D
+ \@@_primitive:NN \displayindent \tex_displayindent:D
+ \@@_primitive:NN \displaylimits \tex_displaylimits:D
+ \@@_primitive:NN \displaystyle \tex_displaystyle:D
+ \@@_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D
+ \@@_primitive:NN \displaywidth \tex_displaywidth:D
+ \@@_primitive:NN \divide \tex_divide:D
+ \@@_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D
+ \@@_primitive:NN \dp \tex_dp:D
+ \@@_primitive:NN \dump \tex_dump:D
+ \@@_primitive:NN \edef \tex_edef:D
+ \@@_primitive:NN \else \tex_else:D
+ \@@_primitive:NN \emergencystretch \tex_emergencystretch:D
+ \@@_primitive:NN \end \tex_end:D
+ \@@_primitive:NN \endcsname \tex_endcsname:D
+ \@@_primitive:NN \endgroup \tex_endgroup:D
+ \@@_primitive:NN \endinput \tex_endinput:D
+ \@@_primitive:NN \endlinechar \tex_endlinechar:D
+ \@@_primitive:NN \eqno \tex_eqno:D
+ \@@_primitive:NN \errhelp \tex_errhelp:D
+ \@@_primitive:NN \errmessage \tex_errmessage:D
+ \@@_primitive:NN \errorcontextlines \tex_errorcontextlines:D
+ \@@_primitive:NN \errorstopmode \tex_errorstopmode:D
+ \@@_primitive:NN \escapechar \tex_escapechar:D
+ \@@_primitive:NN \everycr \tex_everycr:D
+ \@@_primitive:NN \everydisplay \tex_everydisplay:D
+ \@@_primitive:NN \everyhbox \tex_everyhbox:D
+ \@@_primitive:NN \everyjob \tex_everyjob:D
+ \@@_primitive:NN \everymath \tex_everymath:D
+ \@@_primitive:NN \everypar \tex_everypar:D
+ \@@_primitive:NN \everyvbox \tex_everyvbox:D
+ \@@_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D
+ \@@_primitive:NN \expandafter \tex_expandafter:D
+ \@@_primitive:NN \fam \tex_fam:D
+ \@@_primitive:NN \fi \tex_fi:D
+ \@@_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D
+ \@@_primitive:NN \firstmark \tex_firstmark:D
+ \@@_primitive:NN \floatingpenalty \tex_floatingpenalty:D
+ \@@_primitive:NN \font \tex_font:D
+ \@@_primitive:NN \fontdimen \tex_fontdimen:D
+ \@@_primitive:NN \fontname \tex_fontname:D
+ \@@_primitive:NN \futurelet \tex_futurelet:D
+ \@@_primitive:NN \gdef \tex_gdef:D
+ \@@_primitive:NN \global \tex_global:D
+ \@@_primitive:NN \globaldefs \tex_globaldefs:D
+ \@@_primitive:NN \halign \tex_halign:D
+ \@@_primitive:NN \hangafter \tex_hangafter:D
+ \@@_primitive:NN \hangindent \tex_hangindent:D
+ \@@_primitive:NN \hbadness \tex_hbadness:D
+ \@@_primitive:NN \hbox \tex_hbox:D
+ \@@_primitive:NN \hfil \tex_hfil:D
+ \@@_primitive:NN \hfill \tex_hfill:D
+ \@@_primitive:NN \hfilneg \tex_hfilneg:D
+ \@@_primitive:NN \hfuzz \tex_hfuzz:D
+ \@@_primitive:NN \hoffset \tex_hoffset:D
+ \@@_primitive:NN \holdinginserts \tex_holdinginserts:D
+ \@@_primitive:NN \hrule \tex_hrule:D
+ \@@_primitive:NN \hsize \tex_hsize:D
+ \@@_primitive:NN \hskip \tex_hskip:D
+ \@@_primitive:NN \hss \tex_hss:D
+ \@@_primitive:NN \ht \tex_ht:D
+ \@@_primitive:NN \hyphenation \tex_hyphenation:D
+ \@@_primitive:NN \hyphenchar \tex_hyphenchar:D
+ \@@_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D
+ \@@_primitive:NN \if \tex_if:D
+ \@@_primitive:NN \ifcase \tex_ifcase:D
+ \@@_primitive:NN \ifcat \tex_ifcat:D
+ \@@_primitive:NN \ifdim \tex_ifdim:D
+ \@@_primitive:NN \ifeof \tex_ifeof:D
+ \@@_primitive:NN \iffalse \tex_iffalse:D
+ \@@_primitive:NN \ifhbox \tex_ifhbox:D
+ \@@_primitive:NN \ifhmode \tex_ifhmode:D
+ \@@_primitive:NN \ifinner \tex_ifinner:D
+ \@@_primitive:NN \ifmmode \tex_ifmmode:D
+ \@@_primitive:NN \ifnum \tex_ifnum:D
+ \@@_primitive:NN \ifodd \tex_ifodd:D
+ \@@_primitive:NN \iftrue \tex_iftrue:D
+ \@@_primitive:NN \ifvbox \tex_ifvbox:D
+ \@@_primitive:NN \ifvmode \tex_ifvmode:D
+ \@@_primitive:NN \ifvoid \tex_ifvoid:D
+ \@@_primitive:NN \ifx \tex_ifx:D
+ \@@_primitive:NN \ignorespaces \tex_ignorespaces:D
+ \@@_primitive:NN \immediate \tex_immediate:D
+ \@@_primitive:NN \indent \tex_indent:D
+ \@@_primitive:NN \input \tex_input:D
+ \@@_primitive:NN \inputlineno \tex_inputlineno:D
+ \@@_primitive:NN \insert \tex_insert:D
+ \@@_primitive:NN \insertpenalties \tex_insertpenalties:D
+ \@@_primitive:NN \interlinepenalty \tex_interlinepenalty:D
+ \@@_primitive:NN \jobname \tex_jobname:D
+ \@@_primitive:NN \kern \tex_kern:D
+ \@@_primitive:NN \language \tex_language:D
+ \@@_primitive:NN \lastbox \tex_lastbox:D
+ \@@_primitive:NN \lastkern \tex_lastkern:D
+ \@@_primitive:NN \lastpenalty \tex_lastpenalty:D
+ \@@_primitive:NN \lastskip \tex_lastskip:D
+ \@@_primitive:NN \lccode \tex_lccode:D
+ \@@_primitive:NN \leaders \tex_leaders:D
+ \@@_primitive:NN \left \tex_left:D
+ \@@_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D
+ \@@_primitive:NN \leftskip \tex_leftskip:D
+ \@@_primitive:NN \leqno \tex_leqno:D
+ \@@_primitive:NN \let \tex_let:D
+ \@@_primitive:NN \limits \tex_limits:D
+ \@@_primitive:NN \linepenalty \tex_linepenalty:D
+ \@@_primitive:NN \lineskip \tex_lineskip:D
+ \@@_primitive:NN \lineskiplimit \tex_lineskiplimit:D
+ \@@_primitive:NN \long \tex_long:D
+ \@@_primitive:NN \looseness \tex_looseness:D
+ \@@_primitive:NN \lower \tex_lower:D
+ \@@_primitive:NN \lowercase \tex_lowercase:D
+ \@@_primitive:NN \mag \tex_mag:D
+ \@@_primitive:NN \mark \tex_mark:D
+ \@@_primitive:NN \mathaccent \tex_mathaccent:D
+ \@@_primitive:NN \mathbin \tex_mathbin:D
+ \@@_primitive:NN \mathchar \tex_mathchar:D
+ \@@_primitive:NN \mathchardef \tex_mathchardef:D
+ \@@_primitive:NN \mathchoice \tex_mathchoice:D
+ \@@_primitive:NN \mathclose \tex_mathclose:D
+ \@@_primitive:NN \mathcode \tex_mathcode:D
+ \@@_primitive:NN \mathinner \tex_mathinner:D
+ \@@_primitive:NN \mathop \tex_mathop:D
+ \@@_primitive:NN \mathopen \tex_mathopen:D
+ \@@_primitive:NN \mathord \tex_mathord:D
+ \@@_primitive:NN \mathpunct \tex_mathpunct:D
+ \@@_primitive:NN \mathrel \tex_mathrel:D
+ \@@_primitive:NN \mathsurround \tex_mathsurround:D
+ \@@_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D
+ \@@_primitive:NN \maxdepth \tex_maxdepth:D
+ \@@_primitive:NN \meaning \tex_meaning:D
+ \@@_primitive:NN \medmuskip \tex_medmuskip:D
+ \@@_primitive:NN \message \tex_message:D
+ \@@_primitive:NN \mkern \tex_mkern:D
+ \@@_primitive:NN \month \tex_month:D
+ \@@_primitive:NN \moveleft \tex_moveleft:D
+ \@@_primitive:NN \moveright \tex_moveright:D
+ \@@_primitive:NN \mskip \tex_mskip:D
+ \@@_primitive:NN \multiply \tex_multiply:D
+ \@@_primitive:NN \muskip \tex_muskip:D
+ \@@_primitive:NN \muskipdef \tex_muskipdef:D
+ \@@_primitive:NN \newlinechar \tex_newlinechar:D
+ \@@_primitive:NN \noalign \tex_noalign:D
+ \@@_primitive:NN \noboundary \tex_noboundary:D
+ \@@_primitive:NN \noexpand \tex_noexpand:D
+ \@@_primitive:NN \noindent \tex_noindent:D
+ \@@_primitive:NN \nolimits \tex_nolimits:D
+ \@@_primitive:NN \nonscript \tex_nonscript:D
+ \@@_primitive:NN \nonstopmode \tex_nonstopmode:D
+ \@@_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D
+ \@@_primitive:NN \nullfont \tex_nullfont:D
+ \@@_primitive:NN \number \tex_number:D
+ \@@_primitive:NN \omit \tex_omit:D
+ \@@_primitive:NN \openin \tex_openin:D
+ \@@_primitive:NN \openout \tex_openout:D
+ \@@_primitive:NN \or \tex_or:D
+ \@@_primitive:NN \outer \tex_outer:D
+ \@@_primitive:NN \output \tex_output:D
+ \@@_primitive:NN \outputpenalty \tex_outputpenalty:D
+ \@@_primitive:NN \over \tex_over:D
+ \@@_primitive:NN \overfullrule \tex_overfullrule:D
+ \@@_primitive:NN \overline \tex_overline:D
+ \@@_primitive:NN \overwithdelims \tex_overwithdelims:D
+ \@@_primitive:NN \pagedepth \tex_pagedepth:D
+ \@@_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D
+ \@@_primitive:NN \pagefillstretch \tex_pagefillstretch:D
+ \@@_primitive:NN \pagefilstretch \tex_pagefilstretch:D
+ \@@_primitive:NN \pagegoal \tex_pagegoal:D
+ \@@_primitive:NN \pageshrink \tex_pageshrink:D
+ \@@_primitive:NN \pagestretch \tex_pagestretch:D
+ \@@_primitive:NN \pagetotal \tex_pagetotal:D
+ \@@_primitive:NN \par \tex_par:D
+ \@@_primitive:NN \parfillskip \tex_parfillskip:D
+ \@@_primitive:NN \parindent \tex_parindent:D
+ \@@_primitive:NN \parshape \tex_parshape:D
+ \@@_primitive:NN \parskip \tex_parskip:D
+ \@@_primitive:NN \patterns \tex_patterns:D
+ \@@_primitive:NN \pausing \tex_pausing:D
+ \@@_primitive:NN \penalty \tex_penalty:D
+ \@@_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D
+ \@@_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D
+ \@@_primitive:NN \predisplaysize \tex_predisplaysize:D
+ \@@_primitive:NN \pretolerance \tex_pretolerance:D
+ \@@_primitive:NN \prevdepth \tex_prevdepth:D
+ \@@_primitive:NN \prevgraf \tex_prevgraf:D
+ \@@_primitive:NN \radical \tex_radical:D
+ \@@_primitive:NN \raise \tex_raise:D
+ \@@_primitive:NN \read \tex_read:D
+ \@@_primitive:NN \relax \tex_relax:D
+ \@@_primitive:NN \relpenalty \tex_relpenalty:D
+ \@@_primitive:NN \right \tex_right:D
+ \@@_primitive:NN \righthyphenmin \tex_righthyphenmin:D
+ \@@_primitive:NN \rightskip \tex_rightskip:D
+ \@@_primitive:NN \romannumeral \tex_romannumeral:D
+ \@@_primitive:NN \scriptfont \tex_scriptfont:D
+ \@@_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D
+ \@@_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D
+ \@@_primitive:NN \scriptspace \tex_scriptspace:D
+ \@@_primitive:NN \scriptstyle \tex_scriptstyle:D
+ \@@_primitive:NN \scrollmode \tex_scrollmode:D
+ \@@_primitive:NN \setbox \tex_setbox:D
+ \@@_primitive:NN \setlanguage \tex_setlanguage:D
+ \@@_primitive:NN \sfcode \tex_sfcode:D
+ \@@_primitive:NN \shipout \tex_shipout:D
+ \@@_primitive:NN \show \tex_show:D
+ \@@_primitive:NN \showbox \tex_showbox:D
+ \@@_primitive:NN \showboxbreadth \tex_showboxbreadth:D
+ \@@_primitive:NN \showboxdepth \tex_showboxdepth:D
+ \@@_primitive:NN \showlists \tex_showlists:D
+ \@@_primitive:NN \showthe \tex_showthe:D
+ \@@_primitive:NN \skewchar \tex_skewchar:D
+ \@@_primitive:NN \skip \tex_skip:D
+ \@@_primitive:NN \skipdef \tex_skipdef:D
+ \@@_primitive:NN \spacefactor \tex_spacefactor:D
+ \@@_primitive:NN \spaceskip \tex_spaceskip:D
+ \@@_primitive:NN \span \tex_span:D
+ \@@_primitive:NN \special \tex_special:D
+ \@@_primitive:NN \splitbotmark \tex_splitbotmark:D
+ \@@_primitive:NN \splitfirstmark \tex_splitfirstmark:D
+ \@@_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D
+ \@@_primitive:NN \splittopskip \tex_splittopskip:D
+ \@@_primitive:NN \string \tex_string:D
+ \@@_primitive:NN \tabskip \tex_tabskip:D
+ \@@_primitive:NN \textfont \tex_textfont:D
+ \@@_primitive:NN \textstyle \tex_textstyle:D
+ \@@_primitive:NN \the \tex_the:D
+ \@@_primitive:NN \thickmuskip \tex_thickmuskip:D
+ \@@_primitive:NN \thinmuskip \tex_thinmuskip:D
+ \@@_primitive:NN \time \tex_time:D
+ \@@_primitive:NN \toks \tex_toks:D
+ \@@_primitive:NN \toksdef \tex_toksdef:D
+ \@@_primitive:NN \tolerance \tex_tolerance:D
+ \@@_primitive:NN \topmark \tex_topmark:D
+ \@@_primitive:NN \topskip \tex_topskip:D
+ \@@_primitive:NN \tracingcommands \tex_tracingcommands:D
+ \@@_primitive:NN \tracinglostchars \tex_tracinglostchars:D
+ \@@_primitive:NN \tracingmacros \tex_tracingmacros:D
+ \@@_primitive:NN \tracingonline \tex_tracingonline:D
+ \@@_primitive:NN \tracingoutput \tex_tracingoutput:D
+ \@@_primitive:NN \tracingpages \tex_tracingpages:D
+ \@@_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D
+ \@@_primitive:NN \tracingrestores \tex_tracingrestores:D
+ \@@_primitive:NN \tracingstats \tex_tracingstats:D
+ \@@_primitive:NN \uccode \tex_uccode:D
+ \@@_primitive:NN \uchyph \tex_uchyph:D
+ \@@_primitive:NN \underline \tex_underline:D
+ \@@_primitive:NN \unhbox \tex_unhbox:D
+ \@@_primitive:NN \unhcopy \tex_unhcopy:D
+ \@@_primitive:NN \unkern \tex_unkern:D
+ \@@_primitive:NN \unpenalty \tex_unpenalty:D
+ \@@_primitive:NN \unskip \tex_unskip:D
+ \@@_primitive:NN \unvbox \tex_unvbox:D
+ \@@_primitive:NN \unvcopy \tex_unvcopy:D
+ \@@_primitive:NN \uppercase \tex_uppercase:D
+ \@@_primitive:NN \vadjust \tex_vadjust:D
+ \@@_primitive:NN \valign \tex_valign:D
+ \@@_primitive:NN \vbadness \tex_vbadness:D
+ \@@_primitive:NN \vbox \tex_vbox:D
+ \@@_primitive:NN \vcenter \tex_vcenter:D
+ \@@_primitive:NN \vfil \tex_vfil:D
+ \@@_primitive:NN \vfill \tex_vfill:D
+ \@@_primitive:NN \vfilneg \tex_vfilneg:D
+ \@@_primitive:NN \vfuzz \tex_vfuzz:D
+ \@@_primitive:NN \voffset \tex_voffset:D
+ \@@_primitive:NN \vrule \tex_vrule:D
+ \@@_primitive:NN \vsize \tex_vsize:D
+ \@@_primitive:NN \vskip \tex_vskip:D
+ \@@_primitive:NN \vsplit \tex_vsplit:D
+ \@@_primitive:NN \vss \tex_vss:D
+ \@@_primitive:NN \vtop \tex_vtop:D
+ \@@_primitive:NN \wd \tex_wd:D
+ \@@_primitive:NN \widowpenalty \tex_widowpenalty:D
+ \@@_primitive:NN \write \tex_write:D
+ \@@_primitive:NN \xdef \tex_xdef:D
+ \@@_primitive:NN \xleaders \tex_xleaders:D
+ \@@_primitive:NN \xspaceskip \tex_xspaceskip:D
+ \@@_primitive:NN \year \tex_year:D
% \end{macrocode}
% Since \LaTeX3 requires at least the \eTeX{} extensions,
% we also rename the additional primitives. These are all
% given the prefix | \etex_|.
% \begin{macrocode}
- \@@_primitive:NN \beginL \etex_beginL:D
- \@@_primitive:NN \beginR \etex_beginR:D
- \@@_primitive:NN \botmarks \etex_botmarks:D
- \@@_primitive:NN \clubpenalties \etex_clubpenalties:D
- \@@_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
- \@@_primitive:NN \currentgrouptype \etex_currentgrouptype:D
- \@@_primitive:NN \currentifbranch \etex_currentifbranch:D
- \@@_primitive:NN \currentiflevel \etex_currentiflevel:D
- \@@_primitive:NN \currentiftype \etex_currentiftype:D
- \@@_primitive:NN \detokenize \etex_detokenize:D
- \@@_primitive:NN \dimexpr \etex_dimexpr:D
- \@@_primitive:NN \displaywidowpenalties \etex_displaywidowpenalties:D
- \@@_primitive:NN \endL \etex_endL:D
- \@@_primitive:NN \endR \etex_endR:D
- \@@_primitive:NN \eTeXrevision \etex_eTeXrevision:D
- \@@_primitive:NN \eTeXversion \etex_eTeXversion:D
- \@@_primitive:NN \everyeof \etex_everyeof:D
- \@@_primitive:NN \firstmarks \etex_firstmarks:D
- \@@_primitive:NN \fontchardp \etex_fontchardp:D
- \@@_primitive:NN \fontcharht \etex_fontcharht:D
- \@@_primitive:NN \fontcharic \etex_fontcharic:D
- \@@_primitive:NN \fontcharwd \etex_fontcharwd:D
- \@@_primitive:NN \glueexpr \etex_glueexpr:D
- \@@_primitive:NN \glueshrink \etex_glueshrink:D
- \@@_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
- \@@_primitive:NN \gluestretch \etex_gluestretch:D
- \@@_primitive:NN \gluestretchorder \etex_gluestretchorder:D
- \@@_primitive:NN \gluetomu \etex_gluetomu:D
- \@@_primitive:NN \ifcsname \etex_ifcsname:D
- \@@_primitive:NN \ifdefined \etex_ifdefined:D
- \@@_primitive:NN \iffontchar \etex_iffontchar:D
- \@@_primitive:NN \interactionmode \etex_interactionmode:D
- \@@_primitive:NN \interlinepenalties \etex_interlinepenalties:D
- \@@_primitive:NN \lastlinefit \etex_lastlinefit:D
- \@@_primitive:NN \lastnodetype \etex_lastnodetype:D
- \@@_primitive:NN \marks \etex_marks:D
- \@@_primitive:NN \middle \etex_middle:D
- \@@_primitive:NN \muexpr \etex_muexpr:D
- \@@_primitive:NN \mutoglue \etex_mutoglue:D
- \@@_primitive:NN \numexpr \etex_numexpr:D
- \@@_primitive:NN \pagediscards \etex_pagediscards:D
- \@@_primitive:NN \parshapedimen \etex_parshapedimen:D
- \@@_primitive:NN \parshapeindent \etex_parshapeindent:D
- \@@_primitive:NN \parshapelength \etex_parshapelength:D
- \@@_primitive:NN \predisplaydirection \etex_predisplaydirection:D
- \@@_primitive:NN \protected \etex_protected:D
- \@@_primitive:NN \readline \etex_readline:D
- \@@_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
- \@@_primitive:NN \savingvdiscards \etex_savingvdiscards:D
- \@@_primitive:NN \scantokens \etex_scantokens:D
- \@@_primitive:NN \showgroups \etex_showgroups:D
- \@@_primitive:NN \showifs \etex_showifs:D
- \@@_primitive:NN \showtokens \etex_showtokens:D
- \@@_primitive:NN \splitbotmarks \etex_splitbotmarks:D
- \@@_primitive:NN \splitdiscards \etex_splitdiscards:D
- \@@_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
- \@@_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
- \@@_primitive:NN \topmarks \etex_topmarks:D
- \@@_primitive:NN \tracingassigns \etex_tracingassigns:D
- \@@_primitive:NN \tracinggroups \etex_tracinggroups:D
- \@@_primitive:NN \tracingifs \etex_tracingifs:D
- \@@_primitive:NN \tracingnesting \etex_tracingnesting:D
- \@@_primitive:NN \tracingscantokens \etex_tracingscantokens:D
- \@@_primitive:NN \unexpanded \etex_unexpanded:D
- \@@_primitive:NN \unless \etex_unless:D
- \@@_primitive:NN \widowpenalties \etex_widowpenalties:D
+ \@@_primitive:NN \beginL \etex_beginL:D
+ \@@_primitive:NN \beginR \etex_beginR:D
+ \@@_primitive:NN \botmarks \etex_botmarks:D
+ \@@_primitive:NN \clubpenalties \etex_clubpenalties:D
+ \@@_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
+ \@@_primitive:NN \currentgrouptype \etex_currentgrouptype:D
+ \@@_primitive:NN \currentifbranch \etex_currentifbranch:D
+ \@@_primitive:NN \currentiflevel \etex_currentiflevel:D
+ \@@_primitive:NN \currentiftype \etex_currentiftype:D
+ \@@_primitive:NN \detokenize \etex_detokenize:D
+ \@@_primitive:NN \dimexpr \etex_dimexpr:D
+ \@@_primitive:NN \displaywidowpenalties
+ \etex_displaywidowpenalties:D
+ \@@_primitive:NN \endL \etex_endL:D
+ \@@_primitive:NN \endR \etex_endR:D
+ \@@_primitive:NN \eTeXrevision \etex_eTeXrevision:D
+ \@@_primitive:NN \eTeXversion \etex_eTeXversion:D
+ \@@_primitive:NN \everyeof \etex_everyeof:D
+ \@@_primitive:NN \firstmarks \etex_firstmarks:D
+ \@@_primitive:NN \fontchardp \etex_fontchardp:D
+ \@@_primitive:NN \fontcharht \etex_fontcharht:D
+ \@@_primitive:NN \fontcharic \etex_fontcharic:D
+ \@@_primitive:NN \fontcharwd \etex_fontcharwd:D
+ \@@_primitive:NN \glueexpr \etex_glueexpr:D
+ \@@_primitive:NN \glueshrink \etex_glueshrink:D
+ \@@_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
+ \@@_primitive:NN \gluestretch \etex_gluestretch:D
+ \@@_primitive:NN \gluestretchorder \etex_gluestretchorder:D
+ \@@_primitive:NN \gluetomu \etex_gluetomu:D
+ \@@_primitive:NN \ifcsname \etex_ifcsname:D
+ \@@_primitive:NN \ifdefined \etex_ifdefined:D
+ \@@_primitive:NN \iffontchar \etex_iffontchar:D
+ \@@_primitive:NN \interactionmode \etex_interactionmode:D
+ \@@_primitive:NN \interlinepenalties \etex_interlinepenalties:D
+ \@@_primitive:NN \lastlinefit \etex_lastlinefit:D
+ \@@_primitive:NN \lastnodetype \etex_lastnodetype:D
+ \@@_primitive:NN \marks \etex_marks:D
+ \@@_primitive:NN \middle \etex_middle:D
+ \@@_primitive:NN \muexpr \etex_muexpr:D
+ \@@_primitive:NN \mutoglue \etex_mutoglue:D
+ \@@_primitive:NN \numexpr \etex_numexpr:D
+ \@@_primitive:NN \pagediscards \etex_pagediscards:D
+ \@@_primitive:NN \parshapedimen \etex_parshapedimen:D
+ \@@_primitive:NN \parshapeindent \etex_parshapeindent:D
+ \@@_primitive:NN \parshapelength \etex_parshapelength:D
+ \@@_primitive:NN \predisplaydirection \etex_predisplaydirection:D
+ \@@_primitive:NN \protected \etex_protected:D
+ \@@_primitive:NN \readline \etex_readline:D
+ \@@_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
+ \@@_primitive:NN \savingvdiscards \etex_savingvdiscards:D
+ \@@_primitive:NN \scantokens \etex_scantokens:D
+ \@@_primitive:NN \showgroups \etex_showgroups:D
+ \@@_primitive:NN \showifs \etex_showifs:D
+ \@@_primitive:NN \showtokens \etex_showtokens:D
+ \@@_primitive:NN \splitbotmarks \etex_splitbotmarks:D
+ \@@_primitive:NN \splitdiscards \etex_splitdiscards:D
+ \@@_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
+ \@@_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
+ \@@_primitive:NN \topmarks \etex_topmarks:D
+ \@@_primitive:NN \tracingassigns \etex_tracingassigns:D
+ \@@_primitive:NN \tracinggroups \etex_tracinggroups:D
+ \@@_primitive:NN \tracingifs \etex_tracingifs:D
+ \@@_primitive:NN \tracingnesting \etex_tracingnesting:D
+ \@@_primitive:NN \tracingscantokens \etex_tracingscantokens:D
+ \@@_primitive:NN \unexpanded \etex_unexpanded:D
+ \@@_primitive:NN \unless \etex_unless:D
+ \@@_primitive:NN \widowpenalties \etex_widowpenalties:D
% \end{macrocode}
% The newer primitives are more complex: there are an awful lot of them,
% and we don't use them all at the moment. So the following is selective,
@@ -551,134 +546,139 @@
% are not related to PDF output. These ones related to PDF output or only
% work in PDF mode.
% \begin{macrocode}
- \@@_primitive:NN \pdfannot \pdftex_pdfannot:D
- \@@_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
- \@@_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
- \@@_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
- \@@_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
- \@@_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
- \@@_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
- \@@_primitive:NN \pdfdest \pdftex_pdfdest:D
- \@@_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
- \@@_primitive:NN \pdfendlink \pdftex_pdfendlink:D
- \@@_primitive:NN \pdfendthread \pdftex_pdfendthread:D
- \@@_primitive:NN \pdffontattr \pdftex_pdffontattr:D
- \@@_primitive:NN \pdffontname \pdftex_pdffontname:D
- \@@_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
- \@@_primitive:NN \pdfgamma \pdftex_pdfgamma:D
- \@@_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
- \@@_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
- \@@_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
- \@@_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
- \@@_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
- \@@_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
- \@@_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
- \@@_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
- \@@_primitive:NN \pdfinclusioncopyfonts \pdftex_pdfinclusioncopyfonts:D
- \@@_primitive:NN \pdfinclusionerrorlevel \pdftex_pdfinclusionerrorlevel:D
- \@@_primitive:NN \pdfinfo \pdftex_pdfinfo:D
- \@@_primitive:NN \pdflastannot \pdftex_pdflastannot:D
- \@@_primitive:NN \pdflastlink \pdftex_pdflastlink:D
- \@@_primitive:NN \pdflastobj \pdftex_pdflastobj:D
- \@@_primitive:NN \pdflastxform \pdftex_pdflastxform:D
- \@@_primitive:NN \pdflastximage \pdftex_pdflastximage:D
- \@@_primitive:NN \pdflastximagecolordepth \pdftex_pdflastximagecolordepth:D
- \@@_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
- \@@_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
- \@@_primitive:NN \pdfliteral \pdftex_pdfliteral:D
- \@@_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
- \@@_primitive:NN \pdfnames \pdftex_pdfnames:D
- \@@_primitive:NN \pdfobj \pdftex_pdfobj:D
- \@@_primitive:NN \pdfobjcompresslevel \pdftex_pdfobjcompresslevel:D
- \@@_primitive:NN \pdfoutline \pdftex_pdfoutline:D
- \@@_primitive:NN \pdfoutput \pdftex_pdfoutput:D
- \@@_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
- \@@_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
- \@@_primitive:NN \pdfpageref \pdftex_pdfpageref:D
- \@@_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
- \@@_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
- \@@_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
- \@@_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
- \@@_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
- \@@_primitive:NN \pdfrestore \pdftex_pdfrestore:D
- \@@_primitive:NN \pdfretval \pdftex_pdfretval:D
- \@@_primitive:NN \pdfsave \pdftex_pdfsave:D
- \@@_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
- \@@_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
- \@@_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
- \@@_primitive:NN \pdfsuppressptexinfo \pdftex_pdfsuppressptexinfo:D
- \@@_primitive:NN \pdfthread \pdftex_pdfthread:D
- \@@_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
- \@@_primitive:NN \pdftrailer \pdftex_pdftrailer:D
- \@@_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
- \@@_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
- \@@_primitive:NN \pdfxform \pdftex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
- \@@_primitive:NN \pdfxformname \pdftex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
- \@@_primitive:NN \pdfximage \pdftex_pdfximage:D
- \@@_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
+ \@@_primitive:NN \pdfannot \pdftex_pdfannot:D
+ \@@_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
+ \@@_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
+ \@@_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
+ \@@_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
+ \@@_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
+ \@@_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
+ \@@_primitive:NN \pdfdest \pdftex_pdfdest:D
+ \@@_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
+ \@@_primitive:NN \pdfendlink \pdftex_pdfendlink:D
+ \@@_primitive:NN \pdfendthread \pdftex_pdfendthread:D
+ \@@_primitive:NN \pdffontattr \pdftex_pdffontattr:D
+ \@@_primitive:NN \pdffontname \pdftex_pdffontname:D
+ \@@_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
+ \@@_primitive:NN \pdfgamma \pdftex_pdfgamma:D
+ \@@_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
+ \@@_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
+ \@@_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
+ \@@_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
+ \@@_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
+ \@@_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
+ \@@_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
+ \@@_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
+ \@@_primitive:NN \pdfinclusioncopyfonts
+ \pdftex_pdfinclusioncopyfonts:D
+ \@@_primitive:NN \pdfinclusionerrorlevel
+ \pdftex_pdfinclusionerrorlevel:D
+ \@@_primitive:NN \pdfinfo \pdftex_pdfinfo:D
+ \@@_primitive:NN \pdflastannot \pdftex_pdflastannot:D
+ \@@_primitive:NN \pdflastlink \pfdftex_pdflastlink:D
+ \@@_primitive:NN \pdflastobj \pdftex_pdflastobj:D
+ \@@_primitive:NN \pdflastxform \pdftex_pdflastxform:D
+ \@@_primitive:NN \pdflastximage \pdftex_pdflastximage:D
+ \@@_primitive:NN \pdflastximagecolordepth
+ \pdftex_pdflastximagecolordepth:D
+ \@@_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
+ \@@_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
+ \@@_primitive:NN \pdfliteral \pdftex_pdfliteral:D
+ \@@_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
+ \@@_primitive:NN \pdfnames \pdftex_pdfnames:D
+ \@@_primitive:NN \pdfobj \pdftex_pdfobj:D
+ \@@_primitive:NN \pdfobjcompresslevel
+ \pdftex_pdfobjcompresslevel:D
+ \@@_primitive:NN \pdfoutline \pdftex_pdfoutline:D
+ \@@_primitive:NN \pdfoutput \pdftex_pdfoutput:D
+ \@@_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
+ \@@_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
+ \@@_primitive:NN \pdfpageref \pdftex_pdfpageref:D
+ \@@_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
+ \@@_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
+ \@@_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
+ \@@_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
+ \@@_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
+ \@@_primitive:NN \pdfrestore \pdftex_pdfrestore:D
+ \@@_primitive:NN \pdfretval \pdftex_pdfretval:D
+ \@@_primitive:NN \pdfsave \pdftex_pdfsave:D
+ \@@_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
+ \@@_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
+ \@@_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
+ \@@_primitive:NN \pdfsuppressptexinfo
+ \pdftex_pdfsuppressptexinfo:D
+ \@@_primitive:NN \pdfthread \pdftex_pdfthread:D
+ \@@_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
+ \@@_primitive:NN \pdftrailer \pdftex_pdftrailer:D
+ \@@_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
+ \@@_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
+ \@@_primitive:NN \pdfxform \pdftex_pdfxform:D
+ \@@_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
+ \@@_primitive:NN \pdfxformname \pdftex_pdfxformname:D
+ \@@_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
+ \@@_primitive:NN \pdfximage \pdftex_pdfximage:D
+ \@@_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
% \end{macrocode}
% While these are not.
% \begin{macrocode}
- \@@_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \pdfcopyfont \pdftex_copyfont:D
- \@@_primitive:NN \pdfdraftmode \pdftex_draftmode:D
- \@@_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
- \@@_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
- \@@_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
- \@@_primitive:NN \pdffilesize \pdftex_filesize:D
- \@@_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D
- \@@_primitive:NN \pdffontexpand \pdftex_fontexpand:D
- \@@_primitive:NN \pdffontsize \pdftex_fontsize:D
- \@@_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
- \@@_primitive:NN \pdfinsertht \pdftex_insertht:D
- \@@_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
- \@@_primitive:NN \pdflastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \pdflastypos \pdftex_lastypos:D
- \@@_primitive:NN \pdfmapfile \pdftex_mapfile:D
- \@@_primitive:NN \pdfmapline \pdftex_mapline:D
- \@@_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \pdfnoligatures \pdftex_noligatures:D
- \@@_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \pdfpageheight \pdftex_pageheight:D
- \@@_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
- \@@_primitive:NN \pdfpkmode \pdftex_pkmode:D
- \@@_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
- \@@_primitive:NN \pdfprimitive \pdftex_primitive:D
- \@@_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \pdfrandomseed \pdftex_randomseed:D
- \@@_primitive:NN \pdfsavepos \pdftex_savepos:D
- \@@_primitive:NN \pdfstrcmp \pdftex_strcmp:D
- \@@_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \pdfshellescape \pdftex_shellescape:D
- \@@_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
+ \@@_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
+ \@@_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
+ \@@_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
+ \@@_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
+ \@@_primitive:NN \pdfcopyfont \pdftex_copyfont:D
+ \@@_primitive:NN \pdfdraftmode \pdftex_draftmode:D
+ \@@_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
+ \@@_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
+ \@@_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
+ \@@_primitive:NN \pdffilesize \pdftex_filesize:D
+ \@@_primitive:NN \pdffirstlineheigh \pdftex_firstlineheight:D
+ \@@_primitive:NN \pdffontexpand \pdftex_fontexpand:D
+ \@@_primitive:NN \pdffontsize \pdftex_fontsize:D
+ \@@_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
+ \@@_primitive:NN \pdfinsertht \pdftex_insertht:D
+ \@@_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
+ \@@_primitive:NN \pdflastxpos \pdftex_lastxpos:D
+ \@@_primitive:NN \pdflastypos \pdftex_lastypos:D
+ \@@_primitive:NN \pdfmapfile \pdftex_mapfile:D
+ \@@_primitive:NN \pdfmapline \pdftex_mapline:D
+ \@@_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
+ \@@_primitive:NN \pdfnoligatures \pdftex_noligatures:D
+ \@@_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
+ \@@_primitive:NN \pdfpageheight \pdftex_pageheight:D
+ \@@_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
+ \@@_primitive:NN \pdfpkmode \pdftex_pkmode:D
+ \@@_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
+ \@@_primitive:NN \pdfprimitive \pdftex_primitive:D
+ \@@_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
+ \@@_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
+ \@@_primitive:NN \pdfrandomseed \pdftex_randomseed:D
+ \@@_primitive:NN \pdfsavepos \pdftex_savepos:D
+ \@@_primitive:NN \pdfstrcmp \pdftex_strcmp:D
+ \@@_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
+ \@@_primitive:NN \pdfshellescape \pdftex_shellescape:D
+ \@@_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
+ \@@_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
% \end{macrocode}
% The version primitives are not related to PDF mode but are related to
% \pdfTeX{} so retain the full prefix.
% \begin{macrocode}
- \@@_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
- \@@_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
- \@@_primitive:NN \pdftexversion \pdftex_pdftexversion:D
+ \@@_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
+ \@@_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
+ \@@_primitive:NN \pdftexversion \pdftex_pdftexversion:D
% \end{macrocode}
% These ones appear in \pdfTeX{} but don't have |pdf| in the name at all.
% (\tn{synctex} is odd as it's really not from \pdfTeX{} but from SyncTeX!)
% \begin{macrocode}
- \@@_primitive:NN \efcode \pdftex_efcode:D
- \@@_primitive:NN \ifincsname \pdftex_ifincsname:D
- \@@_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
- \@@_primitive:NN \letterspacefont \pdftex_letterspacefont:D
- \@@_primitive:NN \lpcode \pdftex_lpcode:D
- \@@_primitive:NN \quitvmode \pdftex_quitvmode:D
- \@@_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
- \@@_primitive:NN \rpcode \pdftex_rpcode:D
- \@@_primitive:NN \synctex \pdftex_synctex:D
- \@@_primitive:NN \tagcode \pdftex_tagcode:D
+ \@@_primitive:NN \efcode \pdftex_efcode:D
+ \@@_primitive:NN \ifincsname \pdftex_ifincsname:D
+ \@@_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
+ \@@_primitive:NN \letterspacefont \pdftex_letterspacefont:D
+ \@@_primitive:NN \lpcode \pdftex_lpcode:D
+ \@@_primitive:NN \quitvmode \pdftex_quitvmode:D
+ \@@_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
+ \@@_primitive:NN \rpcode \pdftex_rpcode:D
+ \@@_primitive:NN \synctex \pdftex_synctex:D
+ \@@_primitive:NN \tagcode \pdftex_tagcode:D
% \end{macrocode}
% Post \pdfTeX{} primitive availability gets more complex. Both \XeTeX{} and
% \LuaTeX{} have varying names for some primitives from \pdfTeX{}. Particularly
@@ -708,160 +708,181 @@
% into the \enquote{base} name. A few cross-compatibility names which lack
% the |pdf| of the original are handled later.
% \begin{macrocode}
- \@@_primitive:NN \suppressfontnotfounderror \xetex_suppressfontnotfounderror:D
- \@@_primitive:NN \XeTeXcharclass \xetex_charclass:D
- \@@_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
- \@@_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
- \@@_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
- \@@_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
- \@@_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
- \@@_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
- \@@_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
- \@@_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
- \@@_primitive:NN \XeTeXfeaturename \xetex_featurename:D
- \@@_primitive:NN \XeTeXfindfeaturebyname \xetex_findfeaturebyname:D
- \@@_primitive:NN \XeTeXfindselectorbyname \xetex_findselectorbyname:D
- \@@_primitive:NN \XeTeXfindvariationbyname \xetex_findvariationbyname:D
- \@@_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
- \@@_primitive:NN \XeTeXfonttype \xetex_fonttype:D
- \@@_primitive:NN \XeTeXgenerateactualtext \xetex_generateactualtext:D
- \@@_primitive:NN \XeTeXglyph \xetex_glyph:D
- \@@_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
- \@@_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
- \@@_primitive:NN \XeTeXglyphname \xetex_glyphname:D
- \@@_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
- \@@_primitive:NN \XeTeXinputnormalization \xetex_inputnormalization:D
- \@@_primitive:NN \XeTeXinterchartokenstate \xetex_interchartokenstate:D
- \@@_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
- \@@_primitive:NN \XeTeXisdefaultselector \xetex_isdefaultselector:D
- \@@_primitive:NN \XeTeXisexclusivefeature \xetex_isexclusivefeature:D
- \@@_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
- \@@_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
- \@@_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
- \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
- \@@_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
- \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
- \@@_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
- \@@_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
- \@@_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
- \@@_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
- \@@_primitive:NN \XeTeXpdffile \xetex_pdffile:D
- \@@_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
- \@@_primitive:NN \XeTeXpicfile \xetex_picfile:D
- \@@_primitive:NN \XeTeXselectorname \xetex_selectorname:D
- \@@_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
- \@@_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
- \@@_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
- \@@_primitive:NN \XeTeXvariation \xetex_variation:D
- \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
- \@@_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
- \@@_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
- \@@_primitive:NN \XeTeXvariationname \xetex_variationname:D
+ \@@_primitive:NN \suppressfontnotfounderror
+ \xetex_suppressfontnotfounderror:D
+ \@@_primitive:NN \XeTeXcharclass \xetex_charclass:D
+ \@@_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
+ \@@_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
+ \@@_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
+ \@@_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
+ \@@_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
+ \@@_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
+ \@@_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
+ \@@_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
+ \@@_primitive:NN \XeTeXfeaturename \xetex_featurename:D
+ \@@_primitive:NN \XeTeXfindfeaturebyname
+ \xetex_findfeaturebyname:D
+ \@@_primitive:NN \XeTeXfindselectorbyname
+ \xetex_findselectorbyname:D
+ \@@_primitive:NN \XeTeXfindvariationbyname
+ \xetex_findvariationbyname:D
+ \@@_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
+ \@@_primitive:NN \XeTeXfonttype \xetex_fonttype:D
+ \@@_primitive:NN \XeTeXgenerateactualtext
+ \xetex_generateactualtext:D
+ \@@_primitive:NN \XeTeXglyph \xetex_glyph:D
+ \@@_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
+ \@@_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
+ \@@_primitive:NN \XeTeXglyphname \xetex_glyphname:D
+ \@@_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
+ \@@_primitive:NN \XeTeXinputnormalization
+ \xetex_inputnormalization:D
+ \@@_primitive:NN \XeTeXinterchartokenstate
+ \xetex_interchartokenstate:D
+ \@@_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
+ \@@_primitive:NN \XeTeXisdefaultselector
+ \xetex_isdefaultselector:D
+ \@@_primitive:NN \XeTeXisexclusivefeature
+ \xetex_isexclusivefeature:D
+ \@@_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
+ \@@_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
+ \@@_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
+ \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
+ \@@_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
+ \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
+ \@@_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
+ \@@_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
+ \@@_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
+ \@@_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
+ \@@_primitive:NN \XeTeXpdffile \xetex_pdffile:D
+ \@@_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
+ \@@_primitive:NN \XeTeXpicfile \xetex_picfile:D
+ \@@_primitive:NN \XeTeXselectorname \xetex_selectorname:D
+ \@@_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
+ \@@_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
+ \@@_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
+ \@@_primitive:NN \XeTeXvariation \xetex_variation:D
+ \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
+ \@@_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
+ \@@_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
+ \@@_primitive:NN \XeTeXvariationname \xetex_variationname:D
% \end{macrocode}
% The version primitives retain |XeTeX|.
% \begin{macrocode}
- \@@_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
- \@@_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
+ \@@_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
+ \@@_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
% \end{macrocode}
% Primitives from \pdfTeX{} that \XeTeX{} renames: also helps with
% \LuaTeX{}.
% \begin{macrocode}
- \@@_primitive:NN \mdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \ifprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \primitive \pdftex_primitive:D
- \@@_primitive:NN \shellescape \pdftex_shellescape:D
+ \@@_primitive:NN \mdfivesum \pdftex_mdfivesum:D
+ \@@_primitive:NN \ifprimitive \pdftex_ifprimitive:D
+ \@@_primitive:NN \primitive \pdftex_primitive:D
+ \@@_primitive:NN \shellescape \pdftex_shellescape:D
% \end{macrocode}
% Primitives from \LuaTeX{}, some of which have been ported back to
% \XeTeX{}. Notice that \tn{expanded} was intended for \pdfTeX{}~1.50 but
% as that was not released we call this a \LuaTeX{} primitive.
% \begin{macrocode}
- \@@_primitive:NN \alignmark \luatex_alignmark:D
- \@@_primitive:NN \aligntab \luatex_aligntab:D
- \@@_primitive:NN \attribute \luatex_attribute:D
- \@@_primitive:NN \attributedef \luatex_attributedef:D
- \@@_primitive:NN \automaticdiscretionary \luatex_automaticdiscretionary:D
- \@@_primitive:NN \automatichyphenmode \luatex_automatichyphenmode:D
- \@@_primitive:NN \automatichyphenpenalty \luatex_automatichyphenpenalty:D
- \@@_primitive:NN \begincsname \luatex_begincsname:D
- \@@_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
- \@@_primitive:NN \catcodetable \luatex_catcodetable:D
- \@@_primitive:NN \clearmarks \luatex_clearmarks:D
- \@@_primitive:NN \crampeddisplaystyle \luatex_crampeddisplaystyle:D
- \@@_primitive:NN \crampedscriptscriptstyle \luatex_crampedscriptscriptstyle:D
- \@@_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
- \@@_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
- \@@_primitive:NN \directlua \luatex_directlua:D
- \@@_primitive:NN \dviextension \luatex_dviextension:D
- \@@_primitive:NN \dvifeedback \luatex_dvifeedback:D
- \@@_primitive:NN \dvivariable \luatex_dvivariable:D
- \@@_primitive:NN \etoksapp \luatex_etoksapp:D
- \@@_primitive:NN \etokspre \luatex_etokspre:D
- \@@_primitive:NN \explicithyphenpenalty \luatex_explicithyphenpenalty:D
- \@@_primitive:NN \expanded \luatex_expanded:D
- \@@_primitive:NN \explicitdiscretionary \luatex_explicitdiscretionary:D
- \@@_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
- \@@_primitive:NN \fontid \luatex_fontid:D
- \@@_primitive:NN \formatname \luatex_formatname:D
- \@@_primitive:NN \hjcode \luatex_hjcode:D
- \@@_primitive:NN \hpack \luatex_hpack:D
- \@@_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
- \@@_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
- \@@_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
- \@@_primitive:NN \gleaders \luatex_gleaders:D
- \@@_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
- \@@_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
- \@@_primitive:NN \latelua \luatex_latelua:D
- \@@_primitive:NN \letcharcode \luatex_letcharcode:D
- \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D
- \@@_primitive:NN \luafunction \luatex_luafunction:D
- \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D
- \@@_primitive:NN \luatexrevision \luatex_luatexrevision:D
- \@@_primitive:NN \luatexversion \luatex_luatexversion:D
- \@@_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
- \@@_primitive:NN \mathdisplayskipmode \luatex_mathdisplayskipmode:D
- \@@_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
- \@@_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
- \@@_primitive:NN \mathoption \luatex_mathoption:D
- \@@_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
- \@@_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
- \@@_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
- \@@_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
- \@@_primitive:NN \mathstyle \luatex_mathstyle:D
- \@@_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
- \@@_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
- \@@_primitive:NN \nohrule \luatex_nohrule:D
- \@@_primitive:NN \nokerns \luatex_nokerns:D
- \@@_primitive:NN \noligs \luatex_noligs:D
- \@@_primitive:NN \nospaces \luatex_nospaces:D
- \@@_primitive:NN \novrule \luatex_novrule:D
- \@@_primitive:NN \outputbox \luatex_outputbox:D
- \@@_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
- \@@_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
- \@@_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
- \@@_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
- \@@_primitive:NN \pdfextension \luatex_pdfextension:D
- \@@_primitive:NN \pdffeedback \luatex_pdffeedback:D
- \@@_primitive:NN \pdfvariable \luatex_pdfvariable:D
- \@@_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
- \@@_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
- \@@_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
- \@@_primitive:NN \predisplaygapfactor \luatex_predisplaygapfactor:D
- \@@_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
- \@@_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
- \@@_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
- \@@_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
- \@@_primitive:NN \scantextokens \luatex_scantextokens:D
- \@@_primitive:NN \setfontid \luatex_setfontid:D
- \@@_primitive:NN \shapemode \luatex_shapemode:D
- \@@_primitive:NN \suppressifcsnameerror \luatex_suppressifcsnameerror:D
- \@@_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
- \@@_primitive:NN \suppressmathparerror \luatex_suppressmathparerror:D
- \@@_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
- \@@_primitive:NN \suppressprimitiveerror \luatex_suppressprimitiveerror:D
- \@@_primitive:NN \toksapp \luatex_toksapp:D
- \@@_primitive:NN \tokspre \luatex_tokspre:D
- \@@_primitive:NN \tpack \luatex_tpack:D
- \@@_primitive:NN \vpack \luatex_vpack:D
+ \@@_primitive:NN \alignmark \luatex_alignmark:D
+ \@@_primitive:NN \aligntab \luatex_aligntab:D
+ \@@_primitive:NN \attribute \luatex_attribute:D
+ \@@_primitive:NN \attributedef \luatex_attributedef:D
+ \@@_primitive:NN \automaticdiscretionary
+ \luatex_automaticdiscretionary:D
+ \@@_primitive:NN \automatichyphenmode
+ \luatex_automatichyphenmode:D
+ \@@_primitive:NN \automatichyphenpenalty
+ \luatex_automatichyphenpenalty:D
+ \@@_primitive:NN \begincsname \luatex_begincsname:D
+ \@@_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
+ \@@_primitive:NN \catcodetable \luatex_catcodetable:D
+ \@@_primitive:NN \clearmarks \luatex_clearmarks:D
+ \@@_primitive:NN \crampeddisplaystyle
+ \luatex_crampeddisplaystyle:D
+ \@@_primitive:NN \crampedscriptscriptstyle
+ \luatex_crampedscriptscriptstyle:D
+ \@@_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
+ \@@_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
+ \@@_primitive:NN \directlua \luatex_directlua:D
+ \@@_primitive:NN \dviextension \luatex_dviextension:D
+ \@@_primitive:NN \dvifeedback \luatex_dvifeedback:D
+ \@@_primitive:NN \dvivariable \luatex_dvivariable:D
+ \@@_primitive:NN \etoksapp \luatex_etoksapp:D
+ \@@_primitive:NN \etokspre \luatex_etokspre:D
+ \@@_primitive:NN \explicithyphenpenalty
+ \luatex_explicithyphenpenalty:D
+ \@@_primitive:NN \expanded \luatex_expanded:D
+ \@@_primitive:NN \explicitdiscretionary
+ \luatex_explicitdiscretionary:D
+ \@@_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
+ \@@_primitive:NN \fontid \luatex_fontid:D
+ \@@_primitive:NN \formatname \luatex_formatname:D
+ \@@_primitive:NN \hjcode \luatex_hjcode:D
+ \@@_primitive:NN \hpack \luatex_hpack:D
+ \@@_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
+ \@@_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
+ \@@_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
+ \@@_primitive:NN \gleaders \luatex_gleaders:D
+ \@@_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
+ \@@_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
+ \@@_primitive:NN \latelua \luatex_latelua:D
+ \@@_primitive:NN \letcharcode \luatex_letcharcode:D
+ \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D
+ \@@_primitive:NN \luafunction \luatex_luafunction:D
+ \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D
+ \@@_primitive:NN \luatexrevision \luatex_luatexrevision:D
+ \@@_primitive:NN \luatexversion \luatex_luatexversion:D
+ \@@_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
+ \@@_primitive:NN \mathdisplayskipmode
+ \luatex_mathdisplayskipmode:D
+ \@@_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
+ \@@_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
+ \@@_primitive:NN \mathoption \luatex_mathoption:D
+ \@@_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
+ \@@_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
+ \@@_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
+ \@@_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
+ \@@_primitive:NN \mathstyle \luatex_mathstyle:D
+ \@@_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
+ \@@_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
+ \@@_primitive:NN \nohrule \luatex_nohrule:D
+ \@@_primitive:NN \nokerns \luatex_nokerns:D
+ \@@_primitive:NN \noligs \luatex_noligs:D
+ \@@_primitive:NN \nospaces \luatex_nospaces:D
+ \@@_primitive:NN \novrule \luatex_novrule:D
+ \@@_primitive:NN \outputbox \luatex_outputbox:D
+ \@@_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
+ \@@_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
+ \@@_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
+ \@@_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
+ \@@_primitive:NN \pdfextension \luatex_pdfextension:D
+ \@@_primitive:NN \pdffeedback \luatex_pdffeedback:D
+ \@@_primitive:NN \pdfvariable \luatex_pdfvariable:D
+ \@@_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
+ \@@_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
+ \@@_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
+ \@@_primitive:NN \predisplaygapfactor
+ \luatex_predisplaygapfactor:D
+ \@@_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
+ \@@_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
+ \@@_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
+ \@@_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
+ \@@_primitive:NN \scantextokens \luatex_scantextokens:D
+ \@@_primitive:NN \setfontid \luatex_setfontid:D
+ \@@_primitive:NN \shapemode \luatex_shapemode:D
+ \@@_primitive:NN \suppressifcsnameerror
+ \luatex_suppressifcsnameerror:D
+ \@@_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
+ \@@_primitive:NN \suppressmathparerror
+ \luatex_suppressmathparerror:D
+ \@@_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
+ \@@_primitive:NN \suppressprimitiveerror
+ \luatex_suppressprimitiveerror:D
+ \@@_primitive:NN \toksapp \luatex_toksapp:D
+ \@@_primitive:NN \tokspre \luatex_tokspre:D
+ \@@_primitive:NN \tpack \luatex_tpack:D
+ \@@_primitive:NN \vpack \luatex_vpack:D
% \end{macrocode}
% Slightly more awkward are the directional primitives in \LuaTeX{}. These
% come from Omega/Aleph, but we do not support those engines and
@@ -868,50 +889,55 @@
% so it seems most sensible to treat them as \LuaTeX{} primitives for prefix
% purposes. One here is \enquote{new} but fits into the general set.
% \begin{macrocode}
- \@@_primitive:NN \bodydir \luatex_bodydir:D
- \@@_primitive:NN \boxdir \luatex_boxdir:D
- \@@_primitive:NN \leftghost \luatex_leftghost:D
- \@@_primitive:NN \linedir \luatex_linedir:D
- \@@_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
- \@@_primitive:NN \localinterlinepenalty \luatex_localinterlinepenalty:D
- \@@_primitive:NN \localleftbox \luatex_localleftbox:D
- \@@_primitive:NN \localrightbox \luatex_localrightbox:D
- \@@_primitive:NN \mathdir \luatex_mathdir:D
- \@@_primitive:NN \pagedir \luatex_pagedir:D
- \@@_primitive:NN \pardir \luatex_pardir:D
- \@@_primitive:NN \rightghost \luatex_rightghost:D
- \@@_primitive:NN \textdir \luatex_textdir:D
+ \@@_primitive:NN \bodydir \luatex_bodydir:D
+ \@@_primitive:NN \boxdir \luatex_boxdir:D
+ \@@_primitive:NN \leftghost \luatex_leftghost:D
+ \@@_primitive:NN \linedir \luatex_linedir:D
+ \@@_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
+ \@@_primitive:NN \localinterlinepenalty
+ \luatex_localinterlinepenalty:D
+ \@@_primitive:NN \localleftbox \luatex_localleftbox:D
+ \@@_primitive:NN \localrightbox \luatex_localrightbox:D
+ \@@_primitive:NN \mathdir \luatex_mathdir:D
+ \@@_primitive:NN \pagedir \luatex_pagedir:D
+ \@@_primitive:NN \pardir \luatex_pardir:D
+ \@@_primitive:NN \rightghost \luatex_rightghost:D
+ \@@_primitive:NN \textdir \luatex_textdir:D
% \end{macrocode}
% Primitives from \pdfTeX{} that \LuaTeX{} renames.
% \begin{macrocode}
- \@@_primitive:NN \adjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \copyfont \pdftex_copyfont:D
- \@@_primitive:NN \draftmode \pdftex_draftmode:D
- \@@_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
- \@@_primitive:NN \ifabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ignoreligaturesinfont \pdftex_ignoreligaturesinfont:D
- \@@_primitive:NN \insertht \pdftex_insertht:D
- \@@_primitive:NN \lastsavedboxresourceindex \pdftex_pdflastxform:D
- \@@_primitive:NN \lastsavedimageresourceindex \pdftex_pdflastximage:D
- \@@_primitive:NN \lastsavedimageresourcepages \pdftex_pdflastximagepages:D
- \@@_primitive:NN \lastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \lastypos \pdftex_lastypos:D
- \@@_primitive:NN \normaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \outputmode \pdftex_pdfoutput:D
- \@@_primitive:NN \pageheight \pdftex_pageheight:D
- \@@_primitive:NN \pagewidth \pdftex_pagewith:D
- \@@_primitive:NN \protrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \randomseed \pdftex_randomseed:D
- \@@_primitive:NN \useboxresource \pdftex_pdfrefxform:D
- \@@_primitive:NN \useimageresource \pdftex_pdfrefximage:D
- \@@_primitive:NN \savepos \pdftex_savepos:D
- \@@_primitive:NN \saveboxresource \pdftex_pdfxform:D
- \@@_primitive:NN \saveimageresource \pdftex_pdfximage:D
- \@@_primitive:NN \setrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \tracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
+ \@@_primitive:NN \adjustspacing \pdftex_adjustspacing:D
+ \@@_primitive:NN \copyfont \pdftex_copyfont:D
+ \@@_primitive:NN \draftmode \pdftex_draftmode:D
+ \@@_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
+ \@@_primitive:NN \ifabsdim \pdftex_ifabsdim:D
+ \@@_primitive:NN \ifabsnum \pdftex_ifabsnum:D
+ \@@_primitive:NN \ignoreligaturesinfont
+ \pdftex_ignoreligaturesinfont:D
+ \@@_primitive:NN \insertht \pdftex_insertht:D
+ \@@_primitive:NN \lastsavedboxresourceindex
+ \pdftex_pdflastxform:D
+ \@@_primitive:NN \lastsavedimageresourceindex
+ \pdftex_pdflastximage:D
+ \@@_primitive:NN \lastsavedimageresourcepages
+ \pdftex_pdflastximagepages:D
+ \@@_primitive:NN \lastxpos \pdftex_lastxpos:D
+ \@@_primitive:NN \lastypos \pdftex_lastypos:D
+ \@@_primitive:NN \normaldeviate \pdftex_normaldeviate:D
+ \@@_primitive:NN \outputmode \pdftex_pdfoutput:D
+ \@@_primitive:NN \pageheight \pdftex_pageheight:D
+ \@@_primitive:NN \pagewidth \pdftex_pagewith:D
+ \@@_primitive:NN \protrudechars \pdftex_protrudechars:D
+ \@@_primitive:NN \pxdimen \pdftex_pxdimen:D
+ \@@_primitive:NN \randomseed \pdftex_randomseed:D
+ \@@_primitive:NN \useboxresource \pdftex_pdfrefxform:D
+ \@@_primitive:NN \useimageresource \pdftex_pdfrefximage:D
+ \@@_primitive:NN \savepos \pdftex_savepos:D
+ \@@_primitive:NN \saveboxresource \pdftex_pdfxform:D
+ \@@_primitive:NN \saveimageresource \pdftex_pdfximage:D
+ \@@_primitive:NN \setrandomseed \pdftex_setrandomseed:D
+ \@@_primitive:NN \tracingfonts \pdftex_tracingfonts:D
+ \@@_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
% \end{macrocode}
% The set of Unicode math primitives were introduced by \XeTeX{} and \LuaTeX{}
% in a somewhat complex fashion: a few first as |\XeTeX...| which were then
@@ -921,201 +947,225 @@
% and drop |\U(math)| from the names. Where there is a related \TeX{}90
% primitive or where it really seems required we keep the |math| part of the name.
% \begin{macrocode}
- \@@_primitive:NN \Uchar \utex_char:D
- \@@_primitive:NN \Ucharcat \utex_charcat:D
- \@@_primitive:NN \Udelcode \utex_delcode:D
- \@@_primitive:NN \Udelcodenum \utex_delcodenum:D
- \@@_primitive:NN \Udelimiter \utex_delimiter:D
- \@@_primitive:NN \Udelimiterover \utex_delimiterover:D
- \@@_primitive:NN \Udelimiterunder \utex_delimiterunder:D
- \@@_primitive:NN \Uhextensible \utex_hextensible:D
- \@@_primitive:NN \Umathaccent \utex_mathaccent:D
- \@@_primitive:NN \Umathaxis \utex_mathaxis:D
- \@@_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
- \@@_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
- \@@_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
- \@@_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
- \@@_primitive:NN \Umathbinopspacing \utex_binopspacing:D
- \@@_primitive:NN \Umathbinordspacing \utex_binordspacing:D
- \@@_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
- \@@_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
- \@@_primitive:NN \Umathchar \utex_mathchar:D
- \@@_primitive:NN \Umathcharclass \utex_mathcharclass:D
- \@@_primitive:NN \Umathchardef \utex_mathchardef:D
- \@@_primitive:NN \Umathcharfam \utex_mathcharfam:D
- \@@_primitive:NN \Umathcharnum \utex_mathcharnum:D
- \@@_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
- \@@_primitive:NN \Umathcharslot \utex_mathcharslot:D
- \@@_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
- \@@_primitive:NN \Umathcloseclosespacing \utex_closeclosespacing:D
- \@@_primitive:NN \Umathcloseinnerspacing \utex_closeinnerspacing:D
- \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
- \@@_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
- \@@_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
- \@@_primitive:NN \Umathclosepunctspacing \utex_closepunctspacing:D
- \@@_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
- \@@_primitive:NN \Umathcode \utex_mathcode:D
- \@@_primitive:NN \Umathcodenum \utex_mathcodenum:D
- \@@_primitive:NN \Umathconnectoroverlapmin \utex_connectoroverlapmin:D
- \@@_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
- \@@_primitive:NN \Umathfractiondenomdown \utex_fractiondenomdown:D
- \@@_primitive:NN \Umathfractiondenomvgap \utex_fractiondenomvgap:D
- \@@_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
- \@@_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
- \@@_primitive:NN \Umathfractionrule \utex_fractionrule:D
- \@@_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
- \@@_primitive:NN \Umathinnerclosespacing \utex_innerclosespacing:D
- \@@_primitive:NN \Umathinnerinnerspacing \utex_innerinnerspacing:D
- \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
- \@@_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
- \@@_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
- \@@_primitive:NN \Umathinnerpunctspacing \utex_innerpunctspacing:D
- \@@_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
- \@@_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
- \@@_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
- \@@_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
- \@@_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
- \@@_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
- \@@_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
- \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
- \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
- \@@_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
- \@@_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
- \@@_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
- \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
- \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
- \@@_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
- \@@_primitive:NN \Umathopenopspacing \utex_openopspacing:D
- \@@_primitive:NN \Umathopenordspacing \utex_openordspacing:D
- \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
- \@@_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
- \@@_primitive:NN \Umathoperatorsize \utex_operatorsize:D
- \@@_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
- \@@_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
- \@@_primitive:NN \Umathopopspacing \utex_opopspacing:D
- \@@_primitive:NN \Umathopordspacing \utex_opordspacing:D
- \@@_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
- \@@_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
- \@@_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
- \@@_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
- \@@_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
- \@@_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
- \@@_primitive:NN \Umathordopspacing \utex_ordopspacing:D
- \@@_primitive:NN \Umathordordspacing \utex_ordordspacing:D
- \@@_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
- \@@_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
- \@@_primitive:NN \Umathoverbarkern \utex_overbarkern:D
- \@@_primitive:NN \Umathoverbarrule \utex_overbarrule:D
- \@@_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
- \@@_primitive:NN \Umathoverdelimiterbgap \utex_overdelimiterbgap:D
- \@@_primitive:NN \Umathoverdelimitervgap \utex_overdelimitervgap:D
- \@@_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
- \@@_primitive:NN \Umathpunctclosespacing \utex_punctclosespacing:D
- \@@_primitive:NN \Umathpunctinnerspacing \utex_punctinnerspacing:D
- \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
- \@@_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
- \@@_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
- \@@_primitive:NN \Umathpunctpunctspacing \utex_punctpunctspacing:D
- \@@_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
- \@@_primitive:NN \Umathquad \utex_quad:D
- \@@_primitive:NN \Umathradicaldegreeafter \utex_radicaldegreeafter:D
- \@@_primitive:NN \Umathradicaldegreebefore \utex_radicaldegreebefore:D
- \@@_primitive:NN \Umathradicaldegreeraise \utex_radicaldegreeraise:D
- \@@_primitive:NN \Umathradicalkern \utex_radicalkern:D
- \@@_primitive:NN \Umathradicalrule \utex_radicalrule:D
- \@@_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
- \@@_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
- \@@_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
- \@@_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
- \@@_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
- \@@_primitive:NN \Umathrelopspacing \utex_relopspacing:D
- \@@_primitive:NN \Umathrelordspacing \utex_relordspacing:D
- \@@_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
- \@@_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
- \@@_primitive:NN \Umathskewedfractionhgap \utex_skewedfractionhgap:D
- \@@_primitive:NN \Umathskewedfractionvgap \utex_skewedfractionvgap:D
- \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
- \@@_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
- \@@_primitive:NN \Umathstacknumup \utex_stacknumup:D
- \@@_primitive:NN \Umathstackvgap \utex_stackvgap:D
- \@@_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
- \@@_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
- \@@_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
- \@@_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
- \@@_primitive:NN \Umathsubtopmax \utex_subtopmax:D
- \@@_primitive:NN \Umathsupbottommin \utex_supbottommin:D
- \@@_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
- \@@_primitive:NN \Umathsupshiftup \utex_supshiftup:D
- \@@_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
- \@@_primitive:NN \Umathunderbarkern \utex_underbarkern:D
- \@@_primitive:NN \Umathunderbarrule \utex_underbarrule:D
- \@@_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
- \@@_primitive:NN \Umathunderdelimiterbgap \utex_underdelimiterbgap:D
- \@@_primitive:NN \Umathunderdelimitervgap \utex_underdelimitervgap:D
- \@@_primitive:NN \Unosubscript \utex_Unosubscript:D
- \@@_primitive:NN \Unosuperscript \utex_Unosuperscript:D
- \@@_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
- \@@_primitive:NN \Uradical \utex_radical:D
- \@@_primitive:NN \Uroot \utex_root:D
- \@@_primitive:NN \Uskewed \utex_skewed:D
- \@@_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
- \@@_primitive:NN \Ustack \utex_stack:D
- \@@_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
- \@@_primitive:NN \Ustartmath \utex_startmath:D
- \@@_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
- \@@_primitive:NN \Ustopmath \utex_stopmath:D
- \@@_primitive:NN \Usubscript \utex_subscript:D
- \@@_primitive:NN \Usuperscript \utex_superscript:D
- \@@_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
- \@@_primitive:NN \Uvextensible \utex_vextensible:D
+ \@@_primitive:NN \Uchar \utex_char:D
+ \@@_primitive:NN \Ucharcat \utex_charcat:D
+ \@@_primitive:NN \Udelcode \utex_delcode:D
+ \@@_primitive:NN \Udelcodenum \utex_delcodenum:D
+ \@@_primitive:NN \Udelimiter \utex_delimiter:D
+ \@@_primitive:NN \Udelimiterover \utex_delimiterover:D
+ \@@_primitive:NN \Udelimiterunder \utex_delimiterunder:D
+ \@@_primitive:NN \Uhextensible \utex_hextensible:D
+ \@@_primitive:NN \Umathaccent \utex_mathaccent:D
+ \@@_primitive:NN \Umathaxis \utex_mathaxis:D
+ \@@_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
+ \@@_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
+ \@@_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
+ \@@_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
+ \@@_primitive:NN \Umathbinopspacing \utex_binopspacing:D
+ \@@_primitive:NN \Umathbinordspacing \utex_binordspacing:D
+ \@@_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
+ \@@_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
+ \@@_primitive:NN \Umathchar \utex_mathchar:D
+ \@@_primitive:NN \Umathcharclass \utex_mathcharclass:D
+ \@@_primitive:NN \Umathchardef \utex_mathchardef:D
+ \@@_primitive:NN \Umathcharfam \utex_mathcharfam:D
+ \@@_primitive:NN \Umathcharnum \utex_mathcharnum:D
+ \@@_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
+ \@@_primitive:NN \Umathcharslot \utex_mathcharslot:D
+ \@@_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
+ \@@_primitive:NN \Umathcloseclosespacing
+ \utex_closeclosespacing:D
+ \@@_primitive:NN \Umathcloseinnerspacing
+ \utex_closeinnerspacing:D
+ \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
+ \@@_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
+ \@@_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
+ \@@_primitive:NN \Umathclosepunctspacing
+ \utex_closepunctspacing:D
+ \@@_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
+ \@@_primitive:NN \Umathcode \utex_mathcode:D
+ \@@_primitive:NN \Umathcodenum \utex_mathcodenum:D
+ \@@_primitive:NN \Umathconnectoroverlapmin
+ \utex_connectoroverlapmin:D
+ \@@_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
+ \@@_primitive:NN \Umathfractiondenomdown
+ \utex_fractiondenomdown:D
+ \@@_primitive:NN \Umathfractiondenomvgap
+ \utex_fractiondenomvgap:D
+ \@@_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
+ \@@_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
+ \@@_primitive:NN \Umathfractionrule \utex_fractionrule:D
+ \@@_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
+ \@@_primitive:NN \Umathinnerclosespacing
+ \utex_innerclosespacing:D
+ \@@_primitive:NN \Umathinnerinnerspacing
+ \utex_innerinnerspacing:D
+ \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
+ \@@_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
+ \@@_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
+ \@@_primitive:NN \Umathinnerpunctspacing
+ \utex_innerpunctspacing:D
+ \@@_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
+ \@@_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
+ \@@_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
+ \@@_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
+ \@@_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
+ \@@_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
+ \@@_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
+ \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
+ \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
+ \@@_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
+ \@@_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
+ \@@_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
+ \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
+ \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
+ \@@_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
+ \@@_primitive:NN \Umathopenopspacing \utex_openopspacing:D
+ \@@_primitive:NN \Umathopenordspacing \utex_openordspacing:D
+ \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
+ \@@_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
+ \@@_primitive:NN \Umathoperatorsize \utex_operatorsize:D
+ \@@_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
+ \@@_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
+ \@@_primitive:NN \Umathopopspacing \utex_opopspacing:D
+ \@@_primitive:NN \Umathopordspacing \utex_opordspacing:D
+ \@@_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
+ \@@_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
+ \@@_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
+ \@@_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
+ \@@_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
+ \@@_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
+ \@@_primitive:NN \Umathordopspacing \utex_ordopspacing:D
+ \@@_primitive:NN \Umathordordspacing \utex_ordordspacing:D
+ \@@_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
+ \@@_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
+ \@@_primitive:NN \Umathoverbarkern \utex_overbarkern:D
+ \@@_primitive:NN \Umathoverbarrule \utex_overbarrule:D
+ \@@_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
+ \@@_primitive:NN \Umathoverdelimiterbgap
+ \utex_overdelimiterbgap:D
+ \@@_primitive:NN \Umathoverdelimitervgap
+ \utex_overdelimitervgap:D
+ \@@_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
+ \@@_primitive:NN \Umathpunctclosespacing
+ \utex_punctclosespacing:D
+ \@@_primitive:NN \Umathpunctinnerspacing
+ \utex_punctinnerspacing:D
+ \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
+ \@@_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
+ \@@_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
+ \@@_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
+ \@@_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
+ \@@_primitive:NN \Umathquad \utex_quad:D
+ \@@_primitive:NN \Umathradicaldegreeafter
+ \utex_radicaldegreeafter:D
+ \@@_primitive:NN \Umathradicaldegreebefore
+ \utex_radicaldegreebefore:D
+ \@@_primitive:NN \Umathradicaldegreeraise
+ \utex_radicaldegreeraise:D
+ \@@_primitive:NN \Umathradicalkern \utex_radicalkern:D
+ \@@_primitive:NN \Umathradicalrule \utex_radicalrule:D
+ \@@_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
+ \@@_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
+ \@@_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
+ \@@_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
+ \@@_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
+ \@@_primitive:NN \Umathrelopspacing \utex_relopspacing:D
+ \@@_primitive:NN \Umathrelordspacing \utex_relordspacing:D
+ \@@_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
+ \@@_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
+ \@@_primitive:NN \Umathskewedfractionhgap
+ \utex_skewedfractionhgap:D
+ \@@_primitive:NN \Umathskewedfractionvgap
+ \utex_skewedfractionvgap:D
+ \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
+ \@@_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
+ \@@_primitive:NN \Umathstacknumup \utex_stacknumup:D
+ \@@_primitive:NN \Umathstackvgap \utex_stackvgap:D
+ \@@_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
+ \@@_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
+ \@@_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
+ \@@_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
+ \@@_primitive:NN \Umathsubtopmax \utex_subtopmax:D
+ \@@_primitive:NN \Umathsupbottommin \utex_supbottommin:D
+ \@@_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
+ \@@_primitive:NN \Umathsupshiftup \utex_supshiftup:D
+ \@@_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
+ \@@_primitive:NN \Umathunderbarkern \utex_underbarkern:D
+ \@@_primitive:NN \Umathunderbarrule \utex_underbarrule:D
+ \@@_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
+ \@@_primitive:NN \Umathunderdelimiterbgap
+ \utex_underdelimiterbgap:D
+ \@@_primitive:NN \Umathunderdelimitervgap
+ \utex_underdelimitervgap:D
+ \@@_primitive:NN \Unosubscript \utex_nosubscript:D
+ \@@_primitive:NN \Unosuperscript \utex_nosuperscript:D
+ \@@_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
+ \@@_primitive:NN \Uradical \utex_radical:D
+ \@@_primitive:NN \Uroot \utex_root:D
+ \@@_primitive:NN \Uskewed \utex_skewed:D
+ \@@_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
+ \@@_primitive:NN \Ustack \utex_stack:D
+ \@@_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
+ \@@_primitive:NN \Ustartmath \utex_startmath:D
+ \@@_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
+ \@@_primitive:NN \Ustopmath \utex_stopmath:D
+ \@@_primitive:NN \Usubscript \utex_subscript:D
+ \@@_primitive:NN \Usuperscript \utex_superscript:D
+ \@@_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
+ \@@_primitive:NN \Uvextensible \utex_vextensible:D
% \end{macrocode}
-% Primitives from p\TeX{}.
+% Primitives from \pTeX{}.
% \begin{macrocode}
- \@@_primitive:NN \autospacing \ptex_autospacing:D
- \@@_primitive:NN \autoxspacing \ptex_autoxspacing:D
- \@@_primitive:NN \dtou \ptex_dtou:D
- \@@_primitive:NN \euc \ptex_euc:D
- \@@_primitive:NN \ifdbox \ptex_ifdbox:D
- \@@_primitive:NN \ifddir \ptex_ifddir:D
- \@@_primitive:NN \ifmdir \ptex_ifmdir:D
- \@@_primitive:NN \iftbox \ptex_iftbox:D
- \@@_primitive:NN \iftdir \ptex_iftdir:D
- \@@_primitive:NN \ifybox \ptex_ifybox:D
- \@@_primitive:NN \ifydir \ptex_ifydir:D
- \@@_primitive:NN \inhibitglue \ptex_inhibitglue:D
- \@@_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
- \@@_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
- \@@_primitive:NN \jfam \ptex_jfam:D
- \@@_primitive:NN \jfont \ptex_jfont:D
- \@@_primitive:NN \jis \ptex_jis:D
- \@@_primitive:NN \kanjiskip \ptex_kanjiskip:D
- \@@_primitive:NN \kansuji \ptex_kansuji:D
- \@@_primitive:NN \kansujichar \ptex_kansujichar:D
- \@@_primitive:NN \kcatcode \ptex_kcatcode:D
- \@@_primitive:NN \kuten \ptex_kuten:D
- \@@_primitive:NN \noautospacing \ptex_noautospacing:D
- \@@_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
- \@@_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
- \@@_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
- \@@_primitive:NN \showmode \ptex_showmode:D
- \@@_primitive:NN \sjis \ptex_sjis:D
- \@@_primitive:NN \tate \ptex_tate:D
- \@@_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
- \@@_primitive:NN \tfont \ptex_tfont:D
- \@@_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
- \@@_primitive:NN \xspcode \ptex_xspcode:D
- \@@_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
- \@@_primitive:NN \yoko \ptex_yoko:D
+ \@@_primitive:NN \autospacing \ptex_autospacing:D
+ \@@_primitive:NN \autoxspacing \ptex_autoxspacing:D
+ \@@_primitive:NN \dtou \ptex_dtou:D
+ \@@_primitive:NN \epTeXinputencoding \ptex_inputencoding:D
+ \@@_primitive:NN \epTeXversion \ptex_epTeXversion:D
+ \@@_primitive:NN \euc \ptex_euc:D
+ \@@_primitive:NN \ifdbox \ptex_ifdbox:D
+ \@@_primitive:NN \ifddir \ptex_ifddir:D
+ \@@_primitive:NN \ifmdir \ptex_ifmdir:D
+ \@@_primitive:NN \iftbox \ptex_iftbox:D
+ \@@_primitive:NN \iftdir \ptex_iftdir:D
+ \@@_primitive:NN \ifybox \ptex_ifybox:D
+ \@@_primitive:NN \ifydir \ptex_ifydir:D
+ \@@_primitive:NN \inhibitglue \ptex_inhibitglue:D
+ \@@_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
+ \@@_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
+ \@@_primitive:NN \jfam \ptex_jfam:D
+ \@@_primitive:NN \jfont \ptex_jfont:D
+ \@@_primitive:NN \jis \ptex_jis:D
+ \@@_primitive:NN \kanjiskip \ptex_kanjiskip:D
+ \@@_primitive:NN \kansuji \ptex_kansuji:D
+ \@@_primitive:NN \kansujichar \ptex_kansujichar:D
+ \@@_primitive:NN \kcatcode \ptex_kcatcode:D
+ \@@_primitive:NN \kuten \ptex_kuten:D
+ \@@_primitive:NN \noautospacing \ptex_noautospacing:D
+ \@@_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
+ \@@_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
+ \@@_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
+ \@@_primitive:NN \ptexversion \ptex_ptexversion:D
+ \@@_primitive:NN \showmode \ptex_showmode:D
+ \@@_primitive:NN \sjis \ptex_sjis:D
+ \@@_primitive:NN \tate \ptex_tate:D
+ \@@_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
+ \@@_primitive:NN \tfont \ptex_tfont:D
+ \@@_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
+ \@@_primitive:NN \xspcode \ptex_xspcode:D
+ \@@_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
+ \@@_primitive:NN \yoko \ptex_yoko:D
% \end{macrocode}
-% Primitives from up\TeX{}.
+% Primitives from \upTeX{}.
% \begin{macrocode}
- \@@_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
- \@@_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
- \@@_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
- \@@_primitive:NN \kchar \uptex_kchar:D
- \@@_primitive:NN \kchardef \uptex_kchardef:D
- \@@_primitive:NN \kuten \uptex_kuten:D
- \@@_primitive:NN \ucs \uptex_ucs:D
+ \@@_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
+ \@@_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
+ \@@_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
+ \@@_primitive:NN \kchar \uptex_kchar:D
+ \@@_primitive:NN \kchardef \uptex_kchardef:D
+ \@@_primitive:NN \kuten \uptex_kuten:D
+ \@@_primitive:NN \ucs \uptex_ucs:D
+ \@@_primitive:NN \uptexversion \uptex_uptexversion:D
% \end{macrocode}
% End of the \enquote{just the names} part of the source.
% \begin{macrocode}
@@ -1186,7 +1236,7 @@
% this simply as \tn{tracingfonts}, but that is overwritten by
% the \LaTeXe{} kernel. So any spurious definition has to be removed, then
% the real version saved either from the \pdfTeX{} name or from \LuaTeX{}.
-% In the latter case, we leave \tn{@@@@tracingfonts} available: this might
+% In the latter case, we leave \tn{@@tracingfonts} available: this might
% be useful and almost all \LaTeXe{} users will have \pkg{expl3} loaded by
% \pkg{fontspec}. (We follow the usual kernel convention that |@@| is used
% for saved primitives.)
@@ -1207,60 +1257,65 @@
% that get the right names anyway so are missing here!
% \begin{macrocode}
\etex_ifdefined:D \luatexsuppressfontnotfounderror
- \tex_let:D \luatex_alignmark:D \luatexalignmark
- \tex_let:D \luatex_aligntab:D \luatexaligntab
- \tex_let:D \luatex_attribute:D \luatexattribute
- \tex_let:D \luatex_attributedef:D \luatexattributedef
- \tex_let:D \luatex_catcodetable:D \luatexcatcodetable
- \tex_let:D \luatex_clearmarks:D \luatexclearmarks
- \tex_let:D \luatex_crampeddisplaystyle:D \luatexcrampeddisplaystyle
- \tex_let:D \luatex_crampedscriptscriptstyle:D \luatexcrampedscriptscriptstyle
- \tex_let:D \luatex_crampedscriptstyle:D \luatexcrampedscriptstyle
- \tex_let:D \luatex_crampedtextstyle:D \luatexcrampedtextstyle
- \tex_let:D \luatex_fontid:D \luatexfontid
- \tex_let:D \luatex_formatname:D \luatexformatname
- \tex_let:D \luatex_gleaders:D \luatexgleaders
- \tex_let:D \luatex_initcatcodetable:D \luatexinitcatcodetable
- \tex_let:D \luatex_latelua:D \luatexlatelua
- \tex_let:D \luatex_luaescapestring:D \luatexluaescapestring
- \tex_let:D \luatex_luafunction:D \luatexluafunction
- \tex_let:D \luatex_mathstyle:D \luatexmathstyle
- \tex_let:D \luatex_nokerns:D \luatexnokerns
- \tex_let:D \luatex_noligs:D \luatexnoligs
- \tex_let:D \luatex_outputbox:D \luatexoutputbox
- \tex_let:D \luatex_pageleftoffset:D \luatexpageleftoffset
- \tex_let:D \luatex_pagetopoffset:D \luatexpagetopoffset
- \tex_let:D \luatex_postexhyphenchar:D \luatexpostexhyphenchar
- \tex_let:D \luatex_posthyphenchar:D \luatexposthyphenchar
- \tex_let:D \luatex_preexhyphenchar:D \luatexpreexhyphenchar
- \tex_let:D \luatex_prehyphenchar:D \luatexprehyphenchar
- \tex_let:D \luatex_savecatcodetable:D \luatexsavecatcodetable
- \tex_let:D \luatex_scantextokens:D \luatexscantextokens
- \tex_let:D \luatex_suppressifcsnameerror:D \luatexsuppressifcsnameerror
- \tex_let:D \luatex_suppresslongerror:D \luatexsuppresslongerror
- \tex_let:D \luatex_suppressmathparerror:D \luatexsuppressmathparerror
- \tex_let:D \luatex_suppressoutererror:D \luatexsuppressoutererror
- \tex_let:D \utex_char:D \luatexUchar
- \tex_let:D \xetex_suppressfontnotfounderror:D \luatexsuppressfontnotfounderror
+ \tex_let:D \luatex_alignmark:D \luatexalignmark
+ \tex_let:D \luatex_aligntab:D \luatexaligntab
+ \tex_let:D \luatex_attribute:D \luatexattribute
+ \tex_let:D \luatex_attributedef:D \luatexattributedef
+ \tex_let:D \luatex_catcodetable:D \luatexcatcodetable
+ \tex_let:D \luatex_clearmarks:D \luatexclearmarks
+ \tex_let:D \luatex_crampeddisplaystyle:D \luatexcrampeddisplaystyle
+ \tex_let:D \luatex_crampedscriptscriptstyle:D
+ \luatexcrampedscriptscriptstyle
+ \tex_let:D \luatex_crampedscriptstyle:D \luatexcrampedscriptstyle
+ \tex_let:D \luatex_crampedtextstyle:D \luatexcrampedtextstyle
+ \tex_let:D \luatex_fontid:D \luatexfontid
+ \tex_let:D \luatex_formatname:D \luatexformatname
+ \tex_let:D \luatex_gleaders:D \luatexgleaders
+ \tex_let:D \luatex_initcatcodetable:D \luatexinitcatcodetable
+ \tex_let:D \luatex_latelua:D \luatexlatelua
+ \tex_let:D \luatex_luaescapestring:D \luatexluaescapestring
+ \tex_let:D \luatex_luafunction:D \luatexluafunction
+ \tex_let:D \luatex_mathstyle:D \luatexmathstyle
+ \tex_let:D \luatex_nokerns:D \luatexnokerns
+ \tex_let:D \luatex_noligs:D \luatexnoligs
+ \tex_let:D \luatex_outputbox:D \luatexoutputbox
+ \tex_let:D \luatex_pageleftoffset:D \luatexpageleftoffset
+ \tex_let:D \luatex_pagetopoffset:D \luatexpagetopoffset
+ \tex_let:D \luatex_postexhyphenchar:D \luatexpostexhyphenchar
+ \tex_let:D \luatex_posthyphenchar:D \luatexposthyphenchar
+ \tex_let:D \luatex_preexhyphenchar:D \luatexpreexhyphenchar
+ \tex_let:D \luatex_prehyphenchar:D \luatexprehyphenchar
+ \tex_let:D \luatex_savecatcodetable:D \luatexsavecatcodetable
+ \tex_let:D \luatex_scantextokens:D \luatexscantextokens
+ \tex_let:D \luatex_suppressifcsnameerror:D
+ \luatexsuppressifcsnameerror
+ \tex_let:D \luatex_suppresslongerror:D \luatexsuppresslongerror
+ \tex_let:D \luatex_suppressmathparerror:D
+ \luatexsuppressmathparerror
+ \tex_let:D \luatex_suppressoutererror:D \luatexsuppressoutererror
+ \tex_let:D \utex_char:D \luatexUchar
+ \tex_let:D \xetex_suppressfontnotfounderror:D
+ \luatexsuppressfontnotfounderror
% \end{macrocode}
% Which also covers those slightly odd ones.
% \begin{macrocode}
- \tex_let:D \luatex_bodydir:D \luatexbodydir
- \tex_let:D \luatex_boxdir:D \luatexboxdir
- \tex_let:D \luatex_leftghost:D \luatexleftghost
- \tex_let:D \luatex_localbrokenpenalty:D \luatexlocalbrokenpenalty
- \tex_let:D \luatex_localinterlinepenalty:D \luatexlocalinterlinepenalty
- \tex_let:D \luatex_localleftbox:D \luatexlocalleftbox
- \tex_let:D \luatex_localrightbox:D \luatexlocalrightbox
- \tex_let:D \luatex_mathdir:D \luatexmathdir
- \tex_let:D \luatex_pagebottomoffset:D \luatexpagebottomoffset
- \tex_let:D \luatex_pagedir:D \luatexpagedir
- \tex_let:D \pdftex_pageheight:D \luatexpageheight
- \tex_let:D \luatex_pagerightoffset:D \luatexpagerightoffset
- \tex_let:D \pdftex_pagewidth:D \luatexpagewidth
- \tex_let:D \luatex_pardir:D \luatexpardir
- \tex_let:D \luatex_rightghost:D \luatexrightghost
- \tex_let:D \luatex_textdir:D \luatextextdir
+ \tex_let:D \luatex_bodydir:D \luatexbodydir
+ \tex_let:D \luatex_boxdir:D \luatexboxdir
+ \tex_let:D \luatex_leftghost:D \luatexleftghost
+ \tex_let:D \luatex_localbrokenpenalty:D \luatexlocalbrokenpenalty
+ \tex_let:D \luatex_localinterlinepenalty:D
+ \luatexlocalinterlinepenalty
+ \tex_let:D \luatex_localleftbox:D \luatexlocalleftbox
+ \tex_let:D \luatex_localrightbox:D \luatexlocalrightbox
+ \tex_let:D \luatex_mathdir:D \luatexmathdir
+ \tex_let:D \luatex_pagebottomoffset:D \luatexpagebottomoffset
+ \tex_let:D \luatex_pagedir:D \luatexpagedir
+ \tex_let:D \pdftex_pageheight:D \luatexpageheight
+ \tex_let:D \luatex_pagerightoffset:D \luatexpagerightoffset
+ \tex_let:D \pdftex_pagewidth:D \luatexpagewidth
+ \tex_let:D \luatex_pardir:D \luatexpardir
+ \tex_let:D \luatex_rightghost:D \luatexrightghost
+ \tex_let:D \luatex_textdir:D \luatextextdir
\tex_fi:D
% \end{macrocode}
% Only \pdfTeX{} and \LuaTeX{} define \tn{pdfmapfile} and \tn{pdfmapline}:
@@ -1306,10 +1361,10 @@
%</initex|package>
% \end{macrocode}
%
-% For Con\TeX{}t, two tests are needed. Both Mark~II and Mark~IV move several
+% For \ConTeXt{}, two tests are needed. Both Mark~II and Mark~IV move several
% primitives: these are all covered by the first test, again using \cs{end}
% as a marker. For Mark~IV, a few more primitives are moved: they are
-% implemented using some Lua code in the current Con\TeX{}t.
+% implemented using some Lua code in the current \ConTeXt{}.
% \begin{macrocode}
%<*package>
\etex_ifdefined:D \normalend
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -42,7 +42,7 @@
% }
%
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -654,73 +654,60 @@
% branches according to the result.
% \end{function}
%
-% \section{Internal programming functions}
+% \section{Nestable recursions and mappings}
%
-% \begin{function}[updated = 2011-08-11, EXP]
-% {\group_align_safe_begin:, \group_align_safe_end:}
-% \begin{syntax}
-% \cs{group_align_safe_begin:}
-% \ldots
-% \cs{group_align_safe_end:}
-% \end{syntax}
-% These functions are used to enclose material in a \TeX{} alignment
-% environment within a specially-constructed group. This group is
-% designed in such a way that it does not add brace groups to the
-% output but does act as a group for the |&| token inside
-% \tn{halign}. This is necessary to allow grabbing of tokens
-% for testing purposes, as \TeX{} uses group level to determine the
-% effect of alignment tokens. Without the special grouping, the use of
-% a function such as \cs{peek_after:Nw} would result in a forbidden
-% comparison of the internal \tn{endtemplate} token, yielding a
-% fatal error. Each \cs{group_align_safe_begin:} must be matched by a
-% \cs{group_align_safe_end:}, although this does not have to occur
-% within the same function.
-% \end{function}
+% There are a number of places where recursion or mapping constructs are used in
+% \pkg{expl3}. At a low-level, these typically require insertion of tokens
+% at the end of the content to allow \enquote{clean up}. To support such
+% mappings in a nestable form, the following functions are provided.
%
-% \begin{function}[EXP]{\__prg_break_point:Nn}
+% \begin{function}[EXP, added = 2018-03-26]{\prg_break_point:Nn}
% \begin{syntax}
-% \cs{__prg_break_point:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{code}
+% \cs{prg_break_point:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{code}
% \end{syntax}
% Used to mark the end of a recursion or mapping: the functions
-% \cs[no-index]{\meta{type}_map_break:} and \cs[no-index]{\meta{type}_map_break:n} use
-% this to break out of the loop. After the loop ends, the
-% \meta{code} is inserted into the input stream. This occurs even
-% if the break functions are \emph{not} applied:
-% \cs{__prg_break_point:Nn} is functionally-equivalent in these cases
+% \cs[no-index]{\meta{type}_map_break:} and
+% \cs[no-index]{\meta{type}_map_break:n} use this to break out of the loop
+% (see \cs{prg_map_break:Nn} for how to set these up).
+% After the loop ends, the \meta{code} is inserted into the input stream. This
+% occurs even if the break functions are \emph{not} applied:
+% \cs{prg_break_point:Nn} is functionally-equivalent in these cases
% to \cs{use_ii:nn}.
% \end{function}
%
-% \begin{function}[EXP]{\__prg_map_break:Nn}
+% \begin{function}[EXP, added = 2018-03-26]{\prg_map_break:Nn}
% \begin{syntax}
-% \cs{__prg_map_break:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{user code}
+% \cs{prg_map_break:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{user code}
% \ldots{}
-% \cs{__prg_break_point:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{ending code}
+% \cs{prg_break_point:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{ending code}
% \end{syntax}
% Breaks a recursion in mapping contexts, inserting in the input
% stream the \meta{user code} after the \meta{ending code} for the
% loop. The function breaks loops, inserting their \meta{ending
-% code}, until reaching a loop with the same \meta{type} as its
-% first argument. This \cs[no-index]{\meta{type}_map_break:} argument is simply
-% used as a recognizable marker for the \meta{type}.
+% code}, until reaching a loop with the same \meta{type} as its
+% first argument. This \cs[no-index]{\meta{type}_map_break:} argument
+% must be defined; it is simply used as a recognizable marker for the \meta{type}.
+%
+% For types with mappings defined in the kernel,
+% \cs[no-index]{\meta{type}_map_break:} and \cs[no-index]{\meta{type}_map_break:n}
+% are defined as \cs{prg_map_break:Nn} \cs[no-index]{\meta{type}_map_break:} |{}|
+% and the same with |{}| omitted.
% \end{function}
%
-% \begin{variable}{\g__prg_map_int}
-% This integer is used by non-expandable mapping functions to track
-% the level of nesting in force. The functions \cs{__prg_map_1:w},
-% \cs{__prg_map_2:w}, \emph{etc.}, labelled by \cs{g__prg_map_int}
-% hold functions to be mapped over various list datatypes in inline
-% and variable mappings.
-% \end{variable}
+% \subsection{Simple mappings}
%
-% \begin{function}[EXP]{\__prg_break_point:}
+% In addition to the more complex mappings above, non-nestable mappings are
+% used in a number of locations and support is provided for these.
+%
+% \begin{function}[EXP, added = 2018-03-27]{\prg_break_point:}
% This copy of \cs{prg_do_nothing:} is used to mark the end of a fast
-% short-term recursion: the function \cs{__prg_break:n} uses this to
+% short-term recursion: the function \cs{prg_break:n} uses this to
% break out of the loop.
% \end{function}
%
-% \begin{function}[EXP]{\__prg_break:, \__prg_break:n}
+% \begin{function}[EXP, added = 2018-03-27]{\prg_break:, \prg_break:n}
% \begin{syntax}
-% \cs{__prg_break:n} \Arg{code} \ldots{} \cs{__prg_break_point:}
+% \cs{prg_break:n} \Arg{code} \ldots{} \cs{prg_break_point:}
% \end{syntax}
% Breaks a recursion which has no \meta{ending code} and which is not
% a user-breakable mapping (see for instance \cs{prop_get:Nn}), and
@@ -727,6 +714,29 @@
% inserts the \meta{code} in the input stream.
% \end{function}
%
+% \section{Internal programming functions}
+%
+% \begin{function}[updated = 2011-08-11, EXP]
+% {\group_align_safe_begin:, \group_align_safe_end:}
+% \begin{syntax}
+% \cs{group_align_safe_begin:}
+% \ldots
+% \cs{group_align_safe_end:}
+% \end{syntax}
+% These functions are used to enclose material in a \TeX{} alignment
+% environment within a specially-constructed group. This group is
+% designed in such a way that it does not add brace groups to the
+% output but does act as a group for the |&| token inside
+% \tn{halign}. This is necessary to allow grabbing of tokens
+% for testing purposes, as \TeX{} uses group level to determine the
+% effect of alignment tokens. Without the special grouping, the use of
+% a function such as \cs{peek_after:Nw} would result in a forbidden
+% comparison of the internal \tn{endtemplate} token, yielding a
+% fatal error. Each \cs{group_align_safe_begin:} must be matched by a
+% \cs{group_align_safe_end:}, although this does not have to occur
+% within the same function.
+% \end{function}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -909,7 +919,7 @@
\cs_generate_variant:Nn \bool_log:N { c }
\cs_new_protected:Npn \@@_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{ \exp_args:Nx #1 { \token_to_str:N #2 = \@@_to_str:n {#2} } }
}
% \end{macrocode}
@@ -1068,7 +1078,7 @@
\cs_new:cpn { @@_(:Nw } #1#2
{
\exp_after:wN \@@_choose:NNN \exp_after:wN #1
- \__int_value:w \@@_get_next:NN \use_i:nnnn
+ \int_value:w \@@_get_next:NN \use_i:nnnn
}
% \end{macrocode}
% \end{macro}
@@ -1075,12 +1085,12 @@
%
% \begin{macro}{\@@_p:Nw}
% If what follows GetNext is neither |!| nor |(|, evaluate the
-% predicate using the primitive \cs{__int_value:w}. The canonical
+% predicate using the primitive \cs{int_value:w}. The canonical
% \texttt{true} and \texttt{false} values have numerical values $1$
% and $0$ respectively. Look for And, Or or Close afterwards.
% \begin{macrocode}
\cs_new:cpn { @@_p:Nw } #1
- { \exp_after:wN \@@_choose:NNN \exp_after:wN #1 \__int_value:w }
+ { \exp_after:wN \@@_choose:NNN \exp_after:wN #1 \int_value:w }
% \end{macrocode}
% \end{macro}
%
@@ -1386,7 +1396,7 @@
{
\exp:w
\exp_after:wN \@@_replicate_first:N
- \__int_value:w \__int_eval:n {#1}
+ \int_value:w \int_eval:n {#1}
\cs_end:
}
\cs_new:Npn \@@_replicate:N #1
@@ -1436,7 +1446,8 @@
\cs_new:cpn { @@_replicate_first_6:n } #1 { \exp_end: #1#1#1#1#1#1 }
\cs_new:cpn { @@_replicate_first_7:n } #1 { \exp_end: #1#1#1#1#1#1#1 }
\cs_new:cpn { @@_replicate_first_8:n } #1 { \exp_end: #1#1#1#1#1#1#1#1 }
-\cs_new:cpn { @@_replicate_first_9:n } #1 { \exp_end: #1#1#1#1#1#1#1#1#1 }
+\cs_new:cpn { @@_replicate_first_9:n } #1
+ { \exp_end: #1#1#1#1#1#1#1#1#1 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1522,28 +1533,69 @@
%<@@=prg>
% \end{macrocode}
%
-% \begin{variable}{\g_@@_map_int}
+% \begin{variable}{\g__kernel_prg_map_int}
% A nesting counter for mapping.
% \begin{macrocode}
-\int_new:N \g_@@_map_int
+\int_new:N \g__kernel_prg_map_int
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_break_point:Nn}
-% \begin{macro}{\@@_map_break:Nn}
+% \begin{macro}{\prg_break_point:Nn}
+% \begin{macro}{\prg_map_break:Nn}
% These are defined in \pkg{l3basics}, as they are needed
% \enquote{early}. This is just a reminder that is the case!
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_break_point:}
-% \begin{macro}{\@@_break:, \@@_break:n}
+% \begin{macro}{\prg_break_point:}
+% \begin{macro}{\prg_break:, \prg_break:n}
% Also done in \pkg{l3basics} as in format mode these are needed within
% \pkg{l3alloc}.
% \end{macro}
% \end{macro}
%
+% \subsection{Deprecated functions}
+%
+% \begin{macro}[deprecated = 2019-12-31]{\@@_break_point:Nn}
+% \begin{macro}[deprecated = 2019-12-31]{\@@_break_point:}
+% \begin{macro}[deprecated = 2019-12-31]{\@@_map_break:Nn}
+% \begin{macro}[deprecated = 2019-12-31]{\@@_break:}
+% \begin{macro}[deprecated = 2019-12-31]{\@@_break:n}
+% Made public, but used by a few third-parties. It's not possible to
+% perfectly support a mixture of \cs{@@_map_break:Nn} and
+% \cs{prg_map_break:Nn} because they use different delimiters. The
+% following code only breaks if someone tries to break from two
+% \enquote{old-style} \cs{@@_map_break:Nn} \ldots{}
+% \cs{@@_break_point:Nn} mappings in one go. Basically, the
+% \cs{@@_map_break:Nn} converts a single \cs{@@_break_point:Nn} to
+% \cs{prg_break_point:Nn}, and that delimiter had better be the right
+% one. Then we call \cs{prg_map_break:Nn} which may end up breaking
+% intermediate looks in the (unbraced) argument |#1|. It is essential
+% to define the |break_point| functions before the corresponding
+% |break| functions: otherwise \cs{debug_on:n} |{deprecation}|
+% \cs{debug_off:n} |{deprecation}| would break when trying to restore
+% the definitions because they would involve deprecated commands whose
+% definition has not yet been restored.
% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break_point:Nn }
+\cs_new:Npn \@@_break_point:Nn { \prg_break_point:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break_point: }
+\cs_new:Npn \@@_break_point: { \prg_break_point: }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_map_break:Nn }
+\cs_new:Npn \@@_map_break:Nn #1 \@@_break_point:Nn
+ { \prg_map_break:Nn #1 \prg_break_point:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break: }
+\cs_new:Npn \@@_break: #1 \@@_break_point: { }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break:n }
+\cs_new:Npn \@@_break:n #1#2 \@@_break_point: {#1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3prop.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3prop.dtx Copyright (C) 1990-2018 The 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
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -447,16 +447,41 @@
% A permanently-empty property list used for internal comparisons.
% \end{variable}
%
-% \section{Internal property list functions}
+% \end{documentation}
%
-% \begin{variable}{\s__prop}
+% \begin{implementation}
+%
+% \section{\pkg{l3prop} implementation}
+%
+% \TestFiles{m3prop001, m3prop002, m3prop003, m3prop004, m3show001}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=prop>
+% \end{macrocode}
+%
+% A property list is a macro whose top-level expansion is of the form
+% \begin{quote}
+% \cs{s_@@}
+% \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\
+% \ldots{} \\
+% \cs{@@_pair:wn} \meta{key_n} \cs{s_@@} \Arg{value_n} \\
+% \end{quote}
+% where \cs{s_@@} is a scan mark
+% (equal to \cs{scan_stop:}), and \cs{@@_pair:wn} can be used to map
+% through the property list.
+%
+% \begin{variable}{\s_@@}
% The internal token used at the beginning of property lists. This is
-% also used after each \meta{key} (see \cs{__prop_pair:wn}).
+% also used after each \meta{key} (see \cs{@@_pair:wn}).
% \end{variable}
%
-% \begin{variable}{\__prop_pair:wn}
+% \begin{variable}{\@@_pair:wn}
% \begin{syntax}
-% \cs{__prop_pair:wn} \meta{key} \cs{s__prop} \Arg{item}
+% \cs{@@_pair:wn} \meta{key} \cs{s_@@} \Arg{item}
% \end{syntax}
% The internal token used to begin each key--value pair in the
% property list. If expanded outside of a mapping or manipulation
@@ -464,14 +489,14 @@
% set globally.
% \end{variable}
%
-% \begin{variable}{\l__prop_internal_tl}
+% \begin{variable}{\l_@@_internal_tl}
% Token list used to store new key--value pairs to be inserted by
% functions of the \cs{prop_put:Nnn} family.
% \end{variable}
%
-% \begin{function}[updated = 2013-01-08]{\__prop_split:NnTF}
+% \begin{function}[updated = 2013-01-08]{\@@_split:NnTF}
% \begin{syntax}
-% \cs{__prop_split:NnTF} \meta{property list} \Arg{key} \Arg{true code} \Arg{false code}
+% \cs{@@_split:NnTF} \meta{property list} \Arg{key} \Arg{true code} \Arg{false code}
% \end{syntax}
% Splits the \meta{property list} at the \meta{key}, giving three
% token lists: the \meta{extract} of \meta{property list} before the
@@ -495,38 +520,11 @@
% The \meta{key} comparison takes place as described for \cs{str_if_eq:nn}.
% \end{function}
%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3prop} implementation}
-%
-% \TestFiles{m3prop001, m3prop002, m3prop003, m3prop004, m3show001}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=prop>
-% \end{macrocode}
-%
-% A property list is a macro whose top-level expansion is of the form
-% \begin{quote}
-% \cs{s_@@}
-% \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\
-% \ldots{} \\
-% \cs{@@_pair:wn} \meta{key_n} \cs{s_@@} \Arg{value_n} \\
-% \end{quote}
-% where \cs{s_@@} is a scan mark
-% (equal to \cs{scan_stop:}), and \cs{@@_pair:wn} can be used to map
-% through the property list.
-%
% \begin{macro}{\s_@@}
% A private scan mark is used as a marker after each key, and at the
% very beginning of the property list.
% \begin{macrocode}
-\__scan_new:N \s_@@
+\scan_new:N \s_@@
% \end{macrocode}
% \end{macro}
%
@@ -561,7 +559,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \prop_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_eq:NN #1 \c_empty_prop
}
\cs_generate_variant:Nn \prop_new:N { c }
@@ -634,14 +632,15 @@
% \@@_from_keyval:n,
% \@@_from_keyval_loop:w,
% \@@_from_keyval_split:Nw,
+% \@@_from_keyval_key:n,
% \@@_from_keyval_key:w,
+% \@@_from_keyval_value:n,
% \@@_from_keyval_value:w
% }
% Loop through items separated by commas, with \cs{q_mark} to avoid
% losing braces. After checking for termination, split the item at
% the first then at the second |=| (which ought to be the first of the
-% trailing~|=|). At both splits, trim spaces (the internal
-% \cs{__tl_trim_spaces:nn} expects the \cs{q_mark} we give it) and
+% trailing~|=|). At both splits, trim spaces and
% call \cs{@@_from_keyval_key:w}, then \cs{@@_from_keyval_value:w},
% followed by the trimmed material, \cs{q_nil}, the subsequent part of
% the item, and the trailing |=|'s and \cs{q_stop}. After finding the
@@ -670,20 +669,24 @@
\cs_new:Npn \@@_from_keyval_loop:w #1 ,
{
\quark_if_recursion_tail_stop:o { \use_none:n #1 }
- \@@_from_keyval_split:Nw \@@_from_keyval_key:w
+ \@@_from_keyval_split:Nw \@@_from_keyval_key:n
#1 = = \q_stop { \use_none:n #1 }
\@@_from_keyval_loop:w \q_mark
}
\cs_new:Npn \@@_from_keyval_split:Nw #1#2 =
{
- \__tl_trim_spaces:nn {#2}
- { \exp_last_unbraced:No #1 } \q_nil
+ \tl_trim_spaces_apply:oN { \use_none:n #2 } #1
+ \q_nil
}
+\cs_new:Npn \@@_from_keyval_key:n #1
+ { \@@_from_keyval_key:w #1 }
\cs_new:Npn \@@_from_keyval_key:w #1 \q_nil #2 \q_stop
{
- \@@_from_keyval_split:Nw \@@_from_keyval_value:w
+ \@@_from_keyval_split:Nw \@@_from_keyval_value:n
\q_mark #2 \q_stop {#1}
}
+\cs_new:Npn \@@_from_keyval_value:n #1
+ { \@@_from_keyval_value:w #1 }
\cs_new:Npn \@@_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
{
\tl_if_empty:nF { #3 #1 #2 }
@@ -694,8 +697,9 @@
\s_@@ { \exp_not:n {#1} }
}
{
- \exp_args:Nnno \__kernel_msg_expandable_error:nnn
- { kernel } { prop-keyval } {#4}
+ \__kernel_msg_expandable_error:nnf
+ { kernel } { prop-keyval }
+ { \exp_after:wN \exp_stop_f: #4 }
}
}
}
@@ -853,12 +857,12 @@
{
\exp_last_unbraced:Noo \@@_item_Nn:nwwn { \tl_to_str:n {#2} } #1
\@@_pair:wn \tl_to_str:n {#2} \s_@@ { }
- \__prg_break_point:
+ \prg_break_point:
}
\cs_new:Npn \@@_item_Nn:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
{
\str_if_eq_x:nnTF {#1} {#3}
- { \__prg_break:n { \exp_not:n {#4} } }
+ { \prg_break:n { \exp_not:n {#4} } }
{ \@@_item_Nn:nwwn {#1} }
}
\cs_generate_variant:Nn \prop_item:Nn { c }
@@ -1050,7 +1054,7 @@
\exp_last_unbraced:Noo \@@_if_in:nwwn { \tl_to_str:n {#2} } #1
\@@_pair:wn \tl_to_str:n {#2} \s_@@ { }
\q_recursion_tail
- \__prg_break_point:
+ \prg_break_point:
}
\cs_new:Npn \@@_if_in:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
{
@@ -1065,7 +1069,7 @@
\else:
\prg_return_true:
\fi:
- \__prg_break:
+ \prg_break:
}
\prg_generate_conditional_variant:Nnn \prop_if_in:Nn
{ NV , No , c , cV , co } { p , T , F , TF }
@@ -1106,24 +1110,22 @@
% \prop_map_function:cN, \prop_map_function:cc
% }
% \begin{macro}{\@@_map_function:Nwwn}
-% The fastest way to do a recursion here is to use an
-% \cs{if_meaning:w} test: the keys are strings, and thus cannot match
-% the marker \cs{q_recursion_tail}. A special case to note is when
-% the key~|#3| is empty: then \cs{q_recursion_tail} is compared to
-% \cs{exp_after:wN}, also different. Note that |#2|~is empty, except
-% at the first iteration, where it is \cs{s_@@}.
+% The argument delimited by \cs{@@_pair:wn} is empty except at the end
+% of the loop where it is \cs{prg_break:}. No need for any quark
+% test.
% \begin{macrocode}
\cs_new:Npn \prop_map_function:NN #1#2
{
- \exp_last_unbraced:NNo \@@_map_function:Nwwn #2 #1
- \@@_pair:wn \q_recursion_tail \s_@@ { }
- \__prg_break_point:Nn \prop_map_break: { }
+ \exp_after:wN \use_i_ii:nnn
+ \exp_after:wN \@@_map_function:Nwwn
+ \exp_after:wN #2
+ #1
+ \prg_break: \@@_pair:wn \s_@@ { } \prg_break_point:
+ \prg_break_point:Nn \prop_map_break: { }
}
\cs_new:Npn \@@_map_function:Nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
{
- \if_meaning:w \q_recursion_tail #3
- \exp_after:wN \prop_map_break:
- \fi:
+ #2
#1 {#3} {#4}
\@@_map_function:Nwwn #1
}
@@ -1145,15 +1147,15 @@
\cs_new_protected:Npn \prop_map_inline:Nn #1#2
{
\cs_gset_eq:cN
- { __prg_map_ \int_use:N \g__prg_map_int :wn } \@@_pair:wn
- \int_gincr:N \g__prg_map_int
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :wn } \@@_pair:wn
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:Npn \@@_pair:wn ##1 \s_@@ ##2 {#2}
#1
- \__prg_break_point:Nn \prop_map_break:
+ \prg_break_point:Nn \prop_map_break:
{
- \int_gdecr:N \g__prg_map_int
+ \int_gdecr:N \g__kernel_prg_map_int
\cs_gset_eq:Nc \@@_pair:wn
- { __prg_map_ \int_use:N \g__prg_map_int :wn }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :wn }
}
}
\cs_generate_variant:Nn \prop_map_inline:Nn { c }
@@ -1162,12 +1164,12 @@
%
% \begin{macro}[tested = m3prop003]{\prop_map_break:}
% \begin{macro}[tested = m3prop003]{\prop_map_break:n}
-% The break statements are based on the general \cs{__prg_map_break:Nn}.
+% The break statements are based on the general \cs{prg_map_break:Nn}.
% \begin{macrocode}
\cs_new:Npn \prop_map_break:
- { \__prg_map_break:Nn \prop_map_break: { } }
+ { \prg_map_break:Nn \prop_map_break: { } }
\cs_new:Npn \prop_map_break:n
- { \__prg_map_break:Nn \prop_map_break: }
+ { \prg_map_break:Nn \prop_map_break: }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1176,7 +1178,7 @@
%
% \begin{macro}[tested = m3show001]
% {\prop_show:N, \prop_show:c, \prop_log:N, \prop_log:c}
-% Apply the general \cs{__kernel_check_defined:NT} and
+% Apply the general \cs{__kernel_chk_defined:NT} and
% \cs{msg_show:nnnnnn}. Contrarily to sequences and comma lists,
% we use \cs{msg_show_item:nn} to format both the key and the value
% for each pair.
@@ -1187,7 +1189,7 @@
\cs_generate_variant:Nn \prop_log:N { c }
\cs_new_protected:Npn \@@_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{
#1 { LaTeX/kernel } { show-prop }
{ \token_to_str:N #2 }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,21 +41,17 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
% \begin{documentation}
%
-% \section{Introduction to quarks and scan marks}
-%
% Two special types of constants in \LaTeX3 are \enquote{quarks} and
% \enquote{scan marks}. By convention all constants of type quark
-% start out with |\q_|, and scan marks start with |\s_|. Scan marks are
-% for internal use by the kernel: they are not intended for more general
-% use.
+% start out with |\q_|, and scan marks start with |\s_|.
%
-% \subsection{Quarks}
+% \section{Quarks}
%
% Quarks are control sequences that expand to themselves and should
% therefore \emph{never} be executed directly in the code.
@@ -247,6 +243,21 @@
% ended.
% \end{function}
%
+%
+% \begin{function}[added = 2018-04-10]
+% {
+% \quark_if_recursion_tail_break:NN,
+% \quark_if_recursion_tail_break:nN
+% }
+% \begin{syntax}
+% \cs{quark_if_recursion_tail_break:nN} \Arg{token list} \cs[no-index]{\meta{type}_map_break:}
+% \end{syntax}
+% Tests if \meta{token list} contains only \cs{q_recursion_tail}, and
+% if so terminates the recursion using \cs[no-index]{\meta{type}_map_break:}.
+% The recursion end should be marked by \cs{prg_break_point:Nn}
+% \cs[no-index]{\meta{type}_map_break:}.
+% \end{function}
+%
% \section{An example of recursion with quarks}
% \label{sec:l3quark:quark-example}
%
@@ -297,23 +308,6 @@
% mapping function cannot be nested, since the second map would overwrite
% the definition of |\__my_map_dbl_fn:nn|.
%
-%
-% \section{Internal quark functions}
-%
-% \begin{function}
-% {
-% \__quark_if_recursion_tail_break:NN,
-% \__quark_if_recursion_tail_break:nN
-% }
-% \begin{syntax}
-% \cs{__quark_if_recursion_tail_break:nN} \Arg{token list} \cs[no-index]{\meta{type}_map_break:}
-% \end{syntax}
-% Tests if \meta{token list} contains only \cs{q_recursion_tail}, and
-% if so terminates the recursion using \cs[no-index]{\meta{type}_map_break:}.
-% The recursion end should be marked by \cs{prg_break_point:Nn}
-% \cs[no-index]{\meta{type}_map_break:}.
-% \end{function}
-%
% \section{Scan marks}
%
% Scan marks are control sequences set equal to \cs{scan_stop:},
@@ -327,13 +321,9 @@
% This allows to skip to that point if the end of the instructions
% should not be performed (see \pkg{l3regex}).
%
-% The scan marks system is only for internal use by the kernel team in
-% a small number of very specific places. These functions should not be
-% used more generally.
-%
-% \begin{function}{\__scan_new:N}
+% \begin{function}[added = 2018-04-01]{\scan_new:N}
% \begin{syntax}
-% \cs{__scan_new:N} \meta{scan mark}
+% \cs{scan_new:N} \meta{scan mark}
% \end{syntax}
% Creates a new \meta{scan mark} which is set equal to \cs{scan_stop:}.
% The \meta{scan mark} is defined globally, and an error message
@@ -340,17 +330,17 @@
% is raised if the name was already taken by another scan mark.
% \end{function}
%
-% \begin{variable}{\s__stop}
+% \begin{variable}[added = 2018-04-01]{\s_stop}
% Used at the end of a set of instructions, as a marker
-% that can be jumped to using \cs{__use_none_delimit_by_s__stop:w}.
+% that can be jumped to using \cs{use_none_delimit_by_s_stop:w}.
% \end{variable}
%
-% \begin{function}{\__use_none_delimit_by_s__stop:w}
+% \begin{function}[added = 2018-04-01]{\use_none_delimit_by_s_stop:w}
% \begin{syntax}
-% \cs{__use_none_delimit_by_s__stop:w} \meta{tokens} \cs{s__stop}
+% \cs{use_none_delimit_by_s_stop:w} \meta{tokens} \cs{s_stop}
% \end{syntax}
-% Removes the \meta{tokens} and \cs{s__stop} from the input stream.
-% This leads to a low-level \TeX{} error if \cs{s__stop} is absent.
+% Removes the \meta{tokens} and \cs{s_stop} from the input stream.
+% This leads to a low-level \TeX{} error if \cs{s_stop} is absent.
% \end{function}
%
% \end{documentation}
@@ -378,7 +368,7 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN q #1 } { }
\cs_new_protected:Npn \quark_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_nopar:Npn #1 {#1}
}
% \end{macrocode}
@@ -473,24 +463,23 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\__quark_if_recursion_tail_break:NN}
-% \begin{macro}{\__quark_if_recursion_tail_break:nN}
-% Analogs of the \cs[index=quark_if_recursion_tail_stop:n]
+% \begin{macro}{\quark_if_recursion_tail_break:NN}
+% \begin{macro}{\quark_if_recursion_tail_break:nN}
+% Analogues of the \cs[index=quark_if_recursion_tail_stop:n]
% {quark_if_recursion_tail_stop\ldots{}} functions.
% Break the mapping using |#2|.
% \begin{macrocode}
-\cs_new:Npn \__quark_if_recursion_tail_break:NN #1#2
+\cs_new:Npn \quark_if_recursion_tail_break:NN #1#2
{
\if_meaning:w \q_recursion_tail #1
\exp_after:wN #2
\fi:
}
-\cs_new:Npn \__quark_if_recursion_tail_break:nN #1#2
+\cs_new:Npn \quark_if_recursion_tail_break:nN #1#2
{
- \tl_if_empty:oTF
+ \tl_if_empty:oT
{ \@@_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
{#2}
- { }
}
% \end{macrocode}
% \end{macro}
@@ -533,6 +522,7 @@
% \begin{macro}[pTF]{\quark_if_no_value:n}
% \UnitTested
% \begin{macro}{\@@_if_nil:w, \@@_if_no_value:w}
+% \begin{macro}[EXP]{\@@_if_empty_return:o}
% Let us explain |\quark_if_nil:n(TF)|. Expanding \cs{@@_if_nil:w}
% once is safe thanks to the trailing \cs{q_nil} |??!|. The result of
% expanding once is empty if and only if both delimited arguments |#1|
@@ -546,36 +536,39 @@
% |{}\q_nil| |{}?| |!\q_nil|~|??!|, hence |#3|~is delimited by the
% final~|?!|, and the test returns \texttt{true} as wanted. In the
% second case, the result is not empty since the first~|?!| in the
-% definition of \cs{quark_if_nil:n} stop~|#3|.
+% definition of \cs{quark_if_nil:n} stop~|#3|. The auxiliary here
+% is the same as \cs{__tl_if_empty_return:o}, with the same comments
+% applying.
% \begin{macrocode}
\prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
{
- \__tl_if_empty_return:o
+ \@@_if_empty_return:o
{ \@@_if_nil:w {} #1 {} ? ! \q_nil ? ? ! }
}
\cs_new:Npn \@@_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 }
\prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF }
{
- \__tl_if_empty_return:o
+ \@@_if_empty_return:o
{ \@@_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
}
\cs_new:Npn \@@_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
\prg_generate_conditional_variant:Nnn \quark_if_nil:n
{ V , o } { p , TF , T , F }
+\cs_new:Npn \@@_if_empty_return:o #1
+ {
+ \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
+ \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
-% \begin{variable}{\q__tl_act_mark, \q__tl_act_stop}
-% These private quarks are needed by \pkg{l3tl}, but that is loaded
-% before the quark module, hence their definition is deferred.
-% \begin{macrocode}
-\quark_new:N \q__tl_act_mark
-\quark_new:N \q__tl_act_stop
-% \end{macrocode}
-% \end{variable}
-%
% \subsection{Scan marks}
%
% \begin{macrocode}
@@ -590,12 +583,13 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_new:N}
+% \begin{macro}{\scan_new:N}
% \UnitTested
% Check whether the variable is already a scan mark,
% then declare it to be equal to \cs{scan_stop:} globally.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_new:N #1
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN s #1 } { }
+\cs_new_protected:Npn \scan_new:N #1
{
\tl_if_in:NnTF \g_@@_marks_tl { #1 }
{
@@ -610,32 +604,24 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{variable}{\s__stop}
+% \begin{variable}{\s_stop}
% \UnitTested
% We only declare one scan mark here, more can be defined
% by specific modules.
% \begin{macrocode}
-\@@_new:N \s__stop
+\scan_new:N \s_stop
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\__use_none_delimit_by_s__stop:w}
+% \begin{macro}{\use_none_delimit_by_s_stop:w}
% \UnitTested
% Similar to \cs{use_none_delimit_by_q_stop:w}.
% \begin{macrocode}
-\cs_new:Npn \__use_none_delimit_by_s__stop:w #1 \s__stop { }
+\cs_new:Npn \use_none_delimit_by_s_stop:w #1 \s_stop { }
% \end{macrocode}
% \end{macro}
%
-% \begin{variable}{\s__seq}
-% This private scan mark is needed by \pkg{l3seq}, but that is loaded
-% before the quark module, hence its definition is deferred.
% \begin{macrocode}
-\__scan_new:N \s__seq
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -29,7 +29,7 @@
% \fi
%
% \title{^^A
-% The \textsf{l3regex} package: regular expressions in \TeX{}^^A
+% The \textsf{l3regex} package: Regular expressions in \TeX{}^^A
% }
%
% \author{^^A
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -50,8 +50,6 @@
% {\begin{itemize}\def\\{\char`\\}\def\makelabel##1{\hss\llap{\ttfamily##1}}}
% {\end{itemize}}
%
-% \section{Regular expressions}
-%
% The \pkg{l3regex} package provides regular expression testing,
% extraction of submatches, splitting, and replacement, all acting
% on token lists. The syntax of regular expressions is mostly a subset
@@ -96,7 +94,7 @@
% giving us access to the name of the environment when doing
% replacements.
%
-% \subsection{Syntax of regular expressions}
+% \section{Syntax of regular expressions}
%
% We start with a few examples, and encourage the reader to apply
% \cs{regex_show:n} to these regular expressions.
@@ -203,7 +201,8 @@
% equivalent to |[\^^J\^^K\^^L\^^M]|. Note that |\^^K| is a vertical space,
% but not a space, for compatibility with Perl.
% \item[\\w] Any word character, \emph{i.e.},
-% alpha-numerics and underscore, equivalent to |[A-Za-z0-9\_]|.
+% alphanumerics and underscore, equivalent to the explicit
+% class |[A-Za-z0-9\_]|.
% \item[\\D] Any token not matched by |\d|.
% \item[\\H] Any token not matched by |\h|.
% \item[\\N] Any token other than the |\n| character (hex 0A).
@@ -381,7 +380,7 @@
% true match is |{acbc3}|, with first submatch |{bc}|, but |\K| resets
% the beginning of the match to the last position where it appears.
%
-% \subsection{Syntax of the replacement text}
+% \section{Syntax of the replacement text}
%
% Most of the features described in regular expressions do not make
% sense within the replacement text. Backslash introduces various
@@ -456,7 +455,7 @@
% \end{verbatim}
% results in \cs{l_my_tl} holding |first,\emph{second},first,first|.
%
-% \subsection{Pre-compiling regular expressions}
+% \section{Pre-compiling regular expressions}
%
% If a regular expression is to be used several times,
% it is better to compile it once rather than doing it
@@ -509,7 +508,7 @@
% the second branch is not anchored to the beginning of the match.
% \end{function}
%
-% \subsection{Matching}
+% \section{Matching}
%
% All regular expression functions are available in both |:n| and |:N|
% variants. The former require a \enquote{standard} regular expression,
@@ -551,9 +550,9 @@
% results in \cs{l_foo_int} taking the value $5$.
% \end{function}
%
-% \subsection{Submatch extraction}
+% \section{Submatch extraction}
%
-% \begin{function}[TF, added = 2017-05-26]
+% \begin{function}[noTF, added = 2017-05-26]
% {\regex_extract_once:nnN, \regex_extract_once:NnN}
% \begin{syntax}
% \cs{regex_extract_once:nnN} \Arg{regex} \Arg{token list} \meta{seq~var}
@@ -584,7 +583,7 @@
% functions such as \cs{regex_replace_once:nnN}.
% \end{function}
%
-% \begin{function}[TF, added = 2017-05-26]
+% \begin{function}[noTF, added = 2017-05-26]
% {\regex_extract_all:nnN, \regex_extract_all:NnN}
% \begin{syntax}
% \cs{regex_extract_all:nnN} \Arg{regex} \Arg{token list} \meta{seq~var}
@@ -608,7 +607,7 @@
% and the \texttt{true} branch is left in the input stream.
% \end{function}
%
-% \begin{function}[TF, added = 2017-05-26]{\regex_split:nnN, \regex_split:NnN}
+% \begin{function}[noTF, added = 2017-05-26]{\regex_split:nnN, \regex_split:NnN}
% \begin{syntax}
% \cs{regex_split:nnN} \Arg{regular expression} \Arg{token list} \meta{seq~var}
% \cs{regex_split:nnNTF} \Arg{regular expression} \Arg{token list} \meta{seq~var} \Arg{true code} \Arg{false code}
@@ -634,9 +633,9 @@
% is left in the input stream.
% \end{function}
%
-% \subsection{Replacement}
+% \section{Replacement}
%
-% \begin{function}[TF, added = 2017-05-26]
+% \begin{function}[noTF, added = 2017-05-26]
% {\regex_replace_once:nnN,\regex_replace_once:NnN}
% \begin{syntax}
% \cs{regex_replace_once:nnN} \Arg{regular expression} \Arg{replacement} \meta{tl~var}
@@ -649,7 +648,7 @@
% first capturing group, |\2| of the second, \emph{etc.}
% \end{function}
%
-% \begin{function}[TF, added = 2017-05-26]
+% \begin{function}[noTF, added = 2017-05-26]
% {\regex_replace_all:nnN, \regex_replace_all:NnN}
% \begin{syntax}
% \cs{regex_replace_all:nnN} \Arg{regular expression} \Arg{replacement} \meta{tl~var}
@@ -663,7 +662,7 @@
% locally to \meta{tl~var}.
% \end{function}
%
-% \subsection{Constants and variables}
+% \section{Constants and variables}
%
% \begin{variable}[added = 2017-12-11]{\l_tmpa_regex, \l_tmpb_regex}
% Scratch regex for local assignment. These are never used by
@@ -679,7 +678,7 @@
% code and so should only be used for short-term storage.
% \end{variable}
%
-% \subsection{Bugs, misfeatures, future work, and other possibilities}
+% \section{Bugs, misfeatures, future work, and other possibilities}
%
% The following need to be done now.
% \begin{itemize}
@@ -716,7 +715,7 @@
% \item If possible, when a state is reused by the same thread, kill
% other subthreads.
% \item Use an array rather than \cs{l__regex_balance_tl}
-% to build \cs{__regex_replacement_balance_one_match:n}.
+% to build the function \cs{__regex_replacement_balance_one_match:n}.
% \item Reduce the number of epsilon-transitions in alternatives.
% \item Optimize simple strings: use less states (|abcade| should give
% two states, for |abc| and |ade|). [Does that really make sense?]
@@ -744,7 +743,7 @@
% \item Conditional subpatterns with look ahead/behind: \enquote{if
% what follows is [\ldots{}], then [\ldots{}]}.
% \item |(*..)| and |(?..)| sequences to set some options.
-% \item UTF-8 mode for pdf\TeX{}.
+% \item UTF-8 mode for \pdfTeX{}.
% \item Newline conventions are not done.
% In particular, we should have an option for |.| not to match newlines.
% Also, |\A| should differ from |^|, and |\Z|, |\z| and |$| should
@@ -798,7 +797,7 @@
% \item Comments: \TeX{} already has its own system for comments.
% \item |\Q...\E| escaping: this would require to read the argument
% verbatim, which is not in the scope of this module.
-% \item |\C| single byte in UTF-8 mode: Xe\TeX{} and Lua\TeX{} serve
+% \item |\C| single byte in UTF-8 mode: \XeTeX{} and \LuaTeX{} serve
% us characters directly, and splitting those into bytes is tricky,
% encoding dependent, and most likely not useful anyways.
% \end{itemize}
@@ -869,8 +868,7 @@
% \tn{toks} registers, by accessing them directly by number rather than
% tying them to control sequence using the \tn{newtoks} allocation
% functions. Specifically, these arrays and \tn{toks} are used as
-% follows. When compiling, \tn{toks} registers are used under the hood
-% by functions from the \pkg{l3tl-build} module. When building,
+% follows. When building,
% \tn{toks}\meta{state} holds the tests and actions to perform in the
% \meta{state} of the \textsc{nfa}. When matching,
% \begin{itemize}
@@ -917,6 +915,15 @@
%
% \subsection{Helpers}
%
+% \begin{macro}
+% {\@@_int_eval:w}
+% Access the primitive: performance is key here, so we do not use
+% the slower route \emph{via} \cs{int_eval:n}.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_int_eval:w \etex_numexpr:D
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_standard_escapechar:}
% Make the \tn{escapechar} into the standard backslash.
% \begin{macrocode}
@@ -936,7 +943,7 @@
% Empty a \tn{toks} or set it to a value, given its number.
% \begin{macrocode}
\cs_new_protected:Npn \@@_toks_clear:N #1
- { \tex_toks:D #1 { } }
+ { \@@_toks_set:Nn #1 { } }
\cs_new_eq:NN \@@_toks_set:Nn \tex_toks:D
\cs_new_protected:Npn \@@_toks_set:No #1
{ \@@_toks_set:Nn #1 \exp_after:wN }
@@ -1029,6 +1036,14 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_build_tl}
+% This temporary variable is specifically for use with the |tl_build|
+% machinery.
+% \begin{macrocode}
+\tl_new:N \l_@@_build_tl
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\c_@@_no_match_regex}
% This regular expression matches nothing, but is still a valid
% regular expression. We could use a failing assertion, but I went for
@@ -1050,9 +1065,9 @@
% registers. We also store the balance of begin-group/end-group
% characters into \cs{g_@@_balance_intarray}.
% \begin{macrocode}
-\__intarray_new:Nn \g_@@_charcode_intarray { 65536 }
-\__intarray_new:Nn \g_@@_catcode_intarray { 65536 }
-\__intarray_new:Nn \g_@@_balance_intarray { 65536 }
+\intarray_new:Nn \g_@@_charcode_intarray { 65536 }
+\intarray_new:Nn \g_@@_catcode_intarray { 65536 }
+\intarray_new:Nn \g_@@_balance_intarray { 65536 }
% \end{macrocode}
% \end{variable}
%
@@ -1200,12 +1215,14 @@
\if_int_compare:w \l_@@_curr_char_int > `Z \exp_stop_f:
\if_int_compare:w \l_@@_curr_char_int > `z \exp_stop_f: \else:
\if_int_compare:w \l_@@_curr_char_int < `a \exp_stop_f: \else:
- \int_sub:Nn \l_@@_case_changed_char_int { \c_@@_ascii_lower_int }
+ \int_sub:Nn \l_@@_case_changed_char_int
+ { \c_@@_ascii_lower_int }
\fi:
\fi:
\else:
\if_int_compare:w \l_@@_curr_char_int < `A \exp_stop_f: \else:
- \int_add:Nn \l_@@_case_changed_char_int { \c_@@_ascii_lower_int }
+ \int_add:Nn \l_@@_case_changed_char_int
+ { \c_@@_ascii_lower_int }
\fi:
\fi:
}
@@ -1243,7 +1260,7 @@
}
\cs_new_protected:Npn \@@_item_catcode:nT #1
{
- \if_int_odd:w \__int_eval:n { #1 / \@@_item_catcode: }
+ \if_int_odd:w \int_eval:n { #1 / \@@_item_catcode: } \exp_stop_f:
\exp_after:wN \use:n
\else:
\exp_after:wN \use_none:n
@@ -1273,7 +1290,8 @@
{
\tl_set:Nx \l_@@_internal_a_tl
{ \scan_stop: \@@_curr_cs_to_str: \scan_stop: }
- \tl_if_in:noTF { \scan_stop: #1 \scan_stop: } \l_@@_internal_a_tl
+ \tl_if_in:noTF { \scan_stop: #1 \scan_stop: }
+ \l_@@_internal_a_tl
{ \@@_break_true:w } { }
}
{ }
@@ -1300,12 +1318,14 @@
\@@_single_match:
\@@_disable_submatches:
\@@_build_for_cs:n {#1}
- \bool_set_eq:NN \l_@@_saved_success_bool \g_@@_success_bool
+ \bool_set_eq:NN \l_@@_saved_success_bool
+ \g_@@_success_bool
\exp_args:NV \@@_match:n \l_@@_cs_name_tl
\if_meaning:w \c_true_bool \g_@@_success_bool
\group_insert_after:N \@@_break_true:w
\fi:
- \bool_gset_eq:NN \g_@@_success_bool \l_@@_saved_success_bool
+ \bool_gset_eq:NN \g_@@_success_bool
+ \l_@@_saved_success_bool
\group_end:
}
}
@@ -1444,42 +1464,41 @@
% character, then fed to \meta{inline~3}. The result is then left in the
% input stream. Spaces are ignored unless escaped.
%
-% The conversion is mostly done within an \texttt{x}-expanding
-% assignment, except for the |\x| escape sequence, which is not amenable
-% to that in general. For this, we use the general framework of
-% \cs{__tl_build:Nw}.
+% The conversion is done within an \texttt{x}-expanding assignment.
%
% \begin{macro}{\@@_escape_use:nnnn}
-% The result is built in \cs{l_@@_internal_a_tl}, which is then
-% left in the input stream. Go through |#4| once, applying |#1|,
+% The result is built in \cs{l_@@_internal_a_tl}, which is then left
+% in the input stream. Tracing code is added as appropriate inside
+% this token list. Go through |#4| once, applying |#1|,
% |#2|, or |#3| as relevant to each character (after de-escaping
-% it). Note that we cannot replace \cs{tl_set:Nx} and
-% \cs{__tl_build_one:o} by a single call to \cs{__tl_build_one:x}, because
-% the \texttt{x}-expanding assignment may be interrupted by |\x|.
+% it).
% \begin{macrocode}
\__kernel_patch:nnNNpn
{
\@@_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn
- \__tl_build:Nw \l_@@_internal_a_tl
- \__tl_build_one:n { \@@_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
- \use_none:nn
+ \group_begin:
+ \tl_set:Nx \l_@@_internal_a_tl
+ { \@@_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
+ \use_none:nnn
}
{ }
\cs_new_protected:Npn \@@_escape_use:nnnn #1#2#3#4
{
- \__tl_build:Nw \l_@@_internal_a_tl
+ \group_begin:
+ \tl_clear:N \l_@@_internal_a_tl
\cs_set:Npn \@@_escape_unescaped:N ##1 { #1 }
\cs_set:Npn \@@_escape_escaped:N ##1 { #2 }
\cs_set:Npn \@@_escape_raw:N ##1 { #3 }
\@@_standard_escapechar:
- \tl_gset:Nx \g_@@_internal_tl { \__str_to_other_fast:n {#4} }
- \tl_set:Nx \l_@@_internal_b_tl
+ \tl_gset:Nx \g_@@_internal_tl
+ { \__kernel_str_to_other_fast:n {#4} }
+ \tl_put_right:Nx \l_@@_internal_a_tl
{
\exp_after:wN \@@_escape_loop:N \g_@@_internal_tl
- { break } \__prg_break_point:
+ { break } \prg_break_point:
}
- \__tl_build_one:o \l_@@_internal_b_tl
- \__tl_build_end:
+ \exp_after:wN
+ \group_end:
\l_@@_internal_a_tl
}
% \end{macrocode}
@@ -1532,12 +1551,11 @@
% backslash. Spaces are ignored, and |\a|, |\e|, |\f|, |\n|, |\r|,
% |\t| take their meaning here.
% \begin{macrocode}
-\cs_new_eq:NN \@@_escape_break:w \__prg_break:
+\cs_new_eq:NN \@@_escape_break:w \prg_break:
\cs_new:cpn { @@_escape_/break:w }
{
- \if_false: { \fi: }
- \__kernel_msg_error:nn { kernel } { trailing-backslash }
- \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+ \__kernel_msg_expandable_error:nn { kernel } { trailing-backslash }
+ \prg_break:
}
\cs_new:cpn { @@_escape_~:w } { }
\cs_new:cpx { @@_escape_/a:w }
@@ -1567,17 +1585,14 @@
\cs_new:cpn { @@_escape_/x:w } \@@_escape_loop:N
{
\exp_after:wN \@@_escape_x_end:w
- \__int_value:w "0 \@@_escape_x_test:N
+ \int_value:w "0 \@@_escape_x_test:N
}
\cs_new:Npn \@@_escape_x_end:w #1 ;
{
\int_compare:nNnTF {#1} > \c_max_char_int
{
- \if_false: { \fi: }
- \__tl_build_one:o \l_@@_internal_b_tl
- \__kernel_msg_error:nnx { kernel } { x-overflow } {#1}
- \tl_set:Nx \l_@@_internal_b_tl
- { \if_false: } \fi:
+ \__kernel_msg_expandable_error:nnff { kernel } { x-overflow }
+ {#1} { \int_to_Hex:n {#1} }
}
{
\exp_last_unbraced:Nf \@@_escape_raw:N
@@ -1662,11 +1677,8 @@
}
\cs_new:Npn \@@_escape_x_loop_error:n #1
{
- \if_false: { \fi: }
- \__tl_build_one:o \l_@@_internal_b_tl
- \__kernel_msg_error:nnx { kernel } { x-missing-rbrace } {#1}
- \tl_set:Nx \l_@@_internal_b_tl
- { \if_false: } \fi: \@@_escape_loop:N #1
+ \__kernel_msg_expandable_error:nnn { kernel } { x-missing-rbrace } {#1}
+ \@@_escape_loop:N #1
}
% \end{macrocode}
% \end{macro}
@@ -1682,7 +1694,7 @@
#1 \prg_return_true:
\else:
\if_case:w
- \__int_eval:n { \exp_after:wN ` \token_to_str:N #1 - `a }
+ \int_eval:n { \exp_after:wN ` \token_to_str:N #1 - `a }
A
\or: B
\or: C
@@ -2097,7 +2109,8 @@
\if_int_compare:w \l_@@_mode_int = \c_@@_catcode_mode_int
\int_set_eq:NN \l_@@_mode_int \c_@@_outer_mode_int
\else:
- \if_int_compare:w \l_@@_mode_int = \c_@@_catcode_in_class_mode_int
+ \if_int_compare:w \l_@@_mode_int =
+ \c_@@_catcode_in_class_mode_int
\int_set_eq:NN \l_@@_mode_int \c_@@_class_mode_int
\fi:
\fi:
@@ -2117,13 +2130,16 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_compile:w
{
- \__tl_build_x:Nw \l_@@_internal_regex
+ \group_begin:
+ \tl_build_begin:N \l_@@_build_tl
\int_zero:N \l_@@_group_level_int
- \int_set_eq:NN \l_@@_default_catcodes_int \c_@@_all_catcodes_int
+ \int_set_eq:NN \l_@@_default_catcodes_int
+ \c_@@_all_catcodes_int
\int_set_eq:NN \l_@@_catcodes_int \l_@@_default_catcodes_int
\cs_set:Npn \@@_item_equal:n { \@@_item_caseful_equal:n }
\cs_set:Npn \@@_item_range:nn { \@@_item_caseful_range:nn }
- \__tl_build_one:n { \@@_branch:n { \if_false: } \fi: }
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_branch:n { \if_false: } \fi: }
}
\cs_new_protected:Npn \@@_compile_end:
{
@@ -2140,17 +2156,23 @@
\prg_replicate:nn
{ \l_@@_group_level_int }
{
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{
\if_false: { \fi: }
\if_false: { \fi: } { 1 } { 0 } \c_true_bool
}
- \__tl_build_end:
- \__tl_build_one:o \l_@@_internal_regex
+ \tl_build_end:N \l_@@_build_tl
+ \exp_args:NNNo
+ \group_end:
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \l_@@_build_tl }
}
\fi:
- \__tl_build_one:n { \if_false: { \fi: } }
- \__tl_build_end:
+ \tl_build_put_right:Nn \l_@@_build_tl { \if_false: { \fi: } }
+ \tl_build_end:N \l_@@_build_tl
+ \exp_args:NNNx
+ \group_end:
+ \tl_set:Nn \l_@@_internal_regex { \l_@@_build_tl }
}
% \end{macrocode}
% \end{macro}
@@ -2219,7 +2241,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_compile_one:x}
+% \begin{macro}{\@@_compile_one:n}
% This is used after finding one \enquote{test}, such as |\d|, or a
% raw character. If that followed a catcode test (\emph{e.g.}, |\cL|),
% then restore the mode. If we are not in a class, then the test is
@@ -2227,17 +2249,18 @@
% search for quantifiers. In any case, insert the test, possibly
% together with a catcode test if appropriate.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_compile_one:x #1
+\cs_new_protected:Npn \@@_compile_one:n #1
{
\@@_mode_quit_c:
\@@_if_in_class:TF { }
{
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{ \@@_class:NnnnN \c_true_bool { \if_false: } \fi: }
}
- \__tl_build_one:x
+ \tl_build_put_right:Nx \l_@@_build_tl
{
- \if_int_compare:w \l_@@_catcodes_int < \c_@@_all_catcodes_int
+ \if_int_compare:w \l_@@_catcodes_int <
+ \c_@@_all_catcodes_int
\@@_item_catcode:nT { \int_use:N \l_@@_catcodes_int }
{ \exp_not:N \exp_not:n {#1} }
\else:
@@ -2292,7 +2315,10 @@
% whatever characters were grabbed are left raw).
% \begin{macrocode}
\cs_new_protected:Npn \@@_compile_quantifier_none:
- { \__tl_build_one:n { \if_false: { \fi: } { 1 } { 0 } \c_false_bool } }
+ {
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \if_false: { \fi: } { 1 } { 0 } \c_false_bool }
+ }
\cs_new_protected:Npn \@@_compile_quantifier_abort:xNN #1#2#3
{
\@@_compile_quantifier_none:
@@ -2315,9 +2341,13 @@
\cs_new_protected:Npn \@@_compile_quantifier_lazyness:nnNN #1#2#3#4
{
\str_if_eq:nnTF { #3 #4 } { \@@_compile_special:N ? }
- { \__tl_build_one:n { \if_false: { \fi: } { #1 } { #2 } \c_true_bool } }
{
- \__tl_build_one:n { \if_false: { \fi: } { #1 } { #2 } \c_false_bool }
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \if_false: { \fi: } { #1 } { #2 } \c_true_bool }
+ }
+ {
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \if_false: { \fi: } { #1 } { #2 } \c_false_bool }
#3 #4
}
}
@@ -2408,7 +2438,8 @@
\str_if_eq_x:nnTF
{ #1 #2 } { \@@_compile_special:N \c_right_brace_str }
{
- \if_int_compare:w \l_@@_internal_a_int > \l_@@_internal_b_int
+ \if_int_compare:w \l_@@_internal_a_int >
+ \l_@@_internal_b_int
\__kernel_msg_error:nnxx { kernel } { backwards-quantifier }
{ \int_use:N \l_@@_internal_a_int }
{ \int_use:N \l_@@_internal_b_int }
@@ -2461,14 +2492,14 @@
\str_if_eq:nnTF {#2#3} { \@@_compile_special:N - }
{ \@@_compile_range:Nw #1 }
{
- \@@_compile_one:x
- { \@@_item_equal:n { \__int_value:w `#1 ~ } }
+ \@@_compile_one:n
+ { \@@_item_equal:n { \int_value:w `#1 } }
#2 #3
}
}
{
- \@@_compile_one:x
- { \@@_item_equal:n { \__int_value:w `#1 ~ } }
+ \@@_compile_one:n
+ { \@@_item_equal:n { \int_value:w `#1 } }
#2 #3
}
}
@@ -2504,14 +2535,14 @@
\if_int_compare:w `#1 > `#3 \exp_stop_f:
\__kernel_msg_error:nnxx { kernel } { range-backwards } {#1} {#3}
\else:
- \__tl_build_one:x
+ \tl_build_put_right:Nx \l_@@_build_tl
{
\if_int_compare:w `#1 = `#3 \exp_stop_f:
\@@_item_equal:n
\else:
- \@@_item_range:nn { \__int_value:w `#1 ~ }
+ \@@_item_range:nn { \int_value:w `#1 }
\fi:
- { \__int_value:w `#3 ~ }
+ { \int_value:w `#3 }
}
\fi:
}
@@ -2518,10 +2549,10 @@
{
\__kernel_msg_warning:nnxx { kernel } { range-missing-end }
{#1} { \c_backslash_str #3 }
- \__tl_build_one:x
+ \tl_build_put_right:Nx \l_@@_build_tl
{
- \@@_item_equal:n { \__int_value:w `#1 ~ }
- \@@_item_equal:n { \__int_value:w `- ~ }
+ \@@_item_equal:n { \int_value:w `#1 \exp_stop_f: }
+ \@@_item_equal:n { \int_value:w `- \exp_stop_f: }
}
#2#3
}
@@ -2540,7 +2571,7 @@
{
\exp_not:N \@@_if_in_class:TF
{ \@@_compile_raw:N . }
- { \@@_compile_one:x \exp_not:c { @@_prop_.: } }
+ { \@@_compile_one:n \exp_not:c { @@_prop_.: } }
}
\cs_new_protected:cpn { @@_prop_.: }
{
@@ -2568,10 +2599,10 @@
\cs_set_protected:Npn \@@_tmp:w #1#2
{
\cs_new_protected:cpx { @@_compile_/#1: }
- { \@@_compile_one:x \exp_not:c { @@_prop_#1: } }
+ { \@@_compile_one:n \exp_not:c { @@_prop_#1: } }
\cs_new_protected:cpx { @@_compile_/#2: }
{
- \@@_compile_one:x
+ \@@_compile_one:n
{ \@@_item_reverse:n \exp_not:c { @@_prop_#1: } }
}
}
@@ -2581,7 +2612,7 @@
\@@_tmp:w v V
\@@_tmp:w w W
\cs_new_protected:cpn { @@_compile_/N: }
- { \@@_compile_one:x \@@_prop_N: }
+ { \@@_compile_one:n \@@_prop_N: }
% \end{macrocode}
% \end{macro}
%
@@ -2602,7 +2633,7 @@
{
\@@_if_in_class_or_catcode:TF {#2}
{
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{ \@@_assertion:Nn \c_true_bool { \@@_anchor:N #1 } }
}
}
@@ -2639,7 +2670,7 @@
\@@_if_in_class_or_catcode:TF
{ \@@_compile_raw_error:N b }
{
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{ \@@_assertion:Nn \c_true_bool { \@@_b_test: } }
}
}
@@ -2648,7 +2679,7 @@
\@@_if_in_class_or_catcode:TF
{ \@@_compile_raw_error:N B }
{
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{ \@@_assertion:Nn \c_false_bool { \@@_b_test: } }
}
}
@@ -2668,8 +2699,9 @@
{
\@@_if_in_class:TF
{
- \if_int_compare:w \l_@@_mode_int > \c_@@_catcode_in_class_mode_int
- \__tl_build_one:n { \if_false: { \fi: } }
+ \if_int_compare:w \l_@@_mode_int >
+ \c_@@_catcode_in_class_mode_int
+ \tl_build_put_right:Nn \l_@@_build_tl { \if_false: { \fi: } }
\fi:
\tex_advance:D \l_@@_mode_int - 15 \exp_stop_f:
\tex_divide:D \l_@@_mode_int 13 \exp_stop_f:
@@ -2733,7 +2765,7 @@
\cs_new_protected:Npn \@@_compile_class_catcode:w #1;
{
\if_int_compare:w \l_@@_mode_int = \c_@@_catcode_mode_int
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{ \@@_class:NnnnN \c_true_bool { \if_false: } \fi: }
\fi:
\int_set_eq:NN \l_@@_catcodes_int \l_@@_default_catcodes_int
@@ -2752,14 +2784,14 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_compile_class:TFNN #1#2#3#4
{
- \l_@@_mode_int = \__int_value:w \l_@@_mode_int 3 \exp_stop_f:
+ \l_@@_mode_int = \int_value:w \l_@@_mode_int 3 \exp_stop_f:
\str_if_eq:nnTF { #3 #4 } { \@@_compile_special:N ^ }
{
- \__tl_build_one:n { #2 { \if_false: } \fi: }
+ \tl_build_put_right:Nn \l_@@_build_tl { #2 { \if_false: } \fi: }
\@@_compile_class:NN
}
{
- \__tl_build_one:n { #1 { \if_false: } \fi: }
+ \tl_build_put_right:Nn \l_@@_build_tl { #1 { \if_false: } \fi: }
\@@_compile_class:NN #3 #4
}
}
@@ -2794,8 +2826,14 @@
\str_case:nn { #2 }
{
: { \@@_compile_class_posix:NNNNw }
- = { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { = } }
- . { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { . } }
+ = {
+ \__kernel_msg_warning:nnx { kernel }
+ { posix-unsupported } { = }
+ }
+ . {
+ \__kernel_msg_warning:nnx { kernel }
+ { posix-unsupported } { . }
+ }
}
}
\@@_compile_raw:N [ #1 #2
@@ -2827,7 +2865,7 @@
{
\cs_if_exist:cTF { @@_posix_ \l_@@_internal_a_tl : }
{
- \@@_compile_one:x
+ \@@_compile_one:n
{
\bool_if:NF \l_@@_internal_bool \@@_item_reverse:n
\exp_not:c { @@_posix_ \l_@@_internal_a_tl : }
@@ -2857,9 +2895,9 @@
%
% \begin{macro}{\@@_compile_group_begin:N, \@@_compile_group_end:}
% The contents of a regex group are turned into compiled code in
-% \cs{l_@@_internal_regex}, which ends up with items of the form
+% \cs{l_@@_build_tl}, which ends up with items of the form
% \cs{@@_branch:n} \Arg{concatenation}. This construction is done
-% using \pkg{l3tl-build} within a \TeX{} group, which automatically
+% using \cs[no-index]{tl_build_\ldots{}} functions within a \TeX{} group, which automatically
% makes sure that options (case-sensitivity and default catcode) are
% reset at the end of the group. The argument |#1| is
% \cs{@@_group:nnnN} or a variant thereof. A small subtlety to
@@ -2870,20 +2908,24 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_compile_group_begin:N #1
{
- \__tl_build_one:n { #1 { \if_false: } \fi: }
+ \tl_build_put_right:Nn \l_@@_build_tl { #1 { \if_false: } \fi: }
\@@_mode_quit_c:
- \__tl_build:Nw \l_@@_internal_regex
+ \group_begin:
+ \tl_build_begin:N \l_@@_build_tl
\int_set_eq:NN \l_@@_default_catcodes_int \l_@@_catcodes_int
\int_incr:N \l_@@_group_level_int
- \__tl_build_one:n { \@@_branch:n { \if_false: } \fi: }
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_branch:n { \if_false: } \fi: }
}
\cs_new_protected:Npn \@@_compile_group_end:
{
\if_int_compare:w \l_@@_group_level_int > 0 \exp_stop_f:
- \__tl_build_one:n { \if_false: { \fi: } }
- \__tl_build_end:
+ \tl_build_put_right:Nn \l_@@_build_tl { \if_false: { \fi: } }
+ \tl_build_end:N \l_@@_build_tl
+ \exp_args:NNNx
+ \group_end:
+ \tl_build_put_right:Nn \l_@@_build_tl { \l_@@_build_tl }
\int_set_eq:NN \l_@@_catcodes_int \l_@@_default_catcodes_int
- \__tl_build_one:o \l_@@_internal_regex
\exp_after:wN \@@_compile_quantifier:w
\else:
\__kernel_msg_warning:nn { kernel } { extra-rparen }
@@ -2894,14 +2936,23 @@
% \end{macro}
%
% \begin{macro}{\@@_compile_(:}
-% In a class, parentheses are not special. Outside, check for a |?|,
-% denoting special groups, and run the code for the corresponding
-% special group.
+% In a class, parentheses are not special. In a catcode test inside a
+% class, a left parenthesis gives an error, to catch |[a\cL(bcd)e]|.
+% Otherwise check for a |?|, denoting special groups, and run the code
+% for the corresponding special group.
% \begin{macrocode}
\cs_new_protected:cpn { @@_compile_(: }
{
\@@_if_in_class:TF { \@@_compile_raw:N ( }
- { \@@_compile_lparen:w }
+ {
+ \if_int_compare:w \l_@@_mode_int =
+ \c_@@_catcode_in_class_mode_int
+ \__kernel_msg_error:nn { kernel } { c-lparen-in-class }
+ \exp_after:wN \@@_compile_raw:N \exp_after:wN (
+ \else:
+ \exp_after:wN \@@_compile_lparen:w
+ \fi:
+ }
}
\cs_new_protected:Npn \@@_compile_lparen:w #1#2#3#4
{
@@ -2932,7 +2983,7 @@
{
\@@_if_in_class:TF { \@@_compile_raw:N | }
{
- \__tl_build_one:n
+ \tl_build_put_right:Nn \l_@@_build_tl
{ \if_false: { \fi: } \@@_branch:n { \if_false: } \fi: }
}
}
@@ -2973,8 +3024,10 @@
{
\str_if_eq:nnTF { #1 #2 } { \@@_compile_special:N ) }
{
- \cs_set:Npn \@@_item_equal:n { \@@_item_caseless_equal:n }
- \cs_set:Npn \@@_item_range:nn { \@@_item_caseless_range:nn }
+ \cs_set:Npn \@@_item_equal:n
+ { \@@_item_caseless_equal:n }
+ \cs_set:Npn \@@_item_range:nn
+ { \@@_item_caseless_range:nn }
}
{
\__kernel_msg_warning:nnx { kernel } { unknown-option } { (?i #2 }
@@ -2989,8 +3042,10 @@
\str_if_eq:nnTF { #1 #2 #3 #4 }
{ \@@_compile_raw:N i \@@_compile_special:N ) }
{
- \cs_set:Npn \@@_item_equal:n { \@@_item_caseful_equal:n }
- \cs_set:Npn \@@_item_range:nn { \@@_item_caseful_range:nn }
+ \cs_set:Npn \@@_item_equal:n
+ { \@@_item_caseful_equal:n }
+ \cs_set:Npn \@@_item_range:nn
+ { \@@_item_caseful_range:nn }
}
{
\__kernel_msg_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
@@ -3019,7 +3074,8 @@
{
\int_if_exist:cTF { c_@@_catcode_#2_int }
{
- \int_set_eq:Nc \l_@@_catcodes_int { c_@@_catcode_#2_int }
+ \int_set_eq:Nc \l_@@_catcodes_int
+ { c_@@_catcode_#2_int }
\l_@@_mode_int
= \if_case:w \l_@@_mode_int
\c_@@_catcode_mode_int
@@ -3112,7 +3168,7 @@
}
\cs_new_protected:Npn \@@_compile_c_lbrack_add:N #1
{
- \if_int_odd:w \__int_eval:n { \l_@@_catcodes_int / #1 }
+ \if_int_odd:w \int_eval:n { \l_@@_catcodes_int / #1 } \exp_stop_f:
\else:
\int_add:Nn \l_@@_catcodes_int {#1}
\fi:
@@ -3176,11 +3232,14 @@
\exp_after:wN \@@_compile_cs_aux:Nn \l_@@_internal_regex
\q_nil \q_nil \q_recursion_stop
}
- \exp_args:Nx \@@_compile_one:x
+ \exp_args:Nx \@@_compile_one:n
{
\flag_if_raised:nTF { @@_cs }
{ \@@_item_cs:n { \exp_not:o \l_@@_internal_regex } }
- { \@@_item_exact_cs:n { \tl_tail:N \l_@@_internal_a_tl } }
+ {
+ \@@_item_exact_cs:n
+ { \tl_tail:N \l_@@_internal_a_tl }
+ }
}
}
\cs_new:Npn \@@_compile_cs_aux:Nn #1#2
@@ -3193,7 +3252,7 @@
\@@_compile_cs_aux:Nn
}
{
- \quark_if_nil:NF #1 { \flag_raise:n { @@_cs } }
+ \quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
\use_none_delimit_by_q_recursion_stop:w
}
}
@@ -3215,7 +3274,7 @@
{
\quark_if_nil:NF #1
{
- \flag_raise:n { @@_cs }
+ \flag_raise_if_clear:n { @@_cs }
\use_i_delimit_by_q_recursion_stop:nw
}
\use_none_delimit_by_q_recursion_stop:w
@@ -3245,7 +3304,8 @@
\@@_if_in_class_or_catcode:TF
{ \@@_compile_raw_error:N u #1 #2 }
{
- \str_if_eq_x:nnTF {#1#2} { \@@_compile_special:N \c_left_brace_str }
+ \str_if_eq_x:nnTF {#1#2}
+ { \@@_compile_special:N \c_left_brace_str }
{
\tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
\@@_compile_u_loop:NN
@@ -3305,9 +3365,12 @@
\cs_new_protected:Npn \@@_compile_u_in_cs:
{
\tl_gset:Nx \g_@@_internal_tl
- { \exp_args:No \__str_to_other_fast:n { \l_@@_internal_a_tl } }
- \__tl_build_one:x
{
+ \exp_args:No \__kernel_str_to_other_fast:n
+ { \l_@@_internal_a_tl }
+ }
+ \tl_build_put_right:Nx \l_@@_build_tl
+ {
\tl_map_function:NN \g_@@_internal_tl
\@@_compile_u_in_cs_aux:n
}
@@ -3315,7 +3378,7 @@
\cs_new:Npn \@@_compile_u_in_cs_aux:n #1
{
\@@_class:NnnnN \c_true_bool
- { \@@_item_caseful_equal:n { \__int_value:w `#1 } }
+ { \@@_item_caseful_equal:n { \int_value:w `#1 } }
{ 1 } { 0 } \c_false_bool
}
% \end{macrocode}
@@ -3329,16 +3392,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_compile_u_not_cs:
{
- \exp_args:No \__tl_analysis_map_inline:nn { \l_@@_internal_a_tl }
+ \tl_analysis_map_inline:Nn \l_@@_internal_a_tl
{
- \__tl_build_one:n
+ \tl_build_put_right:Nx \l_@@_build_tl
{
\@@_class:NnnnN \c_true_bool
{
- \if_int_compare:w "##2 = 0 \exp_stop_f:
- \@@_item_exact_cs:n { \exp_after:wN \cs_to_str:N ##1 }
+ \if_int_compare:w "##3 = 0 \exp_stop_f:
+ \@@_item_exact_cs:n
+ { \exp_after:wN \cs_to_str:N ##1 }
\else:
- \@@_item_exact:nn { \__int_value:w "##2 } { ##3 }
+ \@@_item_exact:nn { \int_value:w "##3 } { ##2 }
\fi:
}
{ 1 } { 0 } \c_false_bool
@@ -3359,7 +3423,7 @@
\cs_new_protected:cpn { @@_compile_/K: }
{
\int_compare:nNnTF \l_@@_mode_int = \c_@@_outer_mode_int
- { \__tl_build_one:n { \@@_command_K: } }
+ { \tl_build_put_right:Nn \l_@@_build_tl { \@@_command_K: } }
{ \@@_compile_raw_error:N K }
}
% \end{macrocode}
@@ -3368,7 +3432,7 @@
% \subsubsection{Showing regexes}
%
% \begin{macro}{\@@_show:N}
-% Within a \cs{__tl_build:Nw} \ldots{} \cs{__tl_build_end:} group, we
+% Within a group and within \cs{tl_build_begin:N} \ldots{} \cs{tl_build_end:N} we
% redefine all the function that can appear in a compiled regex, then
% run the regex. The result stored in \cs{l_@@_internal_a_tl} is then
% meant to be shown.
@@ -3375,12 +3439,15 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_show:N #1
{
- \__tl_build:Nw \l_@@_internal_a_tl
+ \group_begin:
+ \tl_build_begin:N \l_@@_build_tl
\cs_set_protected:Npn \@@_branch:n
{
- \seq_pop_right:NN \l_@@_show_prefix_seq \l_@@_internal_a_tl
+ \seq_pop_right:NN \l_@@_show_prefix_seq
+ \l_@@_internal_a_tl
\@@_show_one:n { +-branch }
- \seq_put_right:No \l_@@_show_prefix_seq \l_@@_internal_a_tl
+ \seq_put_right:No \l_@@_show_prefix_seq
+ \l_@@_internal_a_tl
\use:n
}
\cs_set_protected:Npn \@@_group:nnnN
@@ -3393,13 +3460,19 @@
\cs_set_protected:Npn \@@_command_K:
{ \@@_show_one:n { reset~match~start~(\iow_char:N\\K) } }
\cs_set_protected:Npn \@@_assertion:Nn ##1##2
- { \@@_show_one:n { \bool_if:NF ##1 { negative~ } assertion:~##2 } }
+ {
+ \@@_show_one:n
+ { \bool_if:NF ##1 { negative~ } assertion:~##2 }
+ }
\cs_set:Npn \@@_b_test: { word~boundary }
\cs_set_eq:NN \@@_anchor:N \@@_show_anchor_to_str:N
\cs_set_protected:Npn \@@_item_caseful_equal:n ##1
{ \@@_show_one:n { char~code~\int_eval:n{##1} } }
\cs_set_protected:Npn \@@_item_caseful_range:nn ##1##2
- { \@@_show_one:n { range~[\int_eval:n{##1}, \int_eval:n{##2}] } }
+ {
+ \@@_show_one:n
+ { range~[\int_eval:n{##1}, \int_eval:n{##2}] }
+ }
\cs_set_protected:Npn \@@_item_caseless_equal:n ##1
{ \@@_show_one:n { char~code~\int_eval:n{##1}~(caseless) } }
\cs_set_protected:Npn \@@_item_caseless_range:nn ##1##2
@@ -3422,7 +3495,10 @@
\seq_clear:N \l_@@_show_prefix_seq
\@@_show_push:n { ~ }
\cs_if_exist_use:N #1
- \__tl_build_end:
+ \tl_build_end:N \l_@@_build_tl
+ \exp_args:NNNo
+ \group_end:
+ \tl_set:Nn \l_@@_internal_a_tl { \l_@@_build_tl }
}
% \end{macrocode}
% \end{macro}
@@ -3434,7 +3510,7 @@
\cs_new_protected:Npn \@@_show_one:n #1
{
\int_incr:N \l_@@_show_lines_int
- \__tl_build_one:x
+ \tl_build_put_right:Nx \l_@@_build_tl
{
\exp_not:N \iow_newline:
\seq_map_function:NN \l_@@_show_prefix_seq \use:n
@@ -3495,42 +3571,39 @@
% \begin{macrocode}
\cs_set:Npn \@@_show_class:NnnnN #1#2#3#4#5
{
- \__tl_build:Nw \l_@@_internal_a_tl
+ \group_begin:
+ \tl_build_begin:N \l_@@_build_tl
\int_zero:N \l_@@_show_lines_int
\@@_show_push:n {~}
#2
- \exp_last_unbraced:Nf
- \int_case:nnF { \l_@@_show_lines_int }
+ \int_compare:nTF { \l_@@_show_lines_int = 0 }
{
- {0}
+ \group_end:
+ \@@_show_one:n { \bool_if:NTF #1 { Fail } { Pass } }
+ }
+ {
+ \bool_if:nTF
+ { #1 && \int_compare_p:n { \l_@@_show_lines_int = 1 } }
{
- \__tl_build_end:
- \@@_show_one:n { \bool_if:NTF #1 { Fail } { Pass } }
+ \group_end:
+ #2
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_msg_repeated:nnN {#3} {#4} #5 }
}
- {1}
{
- \__tl_build_end:
- \bool_if:NTF #1
+ \tl_build_end:N \l_@@_build_tl
+ \exp_args:NNNo
+ \group_end:
+ \tl_set:Nn \l_@@_internal_a_tl \l_@@_build_tl
+ \@@_show_one:n
{
- #2
- \__tl_build_one:n { \@@_msg_repeated:nnN {#3} {#4} #5 }
+ \bool_if:NTF #1 { Match } { Don't~match }
+ \@@_msg_repeated:nnN {#3} {#4} #5
}
- {
- \@@_show_one:n
- { Don't~match~\@@_msg_repeated:nnN {#3} {#4} #5 }
- \__tl_build_one:o \l_@@_internal_a_tl
- }
+ \tl_build_put_right:Nx \l_@@_build_tl
+ { \exp_not:o \l_@@_internal_a_tl }
}
}
- {
- \__tl_build_end:
- \@@_show_one:n
- {
- \bool_if:NTF #1 { M } { Don't~m } atch
- \@@_msg_repeated:nnN {#3} {#4} #5
- }
- \__tl_build_one:o \l_@@_internal_a_tl
- }
}
% \end{macrocode}
% \end{macro}
@@ -4011,8 +4084,8 @@
{ \int_use:N \l_@@_capturing_group_int }
{ \int_use:N \l_@@_capturing_group_int }
#1
- { ?? \__prg_break:n } { }
- \__prg_break_point:
+ { ?? \prg_break:n } { }
+ \prg_break_point:
}
}
\cs_new_protected:Npn \@@_group_resetting_loop:nnNn #1#2#3#4
@@ -4109,7 +4182,7 @@
\l_@@_right_state_int \l_@@_max_state_int
\int_set_eq:NN \l_@@_internal_a_int \l_@@_left_state_int
\int_set_eq:NN \l_@@_internal_b_int \l_@@_max_state_int
- \if_int_compare:w \__int_eval:n {#1} > 1 \exp_stop_f:
+ \if_int_compare:w \int_eval:n {#1} > 1 \exp_stop_f:
\int_set:Nn \l_@@_internal_c_int
{
( #1 - 1 )
@@ -4295,7 +4368,10 @@
\@@_action_submatch:n { 0< }
\bool_set_true:N \l_@@_fresh_thread_bool
\@@_action_free:n
- { \int_eval:n { \l_@@_right_state_int - \l_@@_left_state_int } }
+ {
+ \int_eval:n
+ { \l_@@_right_state_int - \l_@@_left_state_int }
+ }
\bool_set_false:N \l_@@_fresh_thread_bool
}
}
@@ -4459,8 +4535,8 @@
% threads to be considered in the next step, more precisely the
% states in which these threads are.
% \begin{macrocode}
-\__intarray_new:Nn \g_@@_state_active_intarray { 65536 }
-\__intarray_new:Nn \g_@@_thread_state_intarray { 65536 }
+\intarray_new:Nn \g_@@_state_active_intarray { 65536 }
+\intarray_new:Nn \g_@@_thread_state_intarray { 65536 }
% \end{macrocode}
% \end{variable}
%
@@ -4545,8 +4621,8 @@
\int_set:Nn \l_@@_curr_pos_int { 2 * \l_@@_max_state_int }
\@@_query_set:nnn { } { -1 } { -2 }
\int_set_eq:NN \l_@@_min_pos_int \l_@@_curr_pos_int
- \__tl_analysis_map_inline:nn {#1}
- { \@@_query_set:nnn {##1} {"##2} {##3} }
+ \tl_analysis_map_inline:nn {#1}
+ { \@@_query_set:nnn {##1} {"##3} {##2} }
\int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
\@@_query_set:nnn { } { -1 } { -2 }
\@@_match_init:
@@ -4558,9 +4634,12 @@
\cs_new_protected:Npn \@@_match_init:
{
\bool_gset_false:N \g_@@_success_bool
- \int_step_inline:nnnn
- \l_@@_min_state_int { 1 } { \l_@@_max_state_int - 1 }
- { \__intarray_gset_fast:Nnn \g_@@_state_active_intarray {##1} { 1 } }
+ \int_step_inline:nnn
+ \l_@@_min_state_int { \l_@@_max_state_int - 1 }
+ {
+ \__kernel_intarray_gset:Nnn
+ \g_@@_state_active_intarray {##1} { 1 }
+ }
\int_set_eq:NN \l_@@_min_active_int \l_@@_max_state_int
\int_zero:N \l_@@_step_int
\int_set_eq:NN \l_@@_success_pos_int \l_@@_min_pos_int
@@ -4591,7 +4670,10 @@
{
\if_meaning:w \c_true_bool \l_@@_empty_success_bool
\cs_set:Npn \@@_if_two_empty_matches:F
- { \int_compare:nNnF \l_@@_start_pos_int = \l_@@_curr_pos_int }
+ {
+ \int_compare:nNnF
+ \l_@@_start_pos_int = \l_@@_curr_pos_int
+ }
\else:
\cs_set_eq:NN \@@_if_two_empty_matches:F \use:n
\fi:
@@ -4618,7 +4700,11 @@
\cs_new_protected:Npn \@@_single_match:
{
\tl_set:Nn \l_@@_every_match_tl
- { \bool_gset_eq:NN \g_@@_success_bool \l_@@_match_success_bool }
+ {
+ \bool_gset_eq:NN
+ \g_@@_success_bool
+ \l_@@_match_success_bool
+ }
}
\cs_new_protected:Npn \@@_multi_match:n #1
{
@@ -4658,14 +4744,13 @@
\use:x
{
\int_set_eq:NN \l_@@_max_active_int \l_@@_min_active_int
- \int_step_function:nnnN
+ \int_step_function:nnN
{ \l_@@_min_active_int }
- { 1 }
{ \l_@@_max_active_int - 1 }
\@@_match_one_active:n
}
- \__prg_break_point:
- \bool_set_false:N \l_@@_fresh_thread_bool %^^A was arg of break_point:n
+ \prg_break_point:
+ \bool_set_false:N \l_@@_fresh_thread_bool
\if_int_compare:w \l_@@_max_active_int > \l_@@_min_active_int
\if_int_compare:w \l_@@_curr_pos_int < \l_@@_max_pos_int
\exp_after:wN \exp_after:wN \exp_after:wN \@@_match_loop:
@@ -4675,7 +4760,7 @@
\cs_new:Npn \@@_match_one_active:n #1
{
\@@_use_state_and_submatches:nn
- { \__intarray_item_fast:Nn \g_@@_thread_state_intarray {#1} }
+ { \__kernel_intarray_item:Nn \g_@@_thread_state_intarray {#1} }
{ \@@_toks_use:w #1 }
}
% \end{macrocode}
@@ -4691,11 +4776,11 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_query_set:nnn #1#2#3
{
- \__intarray_gset_fast:Nnn \g_@@_charcode_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_charcode_intarray
{ \l_@@_curr_pos_int } {#3}
- \__intarray_gset_fast:Nnn \g_@@_catcode_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_catcode_intarray
{ \l_@@_curr_pos_int } {#2}
- \__intarray_gset_fast:Nnn \g_@@_balance_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_balance_intarray
{ \l_@@_curr_pos_int } { \l_@@_balance_int }
\@@_toks_set:Nn \l_@@_curr_pos_int {#1}
\int_incr:N \l_@@_curr_pos_int
@@ -4714,10 +4799,10 @@
\cs_new_protected:Npn \@@_query_get:
{
\l_@@_curr_char_int
- = \__intarray_item_fast:Nn \g_@@_charcode_intarray
+ = \__kernel_intarray_item:Nn \g_@@_charcode_intarray
{ \l_@@_curr_pos_int } \scan_stop:
\l_@@_curr_catcode_int
- = \__intarray_item_fast:Nn \g_@@_catcode_intarray
+ = \__kernel_intarray_item:Nn \g_@@_catcode_intarray
{ \l_@@_curr_pos_int } \scan_stop:
}
% \end{macrocode}
@@ -4734,15 +4819,19 @@
% point will be terminated.
% \begin{macrocode}
\__kernel_patch:nnNNpn
- { \@@_trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int } }
+ {
+ \@@_trace:nnx { regex } { 2 }
+ { state~\int_use:N \l_@@_curr_state_int }
+ }
{ }
\cs_new_protected:Npn \@@_use_state:
{
- \__intarray_gset_fast:Nnn \g_@@_state_active_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_state_active_intarray
{ \l_@@_curr_state_int } { \l_@@_step_int }
\@@_toks_use:w \l_@@_curr_state_int
- \__intarray_gset_fast:Nnn \g_@@_state_active_intarray
- { \l_@@_curr_state_int } { \l_@@_step_int + 1 }
+ \__kernel_intarray_gset:Nnn \g_@@_state_active_intarray
+ { \l_@@_curr_state_int }
+ { \int_eval:n { \l_@@_step_int + 1 } }
}
% \end{macrocode}
% \end{macro}
@@ -4757,7 +4846,7 @@
{
\int_set:Nn \l_@@_curr_state_int {#1}
\if_int_compare:w
- \__intarray_item_fast:Nn \g_@@_state_active_intarray
+ \__kernel_intarray_item:Nn \g_@@_state_active_intarray
{ \l_@@_curr_state_int }
< \l_@@_step_int
\tl_set:Nn \l_@@_curr_submatches_prop {#2}
@@ -4814,7 +4903,7 @@
\exp_not:n
{
\if_int_compare:w
- \__intarray_item_fast:Nn \g_@@_state_active_intarray
+ \__kernel_intarray_item:Nn \g_@@_state_active_intarray
{ \l_@@_curr_state_int }
#1
\exp_after:wN \@@_use_state:
@@ -4838,8 +4927,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_action_cost:n #1
{
- \exp_args:No \@@_store_state:n
- { \__int_value:w \__int_eval:n { \l_@@_curr_state_int + #1 } }
+ \exp_args:Nx \@@_store_state:n
+ { \int_eval:n { \l_@@_curr_state_int + #1 } }
}
% \end{macrocode}
% \end{macro}
@@ -4853,7 +4942,7 @@
\cs_new_protected:Npn \@@_store_state:n #1
{
\@@_store_submatches:
- \__intarray_gset_fast:Nnn \g_@@_thread_state_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_thread_state_intarray
{ \l_@@_max_active_int } {#1}
\int_incr:N \l_@@_max_active_int
}
@@ -4898,7 +4987,7 @@
% empty match. Then mark that there was a successful match; it is
% empty if it is \enquote{fresh}; and we store the current position
% and submatches. The current step is then interrupted with
-% \cs{__prg_break:}, and only paths with higher precedence are
+% \cs{prg_break:}, and only paths with higher precedence are
% pursued further. The values stored here may be overwritten by a
% later success of a path with higher precedence.
% \begin{macrocode}
@@ -4912,7 +5001,7 @@
\int_set_eq:NN \l_@@_success_pos_int \l_@@_curr_pos_int
\prop_set_eq:NN \l_@@_success_submatches_prop
\l_@@_curr_submatches_prop
- \__prg_break:
+ \prg_break:
}
}
% \end{macrocode}
@@ -4983,8 +5072,8 @@
\cs_new:Npn \@@_replacement_do_one_match:n #1
{
\@@_query_range:nn
- { \__intarray_item_fast:Nn \g_@@_submatch_prev_intarray {#1} }
- { \__intarray_item_fast:Nn \g_@@_submatch_begin_intarray {#1} }
+ { \__kernel_intarray_item:Nn \g_@@_submatch_prev_intarray {#1} }
+ { \__kernel_intarray_item:Nn \g_@@_submatch_begin_intarray {#1} }
}
% \end{macrocode}
% \end{macro}
@@ -5020,19 +5109,19 @@
\cs_new:Npn \@@_query_range:nn #1#2
{
\exp_after:wN \@@_query_range_loop:ww
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
- \__prg_break_point:
+ \int_value:w \@@_int_eval:w #1 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w #2 ;
+ \prg_break_point:
}
\cs_new:Npn \@@_query_range_loop:ww #1 ; #2 ;
{
\if_int_compare:w #1 < #2 \exp_stop_f:
\else:
- \exp_after:wN \__prg_break:
+ \exp_after:wN \prg_break:
\fi:
\@@_toks_use:w #1 \exp_stop_f:
\exp_after:wN \@@_query_range_loop:ww
- \__int_value:w \__int_eval:w #1 + 1 ; #2 ;
+ \int_value:w \@@_int_eval:w #1 + 1 ; #2 ;
}
% \end{macrocode}
% \end{macro}
@@ -5044,13 +5133,13 @@
\cs_new:Npn \@@_query_submatch:n #1
{
\@@_query_range:nn
- { \__intarray_item_fast:Nn \g_@@_submatch_begin_intarray {#1} }
- { \__intarray_item_fast:Nn \g_@@_submatch_end_intarray {#1} }
+ { \__kernel_intarray_item:Nn \g_@@_submatch_begin_intarray {#1} }
+ { \__kernel_intarray_item:Nn \g_@@_submatch_end_intarray {#1} }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\@@_submatch_balance:n}
+% \begin{macro}{\@@_submatch_balance:n}
% Every user function must result in a balanced token list (unbalanced
% token lists cannot be stored by TeX). When we unpacked the query, we
% kept track of the brace balance, hence the contribution from a given
@@ -5061,22 +5150,36 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_submatch_balance:n #1
{
- \__int_eval:n
+ \int_eval:n
{
\int_compare:nNnTF
- { \__intarray_item_fast:Nn \g_@@_submatch_end_intarray {#1} } = 0
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_end_intarray {#1}
+ }
+ = 0
{ 0 }
{
- \__intarray_item_fast:Nn \g_@@_balance_intarray
- { \__intarray_item_fast:Nn \g_@@_submatch_end_intarray {#1} }
+ \__kernel_intarray_item:Nn \g_@@_balance_intarray
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_end_intarray {#1}
+ }
}
-
\int_compare:nNnTF
- { \__intarray_item_fast:Nn \g_@@_submatch_begin_intarray {#1} } = 0
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_begin_intarray {#1}
+ }
+ = 0
{ 0 }
{
- \__intarray_item_fast:Nn \g_@@_balance_intarray
- { \__intarray_item_fast:Nn \g_@@_submatch_begin_intarray {#1} }
+ \__kernel_intarray_item:Nn \g_@@_balance_intarray
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_begin_intarray {#1}
+ }
}
}
}
@@ -5087,8 +5190,7 @@
%
% \begin{macro}{\@@_replacement:n}
% \begin{macro}{\@@_replacement_aux:n}
-% The replacement text is built incrementally by abusing \tn{toks}
-% within a group (see \pkg{l3tl-build}). We keep track in
+% The replacement text is built incrementally. We keep track in
% \cs{l_@@_balance_int} of the balance of explicit begin- and
% end-group tokens and we store in \cs{l_@@_balance_tl} some
% code to compute the brace balance from submatches (see its
@@ -5103,7 +5205,8 @@
{ \@@_trace_pop:nnN { regex } { 1 } \@@_replacement:n }
\cs_new_protected:Npn \@@_replacement:n #1
{
- \__tl_build:Nw \l_@@_internal_a_tl
+ \group_begin:
+ \tl_build_begin:N \l_@@_build_tl
\int_zero:N \l_@@_balance_int
\tl_clear:N \l_@@_balance_tl
\@@_escape_use:nnnn
@@ -5122,7 +5225,7 @@
\if_int_compare:w \l_@@_replacement_csnames_int > 0 \exp_stop_f:
\__kernel_msg_error:nnx { kernel } { replacement-missing-rbrace }
{ \int_use:N \l_@@_replacement_csnames_int }
- \__tl_build_one:x
+ \tl_build_put_right:Nx \l_@@_build_tl
{ \prg_replicate:nn \l_@@_replacement_csnames_int \cs_end: }
\fi:
\seq_if_empty:NF \l_@@_replacement_category_seq
@@ -5137,8 +5240,10 @@
\l_@@_balance_tl
- \@@_submatch_balance:n {##1}
}
- \__tl_build_end:
- \exp_args:No \@@_replacement_aux:n \l_@@_internal_a_tl
+ \tl_build_end:N \l_@@_build_tl
+ \exp_args:NNo
+ \group_end:
+ \@@_replacement_aux:n \l_@@_build_tl
}
\cs_new_protected:Npn \@@_replacement_aux:n #1
{
@@ -5145,8 +5250,14 @@
\cs_set:Npn \@@_replacement_do_one_match:n ##1
{
\@@_query_range:nn
- { \__intarray_item_fast:Nn \g_@@_submatch_prev_intarray {##1} }
- { \__intarray_item_fast:Nn \g_@@_submatch_begin_intarray {##1} }
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_prev_intarray {##1}
+ }
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_begin_intarray {##1}
+ }
#1
}
}
@@ -5156,7 +5267,7 @@
%
% \begin{macro}{\@@_replacement_normal:n}
% Most characters are simply sent to the output by
-% \cs{__tl_build_one:n}, unless a particular category code has been
+% \cs{tl_build_put_right:Nn}, unless a particular category code has been
% requested: then \cs{@@_replacement_c_A:w} or a similar auxiliary is
% called. One exception is right parentheses, which restore the
% category code in place before the group started. Note that the
@@ -5167,7 +5278,7 @@
\cs_new_protected:Npn \@@_replacement_normal:n #1
{
\tl_if_empty:NTF \l_@@_replacement_category_tl
- { \__tl_build_one:n {#1} }
+ { \tl_build_put_right:Nn \l_@@_build_tl {#1} }
{ % (
\token_if_eq_charcode:NNTF #1 )
{
@@ -5175,7 +5286,11 @@
\l_@@_replacement_category_tl
}
{
- \use:c { @@_replacement_c_ \l_@@_replacement_category_tl :w }
+ \use:c
+ {
+ @@_replacement_c_
+ \l_@@_replacement_category_tl :w
+ }
\@@_replacement_normal:n {#1}
}
}
@@ -5212,17 +5327,21 @@
% Unless the submatch appears inside a |\c{...}| or |\u{...}|
% construction, it must be taken into account in the brace balance.
% Later on, |##1| will be replaced by a pointer to the $0$-th submatch for a
-% given match. We cannot use \cs{int_eval:n} because it is
-% expandable, and would be expanded too early (short of adding
-% \cs{exp_not:N}, making the code messy again).
+% given match. There is an \cs{exp_not:N} here as at the point-of-use
+% of \cs{l_@@_balance_tl} there is an \texttt{x}-type expansion which is needed
+% to get |##1| in correctly.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_put_submatch:n #1
{
\if_int_compare:w #1 < \l_@@_capturing_group_int
- \__tl_build_one:n { \@@_query_submatch:n { #1 + ##1 } }
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_query_submatch:n { \int_eval:n { #1 + ##1 } } }
\if_int_compare:w \l_@@_replacement_csnames_int = 0 \exp_stop_f:
\tl_put_right:Nn \l_@@_balance_tl
- { + \@@_submatch_balance:n { \__int_eval:n { #1+##1 } } }
+ {
+ + \@@_submatch_balance:n
+ { \exp_not:N \int_eval:n { #1 + ##1 } }
+ }
\fi:
\fi:
}
@@ -5237,7 +5356,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_g:w #1#2
{
- \str_if_eq_x:nnTF { #1#2 } { \@@_replacement_normal:n \c_left_brace_str }
+ \str_if_eq_x:nnTF
+ { #1#2 }
+ { \@@_replacement_normal:n \c_left_brace_str }
{ \l_@@_internal_a_int = \@@_replacement_g_digits:NN }
{ \@@_replacement_error:NNN g #1 #2 }
}
@@ -5308,9 +5429,11 @@
\cs_new_protected:Npn \@@_replacement_cu_aux:Nw #1
{
\if_case:w \l_@@_replacement_csnames_int
- \__tl_build_one:n { \exp_not:n { \exp_after:wN #1 \cs:w } }
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \exp_not:n { \exp_after:wN #1 \cs:w } }
\else:
- \__tl_build_one:n { \exp_not:n { \exp_after:wN \tl_to_str:V \cs:w } }
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \exp_not:n { \exp_after:wN \tl_to_str:V \cs:w } }
\fi:
\int_incr:N \l_@@_replacement_csnames_int
}
@@ -5324,7 +5447,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_u:w #1#2
{
- \str_if_eq_x:nnTF { #1#2 } { \@@_replacement_normal:n \c_left_brace_str }
+ \str_if_eq_x:nnTF
+ { #1#2 }
+ { \@@_replacement_normal:n \c_left_brace_str }
{ \@@_replacement_cu_aux:Nw \exp_not:V }
{ \@@_replacement_error:NNN u #1#2 }
}
@@ -5339,7 +5464,7 @@
\cs_new_protected:Npn \@@_replacement_rbrace:N #1
{
\if_int_compare:w \l_@@_replacement_csnames_int > 0 \exp_stop_f:
- \__tl_build_one:n \cs_end:
+ \tl_build_put_right:Nn \l_@@_build_tl { \cs_end: }
\int_decr:N \l_@@_replacement_csnames_int
\else:
\@@_replacement_normal:n {#1}
@@ -5370,7 +5495,11 @@
#2 #3
}
{
- \str_if_eq:nnTF { #2 #3 } { \@@_replacement_normal:n ( } % )
+ \str_if_eq:nnTF
+ { #2#3 }
+ {
+ \@@_replacement_normal:n ( % )
+ }
{
\seq_push:NV \l_@@_replacement_category_seq
\l_@@_replacement_category_tl
@@ -5416,7 +5545,7 @@
\cs_new_protected:Npn \@@_replacement_char:nNN #1#2#3
{
\tex_lccode:D 0 = `#3 \scan_stop:
- \tex_lowercase:D { \__tl_build_one:n {#1} }
+ \tex_lowercase:D { \tl_build_put_right:Nn \l_@@_build_tl {#1} }
}
% \end{macrocode}
% \end{macro}
@@ -5460,7 +5589,10 @@
% character, we prepare for two \texttt{x}-expansions.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_c_C:w #1#2
- { \__tl_build_one:n { \exp_not:N \exp_not:N \exp_not:c {#2} } }
+ {
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \exp_not:N \exp_not:N \exp_not:c {#2} }
+ }
% \end{macrocode}
% \end{macro}
%
@@ -5546,7 +5678,7 @@
\__kernel_msg_error:nn { kernel } { replacement-null-space }
\fi:
\tex_lccode:D `\ = `#2 \scan_stop:
- \tex_lowercase:D { \__tl_build_one:n {~} }
+ \tex_lowercase:D { \tl_build_put_right:Nn \l_@@_build_tl {~} }
}
% \end{macrocode}
% \end{macro}
@@ -5650,7 +5782,7 @@
}
\cs_new_protected:Npn \regex_show:N #1
{
- \__kernel_check_defined:NT #1
+ \__kernel_chk_defined:NT #1
{
\@@_show:N #1
\msg_show:nnxxxx { LaTeX / kernel } { show-regex }
@@ -5691,7 +5823,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
+% \begin{macro}[noTF]
% {
% \regex_extract_once:nnN, \regex_extract_once:NnN,
% \regex_extract_all:nnN, \regex_extract_all:NnN,
@@ -5699,14 +5831,6 @@
% \regex_replace_all:nnN, \regex_replace_all:NnN,
% \regex_split:nnN, \regex_split:NnN
% }
-% \begin{macro}[TF]
-% {
-% \regex_extract_once:nnN, \regex_extract_once:NnN,
-% \regex_extract_all:nnN, \regex_extract_all:NnN,
-% \regex_replace_once:nnN, \regex_replace_once:NnN,
-% \regex_replace_all:nnN, \regex_replace_all:NnN,
-% \regex_split:nnN, \regex_split:NnN
-% }
% We define here $40$ user functions, following a common pattern in
% terms of \texttt{:nnN} auxiliaries, defined in the coming
% subsections. The auxiliary is handed \cs{@@_build:n} or
@@ -5735,7 +5859,6 @@
\@@_tmp:w \@@_split:nnN \regex_split:nnN \regex_split:NnN
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \subsubsection{Variables and helpers for user functions}
%
@@ -5777,9 +5900,9 @@
% \begin{variable}{\g_@@_submatch_prev_intarray, \g_@@_submatch_begin_intarray, \g_@@_submatch_end_intarray}
% Hold the place where the match attempt begun and the end-points of each submatch.
% \begin{macrocode}
-\__intarray_new:Nn \g_@@_submatch_prev_intarray { 65536 }
-\__intarray_new:Nn \g_@@_submatch_begin_intarray { 65536 }
-\__intarray_new:Nn \g_@@_submatch_end_intarray { 65536 }
+\intarray_new:Nn \g_@@_submatch_prev_intarray { 65536 }
+\intarray_new:Nn \g_@@_submatch_begin_intarray { 65536 }
+\intarray_new:Nn \g_@@_submatch_end_intarray { 65536 }
% \end{macrocode}
% \end{variable}
%
@@ -5883,17 +6006,18 @@
\group_begin:
\@@_multi_match:n
{
- \if_int_compare:w \l_@@_start_pos_int < \l_@@_success_pos_int
+ \if_int_compare:w
+ \l_@@_start_pos_int < \l_@@_success_pos_int
\@@_extract:
- \__intarray_gset_fast:Nnn \g_@@_submatch_prev_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
{ \l_@@_zeroth_submatch_int } { 0 }
- \__intarray_gset_fast:Nnn \g_@@_submatch_end_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray
{ \l_@@_zeroth_submatch_int }
{
- \__intarray_item_fast:Nn \g_@@_submatch_begin_intarray
+ \__kernel_intarray_item:Nn \g_@@_submatch_begin_intarray
{ \l_@@_zeroth_submatch_int }
}
- \__intarray_gset_fast:Nnn \g_@@_submatch_begin_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_begin_intarray
{ \l_@@_zeroth_submatch_int }
{ \l_@@_start_pos_int }
\fi:
@@ -5901,12 +6025,12 @@
#1
\@@_match:n {#2}
%<assert>\assert_int:n { \l_@@_curr_pos_int = \l_@@_max_pos_int }
- \__intarray_gset_fast:Nnn \g_@@_submatch_prev_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
{ \l_@@_submatch_int } { 0 }
- \__intarray_gset_fast:Nnn \g_@@_submatch_end_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray
{ \l_@@_submatch_int }
{ \l_@@_max_pos_int }
- \__intarray_gset_fast:Nnn \g_@@_submatch_begin_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_begin_intarray
{ \l_@@_submatch_int }
{ \l_@@_start_pos_int }
\int_incr:N \l_@@_submatch_int
@@ -5925,39 +6049,36 @@
% from \cs{l_@@_min_submatch_int} to
% \cs{l_@@_submatch_int} (exclusive). Extract the relevant ranges
% into \cs{l_@@_internal_a_tl}. We detect unbalanced results using
-% the two flags \texttt{@@_begin} and \texttt{@@_end}, raised
+% the two flags \texttt{__regex_begin} and \texttt{__regex_end}, raised
% whenever we see too many begin-group or end-group tokens in a
-% submatch. We disable \cs{__seq_item:n} to prevent two
-% \texttt{x}-expansions.
+% submatch.
% \begin{macrocode}
\cs_new_protected:Npn \@@_group_end_extract_seq:N #1
{
- \cs_set_eq:NN \__seq_item:n \scan_stop:
\flag_clear:n { @@_begin }
\flag_clear:n { @@_end }
- \tl_set:Nx \l_@@_internal_a_tl
+ \seq_set_from_function:NnN \l_@@_internal_seq
{
- \s__seq
- \int_step_function:nnnN
- { \l_@@_min_submatch_int }
- { 1 }
+ \int_step_function:nnN { \l_@@_min_submatch_int }
{ \l_@@_submatch_int - 1 }
- \@@_extract_seq_aux:n
}
+ \@@_extract_seq_aux:n
\int_compare:nNnF
- { \flag_height:n { @@_begin } + \flag_height:n { @@_end } }
- = 0
{
+ \flag_height:n { @@_begin } +
+ \flag_height:n { @@_end }
+ }
+ = 0
+ {
\__kernel_msg_error:nnxxx { kernel } { result-unbalanced }
{ splitting~or~extracting~submatches }
{ \flag_height:n { @@_end } }
{ \flag_height:n { @@_begin } }
}
- \use:x
- {
- \group_end:
- \tl_set:Nn \exp_not:N #1 { \l_@@_internal_a_tl }
- }
+ \seq_set_map:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
+ \exp_args:NNNo
+ \group_end:
+ \tl_set:Nn #1 { \l_@@_internal_seq }
}
% \end{macrocode}
% \end{macro}
@@ -5970,11 +6091,8 @@
% \begin{macrocode}
\cs_new:Npn \@@_extract_seq_aux:n #1
{
- \__seq_item:n
- {
- \exp_after:wN \@@_extract_seq_aux:ww
- \__int_value:w \@@_submatch_balance:n {#1} ; #1;
- }
+ \exp_after:wN \@@_extract_seq_aux:ww
+ \int_value:w \@@_submatch_balance:n {#1} ; #1;
}
\cs_new:Npn \@@_extract_seq_aux:ww #1; #2;
{
@@ -6010,11 +6128,11 @@
\int_set_eq:NN \l_@@_zeroth_submatch_int \l_@@_submatch_int
\prg_replicate:nn \l_@@_capturing_group_int
{
- \__intarray_gset_fast:Nnn \g_@@_submatch_begin_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_begin_intarray
{ \l_@@_submatch_int } { 0 }
- \__intarray_gset_fast:Nnn \g_@@_submatch_end_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray
{ \l_@@_submatch_int } { 0 }
- \__intarray_gset_fast:Nnn \g_@@_submatch_prev_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
{ \l_@@_submatch_int } { 0 }
\int_incr:N \l_@@_submatch_int
}
@@ -6021,20 +6139,23 @@
\prop_map_inline:Nn \l_@@_success_submatches_prop
{
\if_int_compare:w ##1 - 1 \exp_stop_f:
- \exp_after:wN \@@_extract_e:wn \__int_value:w
+ \exp_after:wN \@@_extract_e:wn \int_value:w
\else:
- \exp_after:wN \@@_extract_b:wn \__int_value:w
+ \exp_after:wN \@@_extract_b:wn \int_value:w
\fi:
- \__int_eval:w \l_@@_zeroth_submatch_int + ##1 {##2}
+ \@@_int_eval:w \l_@@_zeroth_submatch_int + ##1 {##2}
}
- \__intarray_gset_fast:Nnn \g_@@_submatch_prev_intarray
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
{ \l_@@_zeroth_submatch_int } { \l_@@_start_pos_int }
\fi:
}
\cs_new_protected:Npn \@@_extract_b:wn #1 < #2
- { \__intarray_gset_fast:Nnn \g_@@_submatch_begin_intarray {#1} {#2} }
+ {
+ \__kernel_intarray_gset:Nnn
+ \g_@@_submatch_begin_intarray {#1} {#2}
+ }
\cs_new_protected:Npn \@@_extract_e:wn #1 > #2
- { \__intarray_gset_fast:Nnn \g_@@_submatch_end_intarray {#1} {#2} }
+ { \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
@@ -6072,10 +6193,11 @@
}
\tl_set:Nx \l_@@_internal_a_tl
{
- \@@_replacement_do_one_match:n { \l_@@_zeroth_submatch_int }
+ \@@_replacement_do_one_match:n
+ { \l_@@_zeroth_submatch_int }
\@@_query_range:nn
{
- \__intarray_item_fast:Nn \g_@@_submatch_end_intarray
+ \__kernel_intarray_item:Nn \g_@@_submatch_end_intarray
{ \l_@@_zeroth_submatch_int }
}
{ \l_@@_max_pos_int }
@@ -6170,27 +6292,21 @@
%
% Messages for the preparsing phase.
% \begin{macrocode}
-\__kernel_msg_new:nnnn { kernel } { trailing-backslash }
- { Trailing~escape~character~'\iow_char:N\\'. }
+\use:x
{
- A~regular~expression~or~its~replacement~text~ends~with~
- the~escape~character~'\iow_char:N\\'.~It~will~be~ignored.
+ \__kernel_msg_new:nnn { kernel } { trailing-backslash }
+ { Trailing~escape~char~'\iow_char:N\\'~in~regex~or~replacement. }
+ \__kernel_msg_new:nnn { kernel } { x-missing-rbrace }
+ {
+ Missing~brace~'\iow_char:N\}'~in~regex~
+ '...\iow_char:N\\x\iow_char:N\{...##1'.
+ }
+ \__kernel_msg_new:nnn { kernel } { x-overflow }
+ {
+ Character~code~##1~too~large~in~
+ \iow_char:N\\x\iow_char:N\{##2\iow_char:N\}~regex.
+ }
}
-\__kernel_msg_new:nnnn { kernel } { x-missing-rbrace }
- { Missing~closing~brace~in~'\iow_char:N\\x'~hexadecimal~sequence. }
- {
- You~wrote~something~like~
- '\iow_char:N\\x\{...#1'.~
- The~closing~brace~is~missing.
- }
-\__kernel_msg_new:nnnn { kernel } { x-overflow }
- { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. }
- {
- You~wrote~something~like~
- '\iow_char:N\\x\{\int_to_Hex:n{#1}\}'.~
- The~character~code~#1~is~larger~than~
- the~maximum~value~\int_use:N \c_max_char_int.
- }
% \end{macrocode}
%
% Invalid quantifier.
@@ -6294,6 +6410,12 @@
control~sequence~or~the~next~group~to~be~made~of~control~sequences.~
It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group.
}
+\__kernel_msg_new:nnnn { kernel } { c-lparen-in-class }
+ { Catcode~test~cannot~apply~to~group~in~character~class }
+ {
+ Construction~such~as~'\iow_char:N\\cL(abc)'~are~not~allowed~inside~a~
+ class~'[...]'~because~classes~do~not~match~multiple~characters~at~once.
+ }
\__kernel_msg_new:nnnn { kernel } { c-missing-rbrace }
{ Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. }
{
@@ -6334,7 +6456,8 @@
\str_if_eq_x:nnTF { } {#2}
{ reached~the~end~of~the~string~ }
{ encountered~an~escaped~alphanumeric~character '\iow_char:N\\#2'~ }
- when~parsing~the~argument~of~an~'\iow_char:N\\u\iow_char:N\{...\}'~escape.
+ when~parsing~the~argument~of~an~
+ '\iow_char:N\\u\iow_char:N\{...\}'~escape.
}
% \end{macrocode}
%
@@ -6467,7 +6590,8 @@
{ Missing~right~parenthesis~inserted~in~replacement~text. }
{
There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
- missing~right~\int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } .
+ missing~right~
+ \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } .
}
% \end{macrocode}
%
@@ -6518,7 +6642,7 @@
% typically~1. If the module's current tracing level is less than
% |#2| show nothing, otherwise write |#3| to the terminal.
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_new_protected:Npn \@@_trace_push:nnN #1#2#3
{ \@@_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
@@ -6547,13 +6671,12 @@
% stored in \tn{toks} from $0$ to \cs{l_@@_max_state_int}
% (excluded).
% \begin{macrocode}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_new_protected:Npn \@@_trace_states:n #1
{
- \int_step_inline:nnnn
+ \int_step_inline:nnn
\l_@@_min_state_int
- { 1 }
{ \l_@@_max_state_int - 1 }
{
\@@_trace:nnx { regex } {#1}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3seq.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3seq.dtx Copyright (C) 1990-2018 The 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
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -855,40 +855,6 @@
% Writes the entries in the \meta{sequence} in the log file.
% \end{function}
%
-% \section{Internal sequence functions}
-%
-% \begin{variable}{\s__seq}
-% This scan mark (equal to \cs{scan_stop:}) marks the beginning of a
-% sequence variable.
-% \end{variable}
-%
-% \begin{function}[EXP]{\__seq_item:n}
-% \begin{syntax}
-% \cs{__seq_item:n} \Arg{item}
-% \end{syntax}
-% The internal token used to begin each sequence entry. If expanded
-% outside of a mapping or manipulation function, an error is
-% raised. The definition should always be set globally.
-% \end{function}
-%
-% \begin{function}{\__seq_push_item_def:n, \__seq_push_item_def:x}
-% \begin{syntax}
-% \cs{__seq_push_item_def:n} \Arg{code}
-% \end{syntax}
-% Saves the definition of \cs{__seq_item:n} and redefines it to
-% accept one parameter and expand to \meta{code}. This function
-% should always be balanced by use of \cs{__seq_pop_item_def:}.
-% \end{function}
-%
-% \begin{function}{\__seq_pop_item_def:}
-% \begin{syntax}
-% \cs{__seq_pop_item_def:}
-% \end{syntax}
-% Restores the definition of \cs{__seq_item:n} most recently saved by
-% \cs{__seq_push_item_def:n}. This function should always be used in
-% a balanced pair with \cs{__seq_push_item_def:n}.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -913,10 +879,40 @@
% \meta{item_1} \cs{seq_elt_end:} \ldots \cs{seq_elt:w} \meta{item_n}
% \cs{seq_elt_end:}}. This allowed rapid searching using a delimited
% function, but was not suitable for items containing |{|, |}| and |#|
-% tokens, and also lead to the loss of surrounding braces around items.
+% tokens, and also lead to the loss of surrounding braces around items
%
+% \begin{function}[EXP]{\@@_item:n}
+% \begin{syntax}
+% \cs{@@_item:n} \Arg{item}
+% \end{syntax}
+% The internal token used to begin each sequence entry. If expanded
+% outside of a mapping or manipulation function, an error is
+% raised. The definition should always be set globally.
+% \end{function}
+%
+% \begin{function}{\@@_push_item_def:n, \@@_push_item_def:x}
+% \begin{syntax}
+% \cs{@@_push_item_def:n} \Arg{code}
+% \end{syntax}
+% Saves the definition of \cs{@@_item:n} and redefines it to
+% accept one parameter and expand to \meta{code}. This function
+% should always be balanced by use of \cs{@@_pop_item_def:}.
+% \end{function}
+%
+% \begin{function}{\@@_pop_item_def:}
+% \begin{syntax}
+% \cs{@@_pop_item_def:}
+% \end{syntax}
+% Restores the definition of \cs{@@_item:n} most recently saved by
+% \cs{@@_push_item_def:n}. This function should always be used in
+% a balanced pair with \cs{@@_push_item_def:n}.
+% \end{function}
+%
% \begin{variable}{\s_@@}
-% The variable is defined in the \pkg{l3quark} module, loaded later.
+% This private scan mark.
+% \begin{macrocode}
+\scan_new:N \s_@@
+% \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_item:n}
@@ -962,7 +958,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_eq:NN #1 \c_empty_seq
}
\cs_generate_variant:Nn \seq_new:N { c }
@@ -1451,10 +1447,10 @@
#1
\group_end:
\prg_return_false:
- \__prg_break_point:
+ \prg_break_point:
}
\cs_new:Npn \@@_if_in:
- { \__prg_break:n { \group_end: \prg_return_true: } }
+ { \prg_break:n { \group_end: \prg_return_true: } }
\prg_generate_conditional_variant:Nnn \seq_if_in:Nn
{ NV , Nv , No , Nx , c , cV , cv , co , cx } { T , F , TF }
% \end{macrocode}
@@ -1542,30 +1538,29 @@
%
% \begin{macro}{\seq_get_right:NN, \seq_get_right:cN}
% \UnitTested
-% \begin{macro}{\@@_get_right_loop:nn}
-% First remove \cs{s_@@} and prepend \cs{q_no_value}, then take two
-% arguments at a time. Before the right-hand end of the sequence,
-% this is a brace group followed by \cs{@@_item:n}, both removed by
-% \cs{use_none:nn}. At the end of the sequence, the two question
-% marks are taken by \cs{use_none:nn}, and the assignment is placed
-% before the right-most item. In the next iteration,
-% \cs{@@_get_right_loop:nn} receives two empty arguments, and
-% \cs{use_none:nn} stops the loop.
+% \begin{macro}[EXP]{\@@_get_right_loop:nw, \@@_get_right_end:NnN}
+% First remove \cs{s_@@} and prepend \cs{q_no_value}. The first
+% argument of \cs{@@_get_right_loop:nw} is the last item found, and
+% the second argument is empty until the end of the loop, where it is
+% code that applies \cs{exp_not:n} to the last item and ends the loop.
% \begin{macrocode}
\cs_new_protected:Npn \seq_get_right:NN #1#2
{
- \exp_after:wN \use_i_ii:nnn
- \exp_after:wN \@@_get_right_loop:nn
- \exp_after:wN \q_no_value
- #1
- { ?? \tl_set:Nn #2 }
- { } { }
+ \tl_set:Nx #2
+ {
+ \exp_after:wN \use_i_ii:nnn
+ \exp_after:wN \@@_get_right_loop:nw
+ \exp_after:wN \q_no_value
+ #1
+ \@@_get_right_end:NnN \@@_item:n
+ }
}
-\cs_new_protected:Npn \@@_get_right_loop:nn #1#2
+\cs_new:Npn \@@_get_right_loop:nw #1#2 \@@_item:n
{
- \use_none:nn #2 {#1}
- \@@_get_right_loop:nn
+ #2 \use_none:n {#1}
+ \@@_get_right_loop:nw
}
+\cs_new:Npn \@@_get_right_end:NnN #1#2#3 { \exp_not:n {#2} }
\cs_generate_variant:Nn \seq_get_right:NN { c }
% \end{macrocode}
% \end{macro}
@@ -1646,18 +1641,26 @@
% \begin{macro}[TF]{\seq_gpop_right:NN, \seq_gpop_right:cN}
% More or less the same for popping.
% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2
+ { T , F , TF }
{ \@@_pop_TF:NNNN \@@_pop_left:NNN \tl_set:Nn #1 #2 }
-\prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2
+ { T , F , TF }
{ \@@_pop_TF:NNNN \@@_pop_left:NNN \tl_gset:Nn #1 #2 }
-\prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2
+ { T , F , TF }
{ \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_set:Nx #1 #2 }
-\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2
+ { T , F , TF }
{ \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_gset:Nx #1 #2 }
-\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c }
+ { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c }
+ { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c }
+ { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c }
+ { T , F , TF }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1665,21 +1668,21 @@
% \end{macro}
%
% \begin{macro}{\seq_item:Nn, \seq_item:cn}
-% \begin{macro}{\@@_item:wNn, \@@_item:nN, \@@_item:nnn}
+% \begin{macro}{\@@_item:wNn, \@@_item:nN, \@@_item:nwn}
% The idea here is to find the offset of the item from the left, then use
% a loop to grab the correct item. If the resulting offset is too large,
-% then the stop code |{ ? \__prg_break: } { }| is used by the auxiliary,
-% terminating the loop and returning nothing at all.
+% then the argument delimited by \cs{@@_item:n} is \cs{prg_break:} instead
+% of being empty, terminating the loop and returning nothing at all.
% \begin{macrocode}
\cs_new:Npn \seq_item:Nn #1
{ \exp_after:wN \@@_item:wNn #1 \q_stop #1 }
\cs_new:Npn \@@_item:wNn \s_@@ #1 \q_stop #2#3
{
- \exp_args:Nf \@@_item:nnn
+ \exp_args:Nf \@@_item:nwn
{ \exp_args:Nf \@@_item:nN { \int_eval:n {#3} } #2 }
#1
- { ? \__prg_break: } { }
- \__prg_break_point:
+ \prg_break: \@@_item:n { }
+ \prg_break_point:
}
\cs_new:Npn \@@_item:nN #1#2
{
@@ -1687,12 +1690,12 @@
{ \int_eval:n { \seq_count:N #2 + 1 + #1 } }
{#1}
}
-\cs_new:Npn \@@_item:nnn #1#2#3
+\cs_new:Npn \@@_item:nwn #1#2 \@@_item:n #3
{
- \use_none:n #2
+ #2
\int_compare:nNnTF {#1} = 1
- { \__prg_break:n { \exp_not:n {#3} } }
- { \exp_args:Nf \@@_item:nnn { \int_eval:n { #1 - 1 } } }
+ { \prg_break:n { \exp_not:n {#3} } }
+ { \exp_args:Nf \@@_item:nwn { \int_eval:n { #1 - 1 } } }
}
\cs_generate_variant:Nn \seq_item:Nn { c }
% \end{macrocode}
@@ -1705,14 +1708,14 @@
% \UnitTested
% \begin{macro}{\seq_map_break:n}
% \UnitTested
-% To break a function, the special token \cs{__prg_break_point:Nn} is
+% To break a function, the special token \cs{prg_break_point:Nn} is
% used to find the end of the code. Any ending code is then inserted
% before the return value of \cs{seq_map_break:n} is inserted.
% \begin{macrocode}
\cs_new:Npn \seq_map_break:
- { \__prg_map_break:Nn \seq_map_break: { } }
+ { \prg_map_break:Nn \seq_map_break: { } }
\cs_new:Npn \seq_map_break:n
- { \__prg_map_break:Nn \seq_map_break: }
+ { \prg_map_break:Nn \seq_map_break: }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1721,26 +1724,26 @@
% \UnitTested
% \begin{macro}[rEXP]{\@@_map_function:NNn}
% The idea here is to apply the code of |#2| to each item in the
-% sequence without altering the definition of \cs{@@_item:n}. This
-% is done as by noting that every odd token in the sequence must be
-% \cs{@@_item:n}, which can be gobbled by \cs{use_none:n}. At the end of
-% the loop, |#2| is instead |? \seq_map_break:|, which therefore breaks the
-% loop without needing to do a (relatively-expensive) quark test.
+% sequence without altering the definition of \cs{@@_item:n}. The
+% argument delimited by \cs{@@_item:n} is almost always empty, except
+% at the end of the loop where it is \cs{prg_break:}. This allows to
+% break the loop without needing to do a (relatively-expensive) quark
+% test.
% \begin{macrocode}
\cs_new:Npn \seq_map_function:NN #1#2
{
\exp_after:wN \use_i_ii:nnn
- \exp_after:wN \@@_map_function:NNn
+ \exp_after:wN \@@_map_function:Nw
\exp_after:wN #2
#1
- { ? \seq_map_break: } { }
- \__prg_break_point:Nn \seq_map_break: { }
+ \prg_break: \@@_item:n { } \prg_break_point:
+ \prg_break_point:Nn \seq_map_break: { }
}
-\cs_new:Npn \@@_map_function:NNn #1#2#3
+\cs_new:Npn \@@_map_function:Nw #1#2 \@@_item:n #3
{
- \use_none:n #2
+ #2
#1 {#3}
- \@@_map_function:NNn #1
+ \@@_map_function:Nw #1
}
\cs_generate_variant:Nn \seq_map_function:NN { c }
% \end{macrocode}
@@ -1766,15 +1769,15 @@
}
\cs_new_protected:Npn \@@_push_item_def:
{
- \int_gincr:N \g__prg_map_int
- \cs_gset_eq:cN { __prg_map_ \int_use:N \g__prg_map_int :w }
+ \int_gincr:N \g__kernel_prg_map_int
+ \cs_gset_eq:cN { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
\@@_item:n
}
\cs_new_protected:Npn \@@_pop_item_def:
{
\cs_gset_eq:Nc \@@_item:n
- { __prg_map_ \int_use:N \g__prg_map_int :w }
- \int_gdecr:N \g__prg_map_int
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
+ \int_gdecr:N \g__kernel_prg_map_int
}
% \end{macrocode}
% \end{macro}
@@ -1791,7 +1794,7 @@
{
\@@_push_item_def:n {#2}
#1
- \__prg_break_point:Nn \seq_map_break: { \@@_pop_item_def: }
+ \prg_break_point:Nn \seq_map_break: { \@@_pop_item_def: }
}
\cs_generate_variant:Nn \seq_map_inline:Nn { c }
% \end{macrocode}
@@ -1815,7 +1818,7 @@
\exp_not:n {#3}
}
#1
- \__prg_break_point:Nn \seq_map_break: { \@@_pop_item_def: }
+ \prg_break_point:Nn \seq_map_break: { \@@_pop_item_def: }
}
\cs_generate_variant:Nn \seq_map_variable:NNn { Nc }
\cs_generate_variant:Nn \seq_map_variable:NNn { c , cc }
@@ -1823,20 +1826,37 @@
% \end{macro}
%
% \begin{macro}{\seq_count:N, \seq_count:c}
-% \begin{macro}{\@@_count:n}
-% Counting the items in a sequence is done using the same approach as for
-% other count functions: turn each entry into a \texttt{+1} then use
-% integer evaluation to actually do the mathematics.
+% \begin{macro}{\@@_count:w, \@@_count_end:w}
+% Since counting the items in a sequence is quite common, we optimize
+% it by grabbing $8$~items at a time and correspondingly adding $8$ to
+% an integer expression. At the end of the loop, |#9| is
+% \cs{@@_count_end:w} instead of being empty. It removes |8+| and
+% instead places the number of \cs{@@_item:n} that \cs{@@_count:w}
+% grabbed before reaching the end of the sequence.
% \begin{macrocode}
\cs_new:Npn \seq_count:N #1
{
\int_eval:n
{
- 0
- \seq_map_function:NN #1 \@@_count:n
+ \exp_after:wN \use_i:nn
+ \exp_after:wN \@@_count:w
+ #1
+ \@@_count_end:w \@@_item:n 7
+ \@@_count_end:w \@@_item:n 6
+ \@@_count_end:w \@@_item:n 5
+ \@@_count_end:w \@@_item:n 4
+ \@@_count_end:w \@@_item:n 3
+ \@@_count_end:w \@@_item:n 2
+ \@@_count_end:w \@@_item:n 1
+ \@@_count_end:w \@@_item:n 0
+ \prg_break_point:
}
}
-\cs_new:Npn \@@_count:n #1 { + 1 }
+\cs_new:Npn \@@_count:w
+ #1 \@@_item:n #2 \@@_item:n #3 \@@_item:n #4 \@@_item:n
+ #5 \@@_item:n #6 \@@_item:n #7 \@@_item:n #8 #9 \@@_item:n
+ { #9 8 + \@@_count:w }
+\cs_new:Npn \@@_count_end:w 8 + \@@_count:w #1#2 \prg_break_point: {#1}
\cs_generate_variant:Nn \seq_count:N { c }
% \end{macrocode}
% \end{macro}
@@ -1983,7 +2003,7 @@
\cs_generate_variant:Nn \seq_log:N { c }
\cs_new_protected:Npn \@@_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{
#1 { LaTeX/kernel } { show-seq }
{ \token_to_str:N #2 }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -1042,33 +1042,6 @@
% \end{texnote}
% \end{function}
%
-% \section{Internal functions}
-%
-% \begin{function}[EXP]{\__dim_eval:w, \__dim_eval_end:}
-% \begin{syntax}
-% \cs{__dim_eval:w} \meta{dimexpr} \cs{__dim_eval_end:}
-% \end{syntax}
-% Evaluates \meta{dimension expression} as described for \cs{dim_eval:n}.
-% The evaluation stops when an unexpandable token which is not a valid
-% part of a dimension is read or when \cs{__dim_eval_end:} is
-% reached. The latter is gobbled by the scanner mechanism:
-% \cs{__dim_eval_end:} itself is unexpandable but used correctly
-% the entire construct is expandable.
-% \begin{texnote}
-% This is the \eTeX{} primitive \tn{dimexpr}.
-% \end{texnote}
-% \end{function}
-%
-% \begin{function}[EXP]{\__dim_eval:n}
-% \begin{syntax}
-% \cs{__dim_eval:n} \Arg{dimexpr}
-% \end{syntax}
-% By default this expands to \cs{__dim_eval:w} \meta{dimexpr}
-% \cs{__dim_eval_end:} but when debugging is enabled this expands to a
-% more complicated construction that evaluates \meta{dimexpr} with
-% parentheses and within a brace group to detect early termination.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -1106,7 +1079,7 @@
%<*package>
\cs_new_protected:Npn \dim_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs:w newdimen \cs_end: #1
}
%</package>
@@ -1244,7 +1217,10 @@
{ \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: \scan_stop: }
\@@_tmp:w \__kernel_chk_var_global:N
\cs_new_protected:Npn \dim_gadd:Nn #1#2
- { \tex_global:D \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: \scan_stop: }
+ {
+ \tex_global:D \tex_advance:D #1 by
+ \@@_eval:w #2 \@@_eval_end: \scan_stop:
+ }
\cs_generate_variant:Nn \dim_add:Nn { c }
\cs_generate_variant:Nn \dim_gadd:Nn { c }
\@@_tmp:w \__kernel_chk_var_local:N
@@ -1252,7 +1228,10 @@
{ \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: \scan_stop: }
\@@_tmp:w \__kernel_chk_var_global:N
\cs_new_protected:Npn \dim_gsub:Nn #1#2
- { \tex_global:D \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: \scan_stop: }
+ {
+ \tex_global:D \tex_advance:D #1 by
+ -\@@_eval:w #2 \@@_eval_end: \scan_stop:
+ }
\cs_generate_variant:Nn \dim_sub:Nn { c }
\cs_generate_variant:Nn \dim_gsub:Nn { c }
% \end{macrocode}
@@ -1328,13 +1307,13 @@
% \begin{macro}{\@@_ratio:n}
% With dimension expressions, something like |10 pt * ( 5 pt / 10 pt )| does
% not work. Instead, the ratio part needs to be converted to an integer
-% expression. Using \cs{__int_value:w} forces everything into |sp|, avoiding
+% expression. Using \cs{int_value:w} forces everything into |sp|, avoiding
% any decimal parts.
% \begin{macrocode}
\cs_new:Npn \dim_ratio:nn #1#2
{ \@@_ratio:n {#1} / \@@_ratio:n {#2} }
\cs_new:Npn \@@_ratio:n #1
- { \__int_value:w \@@_eval:w (#1) \@@_eval_end: }
+ { \int_value:w \@@_eval:w (#1) \@@_eval_end: }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1367,10 +1346,11 @@
% \@@_compare_<:w,
% \@@_compare_>:w
% }
+% \begin{macro}{\@@_compare_error:}
% This code is adapted from the \cs{int_compare:nTF} function. First
% make sure that there is at least one relation operator, by
% evaluating a dimension expression with a trailing
-% \cs{__prg_compare_error:}. Just like for integers, the looping
+% \cs{@@_compare_error:}. Just like for integers, the looping
% auxiliary \cs{@@_compare:wNN} closes a primitive conditional and
% opens a new one. It is actually easier to grab a dimension operand
% than an integer one, because once evaluated, dimensions all end with
@@ -1381,9 +1361,9 @@
\prg_new_conditional:Npnn \dim_compare:n #1 { p , T , F , TF }
{
\exp_after:wN \@@_compare:w
- \dim_use:N \@@_eval:w #1 \__prg_compare_error:
+ \dim_use:N \@@_eval:w #1 \@@_compare_error:
}
-\cs_new:Npn \@@_compare:w #1 \__prg_compare_error:
+\cs_new:Npn \@@_compare:w #1 \@@_compare_error:
{
\exp_after:wN \if_false: \exp:w \exp_end_continue_f:w
\@@_compare:wNN #1 ? { = \@@_compare_end:w \else: } \q_stop
@@ -1412,10 +1392,17 @@
#1 \reverse_if:N #2 > #3 = { #1 #2 < #3 }
\cs_new:Npn \@@_compare_end:w #1 \prg_return_false: #2 \q_stop
{ #1 \prg_return_false: \else: \prg_return_true: \fi: }
+\cs_new_protected:Npn \@@_compare_error:
+ {
+ \if_int_compare:w \c_zero \c_zero \fi:
+ =
+ \@@_compare_error:
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP, noTF]{\dim_case:nn}
% \begin{macro}{\@@_case:nnTF}
@@ -1452,7 +1439,8 @@
{ \@@_case_end:nw {#3} }
{ \@@_case:nw {#1} }
}
-\cs_new_eq:NN \@@_case_end:nw \__prg_case_end:nw
+\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+ { \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1555,9 +1543,18 @@
% \begin{macrocode}
\__kernel_patch_args:nNNpn
{
- { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_step_function:nnnN }
- { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \dim_step_function:nnnN }
- { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \dim_step_function:nnnN }
+ {
+ \__kernel_chk_expr:nNnN {#1} \@@_eval:w { }
+ \dim_step_function:nnnN
+ }
+ {
+ \__kernel_chk_expr:nNnN {#2} \@@_eval:w { }
+ \dim_step_function:nnnN
+ }
+ {
+ \__kernel_chk_expr:nNnN {#3} \@@_eval:w { }
+ \dim_step_function:nnnN
+ }
}
\cs_new:Npn \dim_step_function:nnnN #1#2#3
{
@@ -1599,8 +1596,8 @@
% The approach here is to build a function, with a global integer
% required to make the nesting safe (as seen in other in line
% functions), and map that function using \cs{dim_step_function:nnnN}.
-% We put a \cs{__prg_break_point:Nn} so that \texttt{map_break}
-% functions from other modules correctly decrement \cs{g__prg_map_int}
+% We put a \cs{prg_break_point:Nn} so that \texttt{map_break}
+% functions from other modules correctly decrement \cs{g__kernel_prg_map_int}
% before looking for their own break point. The first argument is
% \cs{scan_stop:}, so that no breaking function recognizes this break
% point as its own.
@@ -1607,17 +1604,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \dim_step_inline:nnnn
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \@@_step:NNnnnn
\cs_gset_protected:Npn
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
}
\cs_new_protected:Npn \dim_step_variable:nnnNn #1#2#3#4#5
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \@@_step:NNnnnn
\cs_gset_protected:Npx
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
{#1}{#2}{#3}
{
\tl_set:Nn \exp_not:N #4 {##1}
@@ -1628,7 +1625,7 @@
{
#1 #2 ##1 {#6}
\dim_step_function:nnnN {#3} {#4} {#5} #2
- \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__kernel_prg_map_int }
}
% \end{macrocode}
% \end{macro}
@@ -1647,18 +1644,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_eval:n}
-% Evaluating a dimension expression expandably. This is for use in
-% other modules, to avoid having to patch many commands. The only
-% difference with \cs{dim_eval:n} is the lack of \cs{dim_use:N}, to
-% produce an internal dimension rather than expand it into characters.
-% \begin{macrocode}
-\__kernel_patch_args:nNNpn
- { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } }
-\cs_new:Npn \@@_eval:n #1 { \@@_eval:w #1 \@@_eval_end: }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\dim_use:N, \dim_use:c}
% Accessing a \meta{dim}.
% \begin{macrocode}
@@ -1702,7 +1687,7 @@
% \end{macro}
%
% \begin{macro}[EXP]{\dim_to_decimal_in_bp:n}
-% Conversion to big points is done using a scaling inside \cs{__dim_eval:w}
+% Conversion to big points is done using a scaling inside \cs{@@_eval:w}
% as \eTeX{} does that using $64$-bit precision. Here, $800/803$ is the
% integer fraction for $72/72.27$. This is a common case so is hand-coded
% for accuracy (and speed).
@@ -1717,9 +1702,14 @@
% off-scale.
% \begin{macrocode}
\__kernel_patch_args:nNNpn
- { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal_in_sp:n } }
+ {
+ {
+ \__kernel_chk_expr:nNnN {#1} \@@_eval:w { }
+ \dim_to_decimal_in_sp:n
+ }
+ }
\cs_new:Npn \dim_to_decimal_in_sp:n #1
- { \int_eval:n { \@@_eval:w #1 \@@_eval_end: } }
+ { \int_value:w \@@_eval:w #1 \@@_eval_end: }
% \end{macrocode}
% \end{macro}
%
@@ -1799,6 +1789,10 @@
%
% \subsection{Creating and initialising \texttt{skip} variables}
%
+% \begin{macrocode}
+%<@@=skip>
+% \end{macrocode}
+%
% \begin{macro}{\skip_new:N, \skip_new:c}
% Allocation of a new internal registers.
% \begin{macrocode}
@@ -1805,7 +1799,7 @@
%<*package>
\cs_new_protected:Npn \skip_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs:w newskip \cs_end: #1
}
%</package>
@@ -1948,19 +1942,15 @@
% \begin{macrocode}
\prg_new_conditional:Npnn \skip_if_eq:nn #1#2 { p , T , F , TF }
{
- \if_int_compare:w
- \__str_if_eq_x:nn { \skip_eval:n { #1 } } { \skip_eval:n { #2 } }
- = 0 \exp_stop_f:
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
+ \str_if_eq_x:nnTF { \skip_eval:n { #1 } } { \skip_eval:n { #2 } }
+ { \prg_return_true: }
+ { \prg_return_false: }
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP,pTF]{\skip_if_finite:n}
-% \begin{macro}[EXP]{\__skip_if_finite:wwNw}
+% \begin{macro}[EXP]{\@@_if_finite:wwNw}
% With \eTeX{}, we have an easy access to the order of infinities of
% the stretch and shrink components of a skip. However, to access
% both, we either need to evaluate the expression twice, or evaluate
@@ -1980,11 +1970,11 @@
}
\prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
{
- \exp_after:wN \__skip_if_finite:wwNw
+ \exp_after:wN \@@_if_finite:wwNw
\skip_use:N \etex_glueexpr:D ##1 ; \prg_return_false:
#1 ; \prg_return_true: \q_stop
}
- \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
+ \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
}
\exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }
% \end{macrocode}
@@ -2020,12 +2010,22 @@
% \begin{macrocode}
\cs_new_eq:NN \skip_horizontal:N \tex_hskip:D
\__kernel_patch_args:nNNpn
- { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } }
+ {
+ {
+ \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { }
+ \skip_horizontal:n
+ }
+ }
\cs_new:Npn \skip_horizontal:n #1
{ \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
\cs_new_eq:NN \skip_vertical:N \tex_vskip:D
\__kernel_patch_args:nNNpn
- { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } }
+ {
+ {
+ \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { }
+ \skip_vertical:n
+ }
+ }
\cs_new:Npn \skip_vertical:n #1
{ \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
\cs_generate_variant:Nn \skip_horizontal:N { c }
@@ -2097,7 +2097,7 @@
%<*package>
\cs_new_protected:Npn \muskip_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs:w newmuskip \cs_end: #1
}
%</package>
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -81,7 +81,7 @@
%
% \begin{texnote}
% The current implementation is limited to sorting approximately
-% $20000$ items ($40000$ in Lua\TeX{}), depending on what other
+% $20000$ items ($40000$ in \LuaTeX{}), depending on what other
% packages are loaded.
%
% Internally, the code from \pkg{l3sort} stores items in \tn{toks}
@@ -91,6 +91,18 @@
% previously allocated \tn{toks} register is not a problem.
% \end{texnote}
%
+% \begin{function}[added = 2017-02-06]{\sort_return_same:, \sort_return_swapped:}
+% \begin{syntax}
+% \cs{seq_sort:Nn} \meta{seq~var}
+% ~~|{| \ldots{} \cs{sort_return_same:} or \cs{sort_return_swapped:} \ldots{} |}|
+% \end{syntax}
+% Indicates whether to keep the order or swap the order of two items
+% that are compared in the sorting code. Only one of the
+% \cs[no-index]{sort_return_\ldots{}} functions should be used by the
+% code, according to the results of some tests on the items |#1| and
+% |#2| to be compared.
+% \end{function}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -107,6 +119,20 @@
%
% \subsection{Variables}
%
+% \begin{variable}{\g_@@_internal_seq, \g_@@_internal_tl}
+% Sorting happens in a group; the result is stored in those global
+% variables before being copied outside the group to the proper
+% places. For seq and tl this is more efficient than using \cs{use:x}
+% (or some \cs{exp_args:NNNx}) to smuggle the definition outside the
+% group since \TeX{} does not need to re-read tokens. For clist we
+% don't gain anything since the result is converted from seq to clist
+% anyways.
+% \begin{macrocode}
+\seq_new:N \g_@@_internal_seq
+\tl_new:N \g_@@_internal_tl
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}
% {
% \l_@@_length_int, \l_@@_min_int, \l_@@_top_int, \l_@@_max_int,
@@ -232,7 +258,7 @@
% for \tn{loctoks} every time a sorting function is called, as
% \pkg{etex} or \pkg{elocalloc} could be loaded.
%
-% In Con\TeX{}t MkIV the range is from
+% In \ConTeXt{} MkIV the range is from
% $|\c_syst_last_allocated_toks|+1$ to \cs{c_max_register_int}, and in
% MkII it is from $|\lastallocatedtoks|+1$ to \cs{c_max_register_int}.
% In all these cases, call \cs{@@_shrink_range:}. The \LaTeX3 format
@@ -303,163 +329,124 @@
%
% \subsection{Protected user commands}
%
-% \begin{macro}{\@@_main:NNNnNn}
+% \begin{macro}{\@@_main:NNNn}
% Sorting happens in three steps. First store items in \tn{toks}
% registers ranging from \cs{l_@@_min_int} to $\cs{l_@@_top_int}-1$,
-% while checking that the list is not too
-% long. If we reach the maximum length, all further
-% items are entirely ignored after raising an error.
-% Secondly, sort the array of \tn{toks} registers,
-% using the user-defined sorting function, |#6|.
-% Finally, unpack the \tn{toks} registers (now sorted)
-% into a variable of the right type, by \texttt{x}-expanding
-% the code in |#4|, specific to each type of list.
+% while checking that the list is not too long. If we reach the
+% maximum length, that's an error; exit the group. Secondly, sort the
+% array of \tn{toks} registers, using the user-defined sorting
+% function: \cs{@@_level:} calls \cs{@@_compare:nn} as needed.
+% Finally, unpack the \tn{toks} registers (now sorted) into the target
+% tl, or into \cs{g_@@_internal_seq} for seq and clist. This is done
+% by \cs{@@_seq:NNNNn} and \cs{@@_tl:NNn}.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_main:NNNnNn #1#2#3#4#5#6
+\cs_new_protected:Npn \@@_main:NNNn #1#2#3#4
{
- \group_begin:
-%<package> \@@_disable_toksdef:
- \@@_compute_range:
- \int_set_eq:NN \l_@@_top_int \l_@@_min_int
- #2 #5
- {
- \if_int_compare:w \l_@@_top_int = \l_@@_max_int
- \@@_too_long_error:NNw #3 #5
- \fi:
- \tex_toks:D \l_@@_top_int {##1}
- \int_incr:N \l_@@_top_int
- }
- \int_set:Nn \l_@@_length_int
- { \l_@@_top_int - \l_@@_min_int }
- \cs_set:Npn \@@_compare:nn ##1 ##2 { #6 }
- \int_set:Nn \l_@@_block_int { 1 }
- \@@_level:
- \use:x
- {
- \group_end:
- #1 \exp_not:N #5 {#4}
- }
+%<package> \@@_disable_toksdef:
+ \@@_compute_range:
+ \int_set_eq:NN \l_@@_top_int \l_@@_min_int
+ #1 #3
+ {
+ \if_int_compare:w \l_@@_top_int = \l_@@_max_int
+ \@@_too_long_error:NNw #2 #3
+ \fi:
+ \tex_toks:D \l_@@_top_int {##1}
+ \int_incr:N \l_@@_top_int
+ }
+ \int_set:Nn \l_@@_length_int
+ { \l_@@_top_int - \l_@@_min_int }
+ \cs_set:Npn \@@_compare:nn ##1 ##2 {#4}
+ \int_set:Nn \l_@@_block_int { 1 }
+ \@@_level:
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\seq_sort:Nn, \seq_gsort:Nn}
-% The first argument to \cs{@@_main:NNNnNn} is the final
-% assignment function used, either \cs{tl_set:Nn} or
-% \cs{tl_gset:Nn} to control local versus global results.
-% The second argument is what mapping function is used when storing
-% items to \tn{toks} registers, and the third breaks away from the
-% loop. The fourth is used to build back the correct kind of list
-% from the contents of the \tn{toks} registers, including the leading
-% \cs{s__seq}. Fifth and sixth
-% arguments are the variable to sort, and the sorting method
-% as inline code.
+% \begin{macro}{\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn}
+% \begin{macro}{\@@_tl:NNn}
+% \begin{macro}[EXP]{\@@_tl_toks:w}
+% Call the main sorting function then unpack \tn{toks} registers
+% outside the group into the target token list. The unpacking is done
+% by \cs{@@_tl_toks:w}; registers are numbered from \cs{l_@@_min_int}
+% to $\cs{l_@@_top_int}-1$. For expansion behaviour we need a couple
+% of primitives. The \cs{tl_gclear:N} reduces memory usage. The
+% \cs{prg_break_point:} is used by \cs{@@_main:NNNn} when the list is
+% too long.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_sort:Nn
+\cs_new_protected:Npn \tl_sort:Nn { \@@_tl:NNn \tl_set_eq:NN }
+\cs_generate_variant:Nn \tl_sort:Nn { c }
+\cs_new_protected:Npn \tl_gsort:Nn { \@@_tl:NNn \tl_gset_eq:NN }
+\cs_generate_variant:Nn \tl_gsort:Nn { c }
+\cs_new_protected:Npn \@@_tl:NNn #1#2#3
{
- \@@_main:NNNnNn \tl_set:Nn
- \seq_map_inline:Nn \seq_map_break:n
- { \s__seq \@@_toks:NN \exp_not:N \__seq_item:n }
+ \group_begin:
+ \@@_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3}
+ \tl_gset:Nx \g_@@_internal_tl
+ { \@@_tl_toks:w \l_@@_min_int ; }
+ \group_end:
+ #1 #2 \g_@@_internal_tl
+ \tl_gclear:N \g_@@_internal_tl
+ \prg_break_point:
}
-\cs_generate_variant:Nn \seq_sort:Nn { c }
-\cs_new_protected:Npn \seq_gsort:Nn
+\cs_new:Npn \@@_tl_toks:w #1 ;
{
- \@@_main:NNNnNn \tl_gset:Nn
- \seq_map_inline:Nn \seq_map_break:n
- { \s__seq \@@_toks:NN \exp_not:N \__seq_item:n }
+ \if_int_compare:w #1 < \l_@@_top_int
+ { \tex_the:D \tex_toks:D #1 }
+ \exp_after:wN \@@_tl_toks:w
+ \int_value:w \int_eval:n { #1 + 1 } \exp_after:wN ;
+ \fi:
}
-\cs_generate_variant:Nn \seq_gsort:Nn { c }
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn}
-% Again, use \cs{tl_set:Nn} or \cs{tl_gset:Nn} to control
-% the scope of the assignment. Mapping through the token
-% list is done with \cs{tl_map_inline:Nn}, and producing
-% the token list is very similar to sequences, removing
-% \cs{__seq_item:n}.
+% \begin{macro}{\seq_sort:Nn, \seq_sort:cn, \seq_gsort:Nn, \seq_gsort:cn}
+% \begin{macro}{\clist_sort:Nn, \clist_sort:cn, \clist_gsort:Nn, \clist_gsort:cn}
+% \begin{macro}{\@@_seq:NNNNn}
+% Use the same general framework for seq and clist. Apply the general
+% sorting code, then unpack \tn{toks} into \cs{g_@@_internal_seq}.
+% Outside the group copy or convert (for clist) the data to the target
+% variable. The \cs{seq_gclear:N} reduces memory usage. The
+% \cs{prg_break_point:} is used by \cs{@@_main:NNNn} when the list is
+% too long.
% \begin{macrocode}
-\cs_new_protected:Npn \tl_sort:Nn
+\cs_new_protected:Npn \seq_sort:Nn
+ { \@@_seq:NNNNn \seq_map_inline:Nn \seq_map_break:n \seq_set_eq:NN }
+\cs_generate_variant:Nn \seq_sort:Nn { c }
+\cs_new_protected:Npn \seq_gsort:Nn
+ { \@@_seq:NNNNn \seq_map_inline:Nn \seq_map_break:n \seq_gset_eq:NN }
+\cs_generate_variant:Nn \seq_gsort:Nn { c }
+\cs_new_protected:Npn \clist_sort:Nn
{
- \@@_main:NNNnNn \tl_set:Nn
- \tl_map_inline:Nn \tl_map_break:n
- { \@@_toks:NN \prg_do_nothing: \prg_do_nothing: }
+ \@@_seq:NNNNn \clist_map_inline:Nn \clist_map_break:n
+ \clist_set_from_seq:NN
}
-\cs_generate_variant:Nn \tl_sort:Nn { c }
-\cs_new_protected:Npn \tl_gsort:Nn
+\cs_generate_variant:Nn \clist_sort:Nn { c }
+\cs_new_protected:Npn \clist_gsort:Nn
{
- \@@_main:NNNnNn \tl_gset:Nn
- \tl_map_inline:Nn \tl_map_break:n
- { \@@_toks:NN \prg_do_nothing: \prg_do_nothing: }
+ \@@_seq:NNNNn \clist_map_inline:Nn \clist_map_break:n
+ \clist_gset_from_seq:NN
}
-\cs_generate_variant:Nn \tl_gsort:Nn { c }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {\clist_sort:Nn, \clist_sort:cn, \clist_gsort:Nn, \clist_gsort:cn}
-% \begin{macro}{\@@_clist:NNn}
-% The case of empty comma-lists is a little bit special as usual,
-% and filtered out: there is nothing to sort in that case.
-% Otherwise, the input is done with \cs{clist_map_inline:Nn},
-% and the output requires some more elaborate processing than
-% for sequences and token lists. The first comma must be removed.
-% An item must be wrapped in an extra set of braces if it contains
-% either the space or the comma characters. This is taken care of
-% by \cs{clist_wrap_item:n}, but \cs{@@_toks:NN} would simply
-% feed \cs{tex_the:D} \cs{tex_toks:D} \meta{number} as an
-% argument to that function; hence we need to expand this argument
-% once to unpack the register.
-% \begin{macrocode}
-\cs_new_protected:Npn \clist_sort:Nn
- { \@@_clist:NNn \tl_set:Nn }
-\cs_new_protected:Npn \clist_gsort:Nn
- { \@@_clist:NNn \tl_gset:Nn }
-\cs_generate_variant:Nn \clist_sort:Nn { c }
\cs_generate_variant:Nn \clist_gsort:Nn { c }
-\cs_new_protected:Npn \@@_clist:NNn #1#2#3
+\cs_new_protected:Npn \@@_seq:NNNNn #1#2#3#4#5
{
- \clist_if_empty:NF #2
- {
- \@@_main:NNNnNn #1
- \clist_map_inline:Nn \clist_map_break:n
- {
- \exp_last_unbraced:Nf \use_none:n
- { \@@_toks:NN \exp_args:No \__clist_wrap_item:n }
- }
- #2 {#3}
- }
+ \group_begin:
+ \@@_main:NNNn #1 #2 #4 {#5}
+ \seq_gset_from_inline_x:Nnn \g_@@_internal_seq
+ {
+ \int_step_function:nnN
+ { \l_@@_min_int } { \l_@@_top_int - 1 }
+ }
+ { \tex_the:D \tex_toks:D ##1 }
+ \group_end:
+ #3 #4 \g_@@_internal_seq
+ \seq_gclear:N \g_@@_internal_seq
+ \prg_break_point:
}
% \end{macrocode}
% \end{macro}
% \end{macro}
-%
-% \begin{macro}{\@@_toks:NN, \@@_toks:NNw}
-% Unpack the various \tn{toks} registers, from \cs{l_@@_min_int} to
-% $\cs{l_@@_top_int}-1$. The functions |#1| and |#2| allow us to treat
-% the three data structures in a unified way:
-% \begin{itemize}
-% \item for sequences, they are \cs{exp_not:N} \cs{__seq_item:n},
-% expanding to the \cs{__seq_item:n} separator, as expected;
-% \item for token lists, they expand to nothing;
-% \item for comma lists, they expand to \cs{exp_args:No}
-% \cs{clist_wrap_item:n}, taking care of unpacking the register
-% before letting the undocumented internal \pkg{clist} function
-% \cs{clist_wrap_item:n} do the work of putting a comma and possibly
-% braces.
-% \end{itemize}
-% \begin{macrocode}
-\cs_new:Npn \@@_toks:NN #1#2
- { \@@_toks:NNw #1 #2 \l_@@_min_int ; }
-\cs_new:Npn \@@_toks:NNw #1#2#3 ;
- {
- \if_int_compare:w #3 < \l_@@_top_int
- #1 #2 { \tex_the:D \tex_toks:D #3 }
- \exp_after:wN \@@_toks:NNw \exp_after:wN #1 \exp_after:wN #2
- \__int_value:w \__int_eval:w #3 + 1 \exp_after:wN ;
- \fi:
- }
-% \end{macrocode}
% \end{macro}
%
% \subsection{Merge sort}
@@ -579,9 +566,17 @@
% once. If neither is called, \cs{@@_return_none_error:} is called.
% \begin{macrocode}
\cs_new_protected:Npn \sort_return_same: #1 \@@_return_mark:N
- { #1 \@@_return_mark:N \@@_return_two_error:w \@@_return_same: }
+ {
+ #1
+ \@@_return_mark:N
+ \@@_return_two_error:w \@@_return_same:
+ }
\cs_new_protected:Npn \sort_return_swapped: #1 \@@_return_mark:N
- { #1 \@@_return_mark:N \@@_return_two_error:w \@@_return_swapped: }
+ {
+ #1
+ \@@_return_mark:N
+ \@@_return_two_error:w \@@_return_swapped:
+ }
\cs_new_protected:Npn \@@_return_mark:N #1 { }
\cs_new_protected:Npn \@@_return_none_error:
{
@@ -827,11 +822,11 @@
% each item. The \texttt{prepare} auxiliary receives the conditional
% as~|#1|, the prepared token list so far as~|#2|, the next prepared
% item as~|#3|, and the item after that as~|#4|. The loop ends
-% when~|#4| contains \cs{__prg_break_point:}, then the
+% when~|#4| contains \cs{prg_break_point:}, then the
% \texttt{prepare_end} auxiliary finds the prepared token list
% as~|#4|. The scene is then set up for \cs{@@_quick_split:NnNn},
% which sorts the prepared list and perform the post action placed
-% after \cs{q_mark}, namely removing the trailing \cs{s__stop} and
+% after \cs{q_mark}, namely removing the trailing \cs{s_stop} and
% \cs{q_stop} and leaving \cs{exp_stop_f:} to stop
% \texttt{f}-expansion.
% \begin{macrocode}
@@ -843,7 +838,7 @@
{
\@@_quick_prepare:Nnnn #2 { } { }
#1
- { \__prg_break_point: \@@_quick_prepare_end:NNNnw }
+ { \prg_break_point: \@@_quick_prepare_end:NNNnw }
\q_stop
}
}
@@ -850,7 +845,7 @@
}
\cs_new:Npn \@@_quick_prepare:Nnnn #1#2#3#4
{
- \__prg_break: #4 \__prg_break_point:
+ \prg_break: #4 \prg_break_point:
\@@_quick_prepare:Nnnn #1 { #2 #3 } { #1 {#4} }
}
\cs_new:Npn \@@_quick_prepare_end:NNNnw #1#2#3#4#5 \q_stop
@@ -857,9 +852,9 @@
{
\@@_quick_split:NnNn #4 \@@_quick_end:nnTFNn { }
\q_mark { \@@_quick_cleanup:w \exp_stop_f: }
- \s__stop \q_stop
+ \s_stop \q_stop
}
-\cs_new:Npn \@@_quick_cleanup:w #1 \s__stop \q_stop {#1}
+\cs_new:Npn \@@_quick_cleanup:w #1 \s_stop \q_stop {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -895,31 +890,36 @@
% \begin{macrocode}
\cs_new:Npn \@@_quick_split:NnNn #1#2#3#4
{
- #3 {#2} {#4} \@@_quick_only_ii:NnnnnNn \@@_quick_only_i:NnnnnNn
+ #3 {#2} {#4} \@@_quick_only_ii:NnnnnNn
+ \@@_quick_only_i:NnnnnNn
\@@_quick_single_end:nnnwnw
{ #3 {#4} } { } { } {#2}
}
\cs_new:Npn \@@_quick_only_i:NnnnnNn #1#2#3#4#5#6#7
{
- #6 {#5} {#7} \@@_quick_split_ii:NnnnnNn \@@_quick_only_i:NnnnnNn
+ #6 {#5} {#7} \@@_quick_split_ii:NnnnnNn
+ \@@_quick_only_i:NnnnnNn
\@@_quick_only_i_end:nnnwnw
{ #6 {#7} } { #3 #2 } { } {#5}
}
\cs_new:Npn \@@_quick_only_ii:NnnnnNn #1#2#3#4#5#6#7
{
- #6 {#5} {#7} \@@_quick_only_ii:NnnnnNn \@@_quick_split_i:NnnnnNn
+ #6 {#5} {#7} \@@_quick_only_ii:NnnnnNn
+ \@@_quick_split_i:NnnnnNn
\@@_quick_only_ii_end:nnnwnw
{ #6 {#7} } { } { #4 #2 } {#5}
}
\cs_new:Npn \@@_quick_split_i:NnnnnNn #1#2#3#4#5#6#7
{
- #6 {#5} {#7} \@@_quick_split_ii:NnnnnNn \@@_quick_split_i:NnnnnNn
+ #6 {#5} {#7} \@@_quick_split_ii:NnnnnNn
+ \@@_quick_split_i:NnnnnNn
\@@_quick_split_end:nnnwnw
{ #6 {#7} } { #3 #2 } {#4} {#5}
}
\cs_new:Npn \@@_quick_split_ii:NnnnnNn #1#2#3#4#5#6#7
{
- #6 {#5} {#7} \@@_quick_split_ii:NnnnnNn \@@_quick_split_i:NnnnnNn
+ #6 {#5} {#7} \@@_quick_split_ii:NnnnnNn
+ \@@_quick_split_i:NnnnnNn
\@@_quick_split_end:nnnwnw
{ #6 {#7} } {#3} { #4 #2 } {#5}
}
@@ -989,14 +989,14 @@
% \begin{macro}{\@@_error:}
% Bailing out of the sorting code is a bit tricky. It may not be safe
% to use a delimited argument, so instead we redefine many
-% \pkg{l3sort} commands to be trivial, with \cs{@@_level:} getting rid
-% of the final assignment. This error recovery won't work in a group.
+% \pkg{l3sort} commands to be trivial, with \cs{@@_level:} jumping to
+% the break point. This error recovery won't work in a group.
% \begin{macrocode}
\cs_new_protected:Npn \@@_error:
{
\cs_set_eq:NN \@@_merge_blocks_aux: \prg_do_nothing:
\cs_set_eq:NN \@@_merge_blocks: \prg_do_nothing:
- \cs_set_protected:Npn \@@_level: \use:x ##1 { \group_end: }
+ \cs_set_protected:Npn \@@_level: { \group_end: \prg_break: }
}
% \end{macrocode}
% \end{macro}
@@ -1022,7 +1022,8 @@
{ Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. }
{
The~comparison~code~used~for~sorting~a~list~has~attempted~to~
- define~#1~as~a~new~\iow_char:N\\toks~register~using~\iow_char:N\\newtoks~
+ define~#1~as~a~new~\iow_char:N\\toks~register~using~
+ \iow_char:N\\newtoks~
or~a~similar~command.~The~list~will~not~be~sorted.
}
%</package>
@@ -1048,7 +1049,7 @@
{
TeX~has~#2~toks~registers~still~available:~
this~only~allows~to~sort~with~up~to~#3~
- items.~All~extra~items~will~be~deleted.
+ items.~The~list~will~not~be~sorted.
}
% \end{macrocode}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -29,7 +29,7 @@
% \fi
%
% \title{^^A
-% The \pkg{l3str} package\\Strings^^A
+% The \pkg{l3str} package: Strings^^A
% }
%
% \author{^^A
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -203,7 +203,7 @@
% var} are not automatically converted to a string.
% \end{function}
%
-% \subsection{Modifying string variables}
+% \section{Modifying string variables}
%
% \begin{function}[added = 2017-10-08]
% {
@@ -269,7 +269,7 @@
% results in \cs{l_tmpa_str} containing \texttt{abcd}.
% \end{function}
%
-% \subsection{String conditionals}
+% \section{String conditionals}
%
% \begin{function}[EXP, pTF, added = 2015-09-18]
% {\str_if_exist:N, \str_if_exist:c}
@@ -799,70 +799,6 @@
% code and so should only be used for short-term storage.
% \end{variable}
%
-% \subsection{Internal string functions}
-%
-% \begin{function}[EXP]{\__str_if_eq_x:nn}
-% \begin{syntax}
-% \cs{__str_if_eq_x:nn} \Arg{tl_1} \Arg{tl_2}
-% \end{syntax}
-% Compares the full expansion of two \meta{token lists} on a character by
-% character basis, and is \texttt{true} if the two lists contain the same
-% characters in the same order. Leaves |0| in the input stream if the
-% condition is true, and |+1| or |-1| otherwise.
-% \end{function}
-%
-% \begin{function}{\__str_if_eq_x_return:nn}
-% \begin{syntax}
-% \cs{__str_if_eq_x_return:nn} \Arg{tl_1} \Arg{tl_2}
-% \end{syntax}
-% Compares the full expansion of two \meta{token lists} on a character by
-% character basis, and is \texttt{true} if the two lists contain the same
-% characters in the same order. Either \cs{prg_return_true:} or
-% \cs{prg_return_false:} is then left in the input stream. This is a version
-% of \cs{str_if_eq_x:nnTF} coded for speed.
-% \end{function}
-%
-% \begin{function}[EXP]{\__str_to_other:n}
-% \begin{syntax}
-% \cs{__str_to_other:n} \Arg{token list}
-% \end{syntax}
-% Converts the \meta{token list} to a \meta{other string}, where
-% spaces have category code \enquote{other}. This function can be
-% \texttt{f}-expanded without fear of losing a leading space, since
-% spaces do not have category code $10$ in its result. It takes a
-% time quadratic in the character count of the string.
-% \end{function}
-%
-% \begin{function}[rEXP]{\__str_to_other_fast:n}
-% \begin{syntax}
-% \cs{__str_to_other_fast:n} \Arg{token list}
-% \end{syntax}
-% Same behaviour \cs{__str_to_other:n} but only restricted-expandable.
-% It takes a time linear in the character count of the string.
-% It is used for \cs{iow_wrap:nnnN}.
-% \end{function}
-%
-% \begin{function}[EXP]{\__str_count:n}
-% \begin{syntax}
-% \cs{__str_count:n} \Arg{other string}
-% \end{syntax}
-% This function expects an argument that is entirely made of
-% characters with category \enquote{other}, as produced by
-% \cs{__str_to_other:n}. It leaves in the input stream the number of
-% character tokens in the \meta{other string}, faster than the
-% analogous \cs{str_count:n} function.
-% \end{function}
-%
-% \begin{function}[EXP]{\__str_range:nnn}
-% \begin{syntax}
-% \cs{__str_range:nnn} \Arg{other string} \Arg{start index} \Arg{end index}
-% \end{syntax}
-% Identical to \cs{str_range:nnn} except that the first argument is
-% expected to be entirely made of characters with category
-% \enquote{other}, as produced by \cs{__str_to_other:n}, and the
-% result is also an \meta{other string}.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -955,8 +891,11 @@
\tl_if_blank:nF {#1}
{
\cs_new_protected:cpx { str_ #1 :Nn } ##1##2
- { \exp_not:c { tl_ #1 :Nx } ##1 { \exp_not:N \tl_to_str:n {##2} } }
- \exp_args:Nc \cs_generate_variant:Nn { str_ #1 :Nn } { Nx , cn , cx }
+ {
+ \exp_not:c { tl_ #1 :Nx } ##1
+ { \exp_not:N \tl_to_str:n {##2} }
+ }
+ \cs_generate_variant:cn { str_ #1 :Nn } { Nx , cn , cx }
\@@_tmp:n
}
}
@@ -1079,10 +1018,14 @@
% }
% More copy-paste!
% \begin{macrocode}
-\prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N { p , T , F , TF }
-\prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c { p , T , F , TF }
-\prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N { p , T , F , TF }
-\prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c
+ { p , T , F , TF }
% \end{macrocode}
% \end{macro}
%
@@ -1093,9 +1036,8 @@
% is that we do not \emph{always} use the primitive, the correct approach
% is to wrap up in a function with defined behaviour. That's done by
% providing a wrapper and then redefining in the \LuaTeX{} case. Note that
-% the necessary Lua code is covered in \pkg{l3boostrap}: long-term this may
-% need to go into a separate Lua file, but at present it's somewhere that
-% spaces are not skipped for ease-of-input. The need to detokenize and force
+% the necessary Lua code is loaded in \pkg{l3boostrap}.
+% The need to detokenize and force
% expansion of input arises from the case where a |#| token is used in the
% input, \emph{e.g.}~|\__str_if_eq_x:nn {#} { \tl_to_str:n {#} }|, which
% otherwise would fail as \cs{luatex_luaescapestring:D} does not double
@@ -1104,9 +1046,11 @@
\cs_new:Npn \@@_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
\cs_if_exist:NT \luatex_luatexversion:D
{
+ \cs_set_eq:NN \lua_escape_x:n \luatex_luaescapestring:D
+ \cs_set_eq:NN \lua_now_x:n \luatex_directlua:D
\cs_set:Npn \@@_if_eq_x:nn #1#2
{
- \luatex_directlua:D
+ \lua_now_x:n
{
l3kernel.strcmp
(
@@ -1117,10 +1061,8 @@
}
\cs_new:Npn \@@_escape_x:n #1
{
- \luatex_luaescapestring:D
- {
- \etex_detokenize:D \exp_after:wN { \luatex_expanded:D {#1} }
- }
+ \lua_escape_x:n
+ { \__kernel_tl_to_str:w \use_x:n { {#1} } }
}
}
% \end{macrocode}
@@ -1127,24 +1069,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_if_eq_x_return:nn}
-% It turns out that we often need to compare a token list
-% with the result of applying some function to it, and
-% return with \cs{prg_return_true/false:}. This test is
-% similar to \cs{str_if_eq:nnTF} (see \pkg{l3str}),
-% but is hard-coded for speed.
-% \begin{macrocode}
-\cs_new:Npn \@@_if_eq_x_return:nn #1 #2
- {
- \if_int_compare:w \@@_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f:
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}[pTF, EXP]
% {
% \str_if_eq:nn, \str_if_eq:Vn, \str_if_eq:on, \str_if_eq:nV,
@@ -1180,7 +1104,8 @@
% \begin{macrocode}
\prg_new_conditional:Npnn \str_if_eq:NN #1#2 { p , TF , T , F }
{
- \if_int_compare:w \@@_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
+ \if_int_compare:w
+ \@@_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
= 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi:
}
\prg_generate_conditional_variant:Nnn \str_if_eq:NN
@@ -1278,7 +1203,8 @@
{ \@@_case_end:nw {#3} }
{ \@@_case_x:nw {#1} }
}
-\cs_new_eq:NN \@@_case_end:nw \__prg_case_end:nw
+\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+ { \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1299,7 +1225,7 @@
% The inline and variable mappings are similar to the usual token list
% mappings but start out by turning the argument to an ``other
% string''. Doing the same for the expandable function mapping would
-% require \cs{@@_to_other:n}, quadratic in the string length. To deal
+% require \cs{__kernel_str_to_other:n}, quadratic in the string length. To deal
% with spaces in that case, \cs{@@_map_function:w} replaces the
% following space by a braced space and a further call to itself.
% These are received by \cs{@@_map_function:Nn}, which passes
@@ -1317,9 +1243,9 @@
{
\exp_after:wN \@@_map_function:w
\exp_after:wN \@@_map_function:Nn \exp_after:wN #2
- \etex_detokenize:D {#1}
+ \__kernel_tl_to_str:w {#1}
\q_recursion_tail ? ~
- \__prg_break_point:Nn \str_map_break: { }
+ \prg_break_point:Nn \str_map_break: { }
}
\cs_new:Npn \str_map_function:NN
{ \exp_args:No \str_map_function:nN }
@@ -1335,17 +1261,18 @@
\cs_generate_variant:Nn \str_map_function:NN { c }
\cs_new_protected:Npn \str_map_inline:nn #1#2
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:cpn
- { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\use:x
{
\exp_not:N \@@_map_inline:NN
- \exp_not:c { __prg_map_ \int_use:N \g__prg_map_int :w }
- \@@_to_other_fast:n {#1}
+ \exp_not:c { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
+ \__kernel_str_to_other_fast:n {#1}
}
\q_recursion_tail
- \__prg_break_point:Nn \str_map_break: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \str_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
\cs_new_protected:Npn \str_map_inline:Nn
{ \exp_args:No \str_map_inline:nn }
@@ -1352,7 +1279,7 @@
\cs_generate_variant:Nn \str_map_inline:Nn { c }
\cs_new:Npn \@@_map_inline:NN #1#2
{
- \__quark_if_recursion_tail_break:NN #2 \str_map_break:
+ \quark_if_recursion_tail_break:NN #2 \str_map_break:
\exp_args:No #1 { \token_to_str:N #2 }
\@@_map_inline:NN #1
}
@@ -1361,16 +1288,16 @@
\use:x
{
\exp_not:n { \@@_map_variable:NnN #2 {#3} }
- \@@_to_other_fast:n {#1}
+ \__kernel_str_to_other_fast:n {#1}
}
\q_recursion_tail
- \__prg_break_point:Nn \str_map_break: { }
+ \prg_break_point:Nn \str_map_break: { }
}
\cs_new_protected:Npn \str_map_variable:NNn
{ \exp_args:No \str_map_variable:nNn }
\cs_new_protected:Npn \@@_map_variable:NnN #1#2#3
{
- \__quark_if_recursion_tail_break:NN #3 \str_map_break:
+ \quark_if_recursion_tail_break:NN #3 \str_map_break:
\str_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:NnN #1 {#2}
@@ -1377,9 +1304,9 @@
}
\cs_generate_variant:Nn \str_map_variable:NNn { c }
\cs_new:Npn \str_map_break:
- { \__prg_map_break:Nn \str_map_break: { } }
+ { \prg_map_break:Nn \str_map_break: { } }
\cs_new:Npn \str_map_break:n
- { \__prg_map_break:Nn \str_map_break: }
+ { \prg_map_break:Nn \str_map_break: }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1394,7 +1321,7 @@
%
% \subsection{Accessing specific characters in a string}
%
-% \begin{macro}[EXP]{\@@_to_other:n}
+% \begin{macro}[EXP]{\__kernel_str_to_other:n}
% \begin{macro}[EXP]{\@@_to_other_loop:w, \@@_to_other_end:w}
% First apply \cs{tl_to_str:n}, then replace all spaces by
% \enquote{other} spaces, $8$ at a time, storing the converted part of
@@ -1405,7 +1332,7 @@
% the result between \cs{q_mark} and the first |A| (well, there is
% also the need to remove a space).
% \begin{macrocode}
-\cs_new:Npn \@@_to_other:n #1
+\cs_new:Npn \__kernel_str_to_other:n #1
{
\exp_after:wN \@@_to_other_loop:w
\tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_mark \q_stop
@@ -1432,13 +1359,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[rEXP]{\@@_to_other_fast:n}
-% \begin{macro}[rEXP]{\@@_to_other_fast_loop:w, \@@_to_other_fast_end:w}
-% The difference with \cs{@@_to_other:n} is that the converted part is
+% \begin{macro}[rEXP]{\__kernel_str_to_other_fast:n}
+% \begin{macro}[rEXP]{\__kernel_str_to_other_fast_loop:w, \@@_to_other_fast_end:w}
+% The difference with \cs{__kernel_str_to_other:n} is that the converted part is
% left in the input stream, making these commands only
% restricted-expandable.
% \begin{macrocode}
-\cs_new:Npn \@@_to_other_fast:n #1
+\cs_new:Npn \__kernel_str_to_other_fast:n #1
{
\exp_after:wN \@@_to_other_fast_loop:w \tl_to_str:n {#1} ~
A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop
@@ -1491,17 +1418,16 @@
\exp_args:Nf \tl_to_str:n
{
\exp_args:Nf \@@_item:nn
- { \@@_to_other:n {#1} } {#2}
+ { \__kernel_str_to_other:n {#1} } {#2}
}
}
\cs_new:Npn \str_item_ignore_spaces:nn #1
{ \exp_args:No \@@_item:nn { \tl_to_str:n {#1} } }
-\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } }
\cs_new:Npn \@@_item:nn #1#2
{
\exp_after:wN \@@_item:w
- \__int_value:w \__int_eval:w #2 \exp_after:wN ;
- \__int_value:w \@@_count:n {#1} ;
+ \int_value:w \int_eval:n {#2} \exp_after:wN ;
+ \int_value:w \@@_count:n {#1} ;
#1 \q_stop
}
\cs_new:Npn \@@_item:w #1; #2;
@@ -1513,7 +1439,7 @@
{
\exp_after:wN \use_i_delimit_by_q_stop:nw
\exp:w \exp_after:wN \@@_skip_exp_end:w
- \__int_value:w \__int_eval:w #1 + #2 ;
+ \int_value:w \int_eval:n { #1 + #2 } ;
}
}
{
@@ -1552,12 +1478,15 @@
\exp_after:wN \@@_skip_loop:wNNNNNNNN
\else:
\exp_after:wN \@@_skip_end:w
- \__int_value:w \__int_eval:w
+ \int_value:w \int_eval:w
\fi:
#1 ;
}
\cs_new:Npn \@@_skip_loop:wNNNNNNNN #1; #2#3#4#5#6#7#8#9
- { \exp_after:wN \@@_skip_exp_end:w \__int_value:w \__int_eval:w #1 - 8 ; }
+ {
+ \exp_after:wN \@@_skip_exp_end:w
+ \int_value:w \int_eval:n { #1 - 8 } ;
+ }
\cs_new:Npn \@@_skip_end:w #1 ;
{
\exp_after:wN \@@_skip_end:NNNNNNNN
@@ -1588,19 +1517,17 @@
\exp_args:Nf \tl_to_str:n
{
\exp_args:Nf \@@_range:nnn
- { \@@_to_other:n {#1} } {#2} {#3}
+ { \__kernel_str_to_other:n {#1} } {#2} {#3}
}
}
\cs_new:Npn \str_range_ignore_spaces:nnn #1
{ \exp_args:No \@@_range:nnn { \tl_to_str:n {#1} } }
-\__kernel_patch_args:nNNpn
- { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } }
\cs_new:Npn \@@_range:nnn #1#2#3
{
\exp_after:wN \@@_range:w
- \__int_value:w \@@_count:n {#1} \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 - 1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #3 ;
+ \int_value:w \@@_count:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN ;
+ \int_value:w \int_eval:n {#3} ;
#1 \q_stop
}
\cs_new:Npn \@@_range:w #1; #2; #3;
@@ -1612,7 +1539,7 @@
\cs_new:Npn \@@_range:nnw #1#2
{
\exp_after:wN \@@_collect_delimit_by_q_stop:w
- \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
+ \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
\exp:w \@@_skip_exp_end:w #1 ;
}
% \end{macrocode}
@@ -1678,14 +1605,15 @@
\cs_new:Npn \@@_collect_loop:wnNNNNNNN #1; #2 #3#4#5#6#7#8#9
{
\exp_after:wN \@@_collect_loop:wn
- \__int_value:w \__int_eval:w #1 - 7 ;
+ \int_value:w \int_eval:n { #1 - 7 } ;
{ #2 #3#4#5#6#7#8#9 }
}
\cs_new:Npn \@@_collect_end:wn #1 ;
{
\exp_after:wN \@@_collect_end:nnnnnnnnw
- \if_case:w \if_int_compare:w #1 > 0 \exp_stop_f: #1 \else: 0 \fi: \exp_stop_f:
- \or: \or: \or: \or: \or: \or: \fi:
+ \if_case:w \if_int_compare:w #1 > 0 \exp_stop_f:
+ #1 \else: 0 \fi: \exp_stop_f:
+ \or: \or: \or: \or: \or: \or: \fi:
}
\cs_new:Npn \@@_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop
{ #1#2#3#4#5#6#7#8 }
@@ -1733,7 +1661,7 @@
% \begin{macro}[EXP]{\@@_count:n}
% \begin{macro}[EXP]{\@@_count_aux:n, \@@_count_loop:NNNNNNNNN}
% To count characters in a string we could first escape all spaces
-% using \cs{@@_to_other:n}, then pass the result to \cs{tl_count:n}.
+% using \cs{__kernel_str_to_other:n}, then pass the result to \cs{tl_count:n}.
% However, the escaping step would be quadratic in the number of
% characters in the string, and we can do better. Namely, sum the
% number of spaces (\cs{str_count_spaces:n}) and the result of
@@ -1881,8 +1809,6 @@
% \begin{macro}[EXP]{\@@_change_case_loop:nw}
% \begin{macro}[EXP]{\@@_change_case_space:n}
% \begin{macro}[EXP]{\@@_change_case_char:nN}
-% \begin{macro}
-% {\@@_lookup_lower:N, \@@_lookup_upper:N, \@@_lookup_fold:N}
% Case changing for programmatic reasons is done by first detokenizing
% input then doing a simple loop that only has to worry about spaces
% and everything else. The output is detokenized to allow data sharing
@@ -1907,7 +1833,8 @@
\cs_new:Npn \@@_change_case_output:nw #1#2 \@@_change_case_result:n #3
{ #2 \@@_change_case_result:n { #3 #1 } }
\cs_generate_variant:Nn \@@_change_case_output:nw { f }
-\cs_new:Npn \@@_change_case_end:wn #1 \@@_change_case_result:n #2 { #2 }
+\cs_new:Npn \@@_change_case_end:wn #1 \@@_change_case_result:n #2
+ { \tl_to_str:n {#2} }
\cs_new:Npn \@@_change_case_loop:nw #1#2 \q_recursion_stop
{
\tl_if_head_is_space:nTF {#2}
@@ -1915,8 +1842,8 @@
{ \@@_change_case_char:nN }
{#1} #2 \q_recursion_stop
}
-\use:x
- { \cs_new:Npn \exp_not:N \@@_change_case_space:n ##1 \c_space_tl }
+\exp_last_unbraced:NNNNo
+ \cs_new:Npn \@@_change_case_space:n #1 \c_space_tl
{
\@@_change_case_output:nw { ~ }
\@@_change_case_loop:nw {#1}
@@ -1925,40 +1852,11 @@
{
\quark_if_recursion_tail_stop_do:Nn #2
{ \@@_change_case_end:wn }
- \cs_if_exist:cTF { c__unicode_ #1 _ #2 _tl }
- {
- \@@_change_case_output:fw
- { \tl_to_str:c { c__unicode_ #1 _ #2 _tl } }
- }
- { \@@_change_case_char_aux:nN {#1} #2 }
+ \@@_change_case_output:fw
+ { \use:c { char_ #1 _case:N } #2 }
\@@_change_case_loop:nw {#1}
}
% \end{macrocode}
-% For Unicode engines there's a look up to see if the current character
-% has a valid one-to-one case change mapping. That's not needed for $8$-bit
-% engines: as they don't have \cs{utex_char:D} all of the changes they can
-% make are hard-coded and so already picked up above.
-% \begin{macrocode}
-\cs_if_exist:NTF \utex_char:D
- {
- \cs_new:Npn \@@_change_case_char_aux:nN #1#2
- {
- \int_compare:nNnTF { \use:c { __str_lookup_ #1 :N } #2 } = { 0 }
- { \@@_change_case_output:nw {#2} }
- {
- \@@_change_case_output:fw
- { \utex_char:D \use:c { __str_lookup_ #1 :N } #2 ~ }
- }
- }
- \cs_new_protected:Npn \@@_lookup_lower:N #1 { \tex_lccode:D `#1 }
- \cs_new_protected:Npn \@@_lookup_upper:N #1 { \tex_uccode:D `#1 }
- \cs_new_eq:NN \@@_lookup_fold:N \@@_lookup_lower:N
- }
- {
- \cs_new:Npn \@@_change_case_char_aux:nN #1#2
- { \@@_change_case_output:nw {#2} }
- }
-% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
@@ -1968,7 +1866,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{variable}
% {
@@ -2024,214 +1921,7 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Unicode data for case changing}
-%
% \begin{macrocode}
-%<@@=unicode>
-% \end{macrocode}
-%
-% Case changing both for strings and \enquote{text} requires data from
-% the Unicode Consortium. Some of this is build in to the format (as
-% \tn{lccode} and \tn{uccode} values) but this covers only the simple
-% one-to-one situations and does not fully handle for example case folding.
-%
-% The data required for cross-module manipulations is loaded here: currently
-% this means for |str| and |tl| functions. As such, the prefix used is not
-% |str| but rather |unicode|. For performance (as the entire data set must
-% be read during each run) and as this code comes somewhat early in the
-% load process, there is quite a bit of low-level code here.
-%
-% As only the data needs to remain at the end of this process, everything
-% is set up inside a group.
-% \begin{macrocode}
-\group_begin:
-% \end{macrocode}
-% A read stream is needed. The I/O module is not yet in place \emph{and}
-% we do not want to use up a stream. We therefore use a known free one in
-% format mode or look for the next free one in package mode (covers plain,
-% \LaTeXe{} and Con\TeX{}t MkII and MkIV).
-% \begin{macrocode}
-%<*initex>
- \tex_chardef:D \g_@@_data_ior = 0 \scan_stop:
-%</initex>
-%<*package>
- \tex_chardef:D \g_@@_data_ior
- \etex_numexpr:D
- \cs_if_exist:NTF \lastallocatedread
- { \lastallocatedread }
- {
- \cs_if_exist:NTF \c_syst_last_allocated_read
- { \c_syst_last_allocated_read }
- { \tex_count:D 16 ~ }
- }
- + 1
- \scan_stop:
-%</package>
-% \end{macrocode}
-% Set up to read each file. As they use C-style comments, there is a need to
-% deal with |#|. At the same time, spaces are important so they need to be
-% picked up as they are important. Beyond that, the current category code
-% scheme works fine. With no I/O loop available, hard-code one that works
-% quickly.
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_map_inline:n #1
- {
- \group_begin:
- \tex_catcode:D `\# = 12 \scan_stop:
- \tex_catcode:D `\ = 10 \scan_stop:
- \tex_openin:D \g_@@_data_ior = #1 \scan_stop:
- \cs_if_exist:NT \utex_char:D
- { \@@_map_loop: }
- \tex_closein:D \g_@@_data_ior
- \group_end:
- }
- \cs_set_protected:Npn \@@_map_loop:
- {
- \tex_ifeof:D \g_@@_data_ior
- \exp_after:wN \use_none:n
- \else:
- \exp_after:wN \use:n
- \fi:
- {
- \tex_read:D \g_@@_data_ior to \l_@@_tmp_tl
- \if_meaning:w \c_empty_tl \l_@@_tmp_tl
- \else:
- \exp_after:wN \@@_parse:w \l_@@_tmp_tl \q_stop
- \fi:
- \@@_map_loop:
- }
- }
-% \end{macrocode}
-% The lead-off parser for each line is common for all of the files. If
-% the line starts with a |#| it's a comment. There's one special comment
-% line to look out for in \texttt{SpecialCasing.txt} as we want to ignore
-% everything after it. As this line does not appear in any other sources
-% and the test is quite quick (there are relatively few comment lines), it
-% can be present in all of the passes.
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_parse:w #1#2 \q_stop
- {
- \reverse_if:N \if:w \c_hash_str #1
- \@@_parse_auxi:w #1#2 \q_stop
- \else:
- \if_int_compare:w \__str_if_eq_x:nn
- { \exp_not:n {#2} } { ~Conditional~Mappings~ } = 0 \exp_stop_f:
- \cs_set_protected:Npn \@@_parse:w ##1 \q_stop { }
- \fi:
- \fi:
- }
-% \end{macrocode}
-% Storing each exception is always done in the same way: create a constant
-% token list which expands to exactly the mapping. These have the
-% category codes \enquote{now} (so should be letters) but are later detokenized
-% for string use.
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_store:nnnnn #1#2#3#4#5
- {
- \tl_const:cx { c_@@_ #2 _ \utex_char:D "#1 _tl }
- {
- \utex_char:D "#3 ~
- \utex_char:D "#4 ~
- \tl_if_blank:nF {#5}
- { \utex_char:D "#5 }
- }
- }
-% \end{macrocode}
-% Parse the main Unicode data file for title case exceptions (the one-to-one
-% lower and upper case mappings it contains are all be covered by the \TeX{}
-% data).
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_parse_auxi:w
- #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ;
- { \@@_parse_auxii:w #1 ; }
- \cs_set_protected:Npn \@@_parse_auxii:w
- #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop
- {
- \tl_if_blank:nF {#7}
- {
- \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f:
- \else:
- \tl_const:cx
- { c_@@_mixed_ \utex_char:D "#1 _tl }
- { \utex_char:D "#7 }
- \fi:
- }
- }
- \@@_map_inline:n { UnicodeData.txt }
-% \end{macrocode}
-% The set up for case folding is in two parts. For the basic (core) mappings,
-% folding is the same as lower casing in most positions so only store
-% the differences. For the more complex foldings, always store the result,
-% splitting up the two or three code points in the input as required.
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_parse_auxi:w #1 ;~ #2 ;~ #3 ; #4 \q_stop
- {
- \if_int_compare:w \__str_if_eq_x:nn {#2} { C } = 0 \exp_stop_f:
- \if_int_compare:w \tex_lccode:D "#1 = "#3 \scan_stop:
- \else:
- \tl_const:cx
- { c_@@_fold_ \utex_char:D "#1 _tl }
- { \utex_char:D "#3 ~ }
- \fi:
- \else:
- \if_int_compare:w \__str_if_eq_x:nn {#2} { F } = 0 \exp_stop_f:
- \@@_parse_auxii:w #1 ~ #3 ~ \q_stop
- \fi:
- \fi:
- }
- \cs_set_protected:Npn \@@_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
- { \@@_store:nnnnn {#1} { fold } {#2} {#3} {#4} }
- \@@_map_inline:n { CaseFolding.txt }
-% \end{macrocode}
-% For upper and lower casing special situations, there is a bit more to
-% do as we also have title casing to consider.
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_parse_auxi:w #1 ;~ #2 ;~ #3 ;~ #4 ; #5 \q_stop
- {
- \use:n { \@@_parse_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop
- \use:n { \@@_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
- \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f:
- \else:
- \use:n { \@@_parse_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop
- \fi:
- }
- \cs_set_protected:Npn \@@_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
- {
- \tl_if_empty:nF {#4}
- { \@@_store:nnnnn {#1} {#2} {#3} {#4} {#5} }
- }
- \@@_map_inline:n { SpecialCasing.txt }
-% \end{macrocode}
-% For the $8$-bit engines, the above does nothing but there is some set
-% up needed. There is no expandable character generator primitive so some
-% alternative is needed. As we've not used up hash space for the above, we
-% can go for the fast approach here of one name per letter. Keeping folding
-% and lower casing separate makes the use later a bit easier.
-% \begin{macrocode}
- \cs_if_exist:NF \utex_char:D
- {
- \cs_set_protected:Npn \@@_tmp:NN #1#2
- {
- \if_meaning:w \q_recursion_tail #2
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
- \fi:
- \tl_const:cn { c_@@_fold_ #1 _tl } {#2}
- \tl_const:cn { c_@@_lower_ #1 _tl } {#2}
- \tl_const:cn { c_@@_upper_ #2 _tl } {#1}
- \@@_tmp:NN
- }
- \@@_tmp:NN
- AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
- ? \q_recursion_tail \q_recursion_stop
- }
-% \end{macrocode}
-%
-% All done: tidy up.
-% \begin{macrocode}
-\group_end:
-% \end{macrocode}
-%
-% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project
+%% File: l3sys.dtx Copyright (C) 2015-2018 The 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
@@ -29,7 +29,7 @@
% \fi
%
% \title{^^A
-% The \pkg{l3sys} package\\System/runtime functions^^A
+% The \pkg{l3sys} package: System/runtime functions^^A
% }
%
% \author{^^A
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -134,6 +134,10 @@
%<*initex|package>
% \end{macrocode}
%
+% \begin{macrocode}
+%<@@=sys>
+% \end{macrocode}
+%
% \subsection{The name of the job}
%
% \begin{variable}{\c_sys_jobname_str}
@@ -178,6 +182,29 @@
%
% \subsection{Detecting the engine}
%
+% \begin{macro}{\@@_const:nn}
+% Set the |T|, |F|, |TF|, |p| forms of |#1| to be constants equal to
+% the result of evaluating the boolean expression~|#2|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_const:nn #1#2
+ {
+ \bool_if:nTF {#2}
+ {
+ \cs_new_eq:cN { #1 :T } \use:n
+ \cs_new_eq:cN { #1 :F } \use_none:n
+ \cs_new_eq:cN { #1 :TF } \use_i:nn
+ \cs_new_eq:cN { #1 _p: } \c_true_bool
+ }
+ {
+ \cs_new_eq:cN { #1 :T } \use_none:n
+ \cs_new_eq:cN { #1 :F } \use:n
+ \cs_new_eq:cN { #1 :TF } \use_ii:nn
+ \cs_new_eq:cN { #1 _p: } \c_false_bool
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[pTF, EXP]
% {
% \sys_if_engine_luatex:,
@@ -193,56 +220,24 @@
% or |-kanji-internal=euc| effective makes it more like \pTeX{}. In those
% cases we therefore report \pTeX{} rather than \upTeX{}.
% \begin{macrocode}
-\clist_map_inline:nn { lua , pdf , p , up , xe }
+\str_const:Nx \c_sys_engine_str
{
- \cs_new_eq:cN { sys_if_engine_ #1 tex:T } \use_none:n
- \cs_new_eq:cN { sys_if_engine_ #1 tex:F } \use:n
- \cs_new_eq:cN { sys_if_engine_ #1 tex:TF } \use_ii:nn
- \cs_new_eq:cN { sys_if_engine_ #1 tex_p: } \c_false_bool
- }
-\cs_if_exist:NT \luatex_luatexversion:D
- {
- \cs_gset_eq:NN \sys_if_engine_luatex:T \use:n
- \cs_gset_eq:NN \sys_if_engine_luatex:F \use_none:n
- \cs_gset_eq:NN \sys_if_engine_luatex:TF \use_i:nn
- \cs_gset_eq:NN \sys_if_engine_luatex_p: \c_true_bool
- \str_const:Nn \c_sys_engine_str { luatex }
- }
-\cs_if_exist:NT \pdftex_pdftexversion:D
- {
- \cs_gset_eq:NN \sys_if_engine_pdftex:T \use:n
- \cs_gset_eq:NN \sys_if_engine_pdftex:F \use_none:n
- \cs_gset_eq:NN \sys_if_engine_pdftex:TF \use_i:nn
- \cs_gset_eq:NN \sys_if_engine_pdftex_p: \c_true_bool
- \str_const:Nn \c_sys_engine_str { pdftex }
- }
-\cs_if_exist:NT \ptex_kanjiskip:D
- {
- \bool_lazy_and:nnTF
- { \cs_if_exist_p:N \uptex_disablecjktoken:D }
- { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
+ \cs_if_exist:NT \luatex_luatexversion:D { luatex }
+ \cs_if_exist:NT \pdftex_pdftexversion:D { pdftex }
+ \cs_if_exist:NT \ptex_kanjiskip:D
{
- \cs_gset_eq:NN \sys_if_engine_uptex:T \use:n
- \cs_gset_eq:NN \sys_if_engine_uptex:F \use_none:n
- \cs_gset_eq:NN \sys_if_engine_uptex:TF \use_i:nn
- \cs_gset_eq:NN \sys_if_engine_uptex_p: \c_true_bool
- \str_const:Nn \c_sys_engine_str { uptex }
+ \bool_lazy_and:nnTF
+ { \cs_if_exist_p:N \uptex_disablecjktoken:D }
+ { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
+ { uptex }
+ { ptex }
}
- {
- \cs_gset_eq:NN \sys_if_engine_ptex:T \use:n
- \cs_gset_eq:NN \sys_if_engine_ptex:F \use_none:n
- \cs_gset_eq:NN \sys_if_engine_ptex:TF \use_i:nn
- \cs_gset_eq:NN \sys_if_engine_ptex_p: \c_true_bool
- \str_const:Nn \c_sys_engine_str { ptex }
- }
+ \cs_if_exist:NT \xetex_XeTeXversion:D { xetex }
}
-\cs_if_exist:NT \xetex_XeTeXversion:D
+\tl_map_inline:nn { { luatex } { pdftex } { ptex } { uptex } { xetex } }
{
- \cs_gset_eq:NN \sys_if_engine_xetex:T \use:n
- \cs_gset_eq:NN \sys_if_engine_xetex:F \use_none:n
- \cs_gset_eq:NN \sys_if_engine_xetex:TF \use_i:nn
- \cs_gset_eq:NN \sys_if_engine_xetex_p: \c_true_bool
- \str_const:Nn \c_sys_engine_str { xetex }
+ \@@_const:nn { sys_if_engine_ #1 }
+ { \str_if_eq_x_p:nn \c_sys_engine_str {#1} }
}
% \end{macrocode}
% \end{variable}
@@ -258,30 +253,17 @@
% \begin{variable}{\c_sys_output_str}
% This is a simple enough concept: the two views here are complementary.
% \begin{macrocode}
-\int_compare:nNnTF
- { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
+\str_const:Nx \c_sys_output_str
{
- \cs_new_eq:NN \sys_if_output_dvi:T \use_none:n
- \cs_new_eq:NN \sys_if_output_dvi:F \use:n
- \cs_new_eq:NN \sys_if_output_dvi:TF \use_ii:nn
- \cs_new_eq:NN \sys_if_output_dvi_p: \c_false_bool
- \cs_new_eq:NN \sys_if_output_pdf:T \use:n
- \cs_new_eq:NN \sys_if_output_pdf:F \use_none:n
- \cs_new_eq:NN \sys_if_output_pdf:TF \use_i:nn
- \cs_new_eq:NN \sys_if_output_pdf_p: \c_true_bool
- \str_const:Nn \c_sys_output_str { pdf }
+ \int_compare:nNnTF
+ { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
+ { pdf }
+ { dvi }
}
- {
- \cs_new_eq:NN \sys_if_output_dvi:T \use:n
- \cs_new_eq:NN \sys_if_output_dvi:F \use_none:n
- \cs_new_eq:NN \sys_if_output_dvi:TF \use_i:nn
- \cs_new_eq:NN \sys_if_output_dvi_p: \c_true_bool
- \cs_new_eq:NN \sys_if_output_pdf:T \use_none:n
- \cs_new_eq:NN \sys_if_output_pdf:F \use:n
- \cs_new_eq:NN \sys_if_output_pdf:TF \use_ii:nn
- \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool
- \str_const:Nn \c_sys_output_str { dvi }
- }
+\@@_const:nn { sys_if_output_dvi }
+ { \str_if_eq_x_p:nn \c_sys_output_str { dvi } }
+\@@_const:nn { sys_if_output_pdf }
+ { \str_if_eq_x_p:nn \c_sys_output_str { pdf } }
% \end{macrocode}
% \end{variable}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3tl-analysis.dtx Copyright (C) 2011-2017 The LaTeX3 Project%
+%% File: l3tl-analysis.dtx Copyright (C) 2011-2018 The 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
@@ -30,7 +30,7 @@
%
%
% \title{^^A
-% The \textsf{l3tl-analysis} package: analysing token lists^^A
+% The \textsf{l3tl-analysis} package: Analysing token lists^^A
% }
%
% \author{^^A
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -55,9 +55,9 @@
% debugging function, very similar to the \cs{ShowTokens} macro from the
% \pkg{ted} package.
%
-% \begin{function}[added = 2017-05-26]{\tl_show_analysis:N, \tl_show_analysis:n}
+% \begin{function}[added = 2018-04-09]{\tl_analysis_show:N, \tl_analysis_show:n}
% \begin{syntax}
-% \cs{tl_show_analysis:n} \Arg{token list}
+% \cs{tl_analysis_show:n} \Arg{token list}
% \end{syntax}
% Displays to the terminal the detailed decomposition of the
% \meta{token list} into tokens, showing the category code of each
@@ -65,22 +65,10 @@
% characters, and the value of registers.
% \end{function}
%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3tl-analysis} implementation}
-%
-% \subsection{Internal functions}
-%
-% \begin{variable}{\s__tl}
-% The format used to store token lists internally uses the scan mark
-% \cs{s__tl} as a delimiter.
-% \end{variable}
-%
-% \begin{function}{\__tl_analysis_map_inline:nn}
+% \begin{function}[added = 2018-04-09]
+% {\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn}
% \begin{syntax}
-% \cs{__tl_analysis_map_inline:nn} \Arg{token list} \Arg{inline function}
+% \cs{tl_analysis_map_inline:nn} \Arg{token list} \Arg{inline function}
% \end{syntax}
% Applies the \meta{inline function} to each individual \meta{token}
% in the \meta{token list}. The \meta{inline function} receives three
@@ -89,21 +77,34 @@
% \item \meta{tokens}, which both \texttt{o}-expand and
% \texttt{x}-expand to the \meta{token}. The detailed form of
% \meta{token} may change in later releases.
+% \item \meta{char code}, a decimal representation of the character
+% code of the token, $-1$ if it is a control sequence (with
+% \meta{catcode} $0$).
% \item \meta{catcode}, a capital hexadecimal digit which denotes
% the category code of the \meta{token} (0: control sequence, 1:
% begin-group, 2: end-group, 3: math shift, 4: alignment tab, 6:
% parameter, 7: superscript, 8: subscript, A: space, B: letter,
% C:other, D:active).
-% \item \meta{char code}, a decimal representation of the character
-% code of the token, $-1$ if it is a control sequence (with
-% \meta{catcode} $0$).
% \end{itemize}
% \end{function}
%
-% For optimizations in \pkg{l3regex} (when matching control sequences),
-% it may be useful to provide a \cs{__tl_analysis_from_str_map_inline:nn}
-% function, perhaps named \cs{__str_analysis_map_inline:nn}.
+% \end{documentation}
%
+% \begin{implementation}
+%
+% \section{\pkg{l3tl-analysis} implementation}
+%
+% \begin{macrocode}
+%<@@=tl>
+% \end{macrocode}
+%
+% \subsection{Internal functions}
+%
+% \begin{variable}{\s_@@}
+% The format used to store token lists internally uses the scan mark
+% \cs{s_@@} as a delimiter.
+% \end{variable}
+%
% \subsection{Internal format}
%
% The task of the \pkg{l3tl-analysis} module is to convert token lists
@@ -123,7 +124,7 @@
% regexes are catcode-agnostic. The internal format thus takes the form
% of a succession of items of the form
% \begin{quote}
-% \meta{tokens} \cs{s__tl} \meta{catcode} \meta{char code} \cs{s__tl}
+% \meta{tokens} \cs{s_@@} \meta{catcode} \meta{char code} \cs{s_@@}
% \end{quote}
% The \meta{tokens} \texttt{o}- \emph{and} \texttt{x}-expand to the
% original token in the token list or to the cluster of tokens
@@ -134,7 +135,7 @@
%
% Using delimited arguments lets us build the \meta{tokens}
% progressively when doing an encoding conversion in \pkg{l3str-convert}. On the
-% other hand, the delimiter \cs{s__tl} may not appear unbraced in
+% other hand, the delimiter \cs{s_@@} may not appear unbraced in
% \meta{tokens}. This is not a problem because we are careful to wrap
% control sequences in braces (as an argument to \cs{exp_not:n}) when
% converting from a general token list to the internal format.
@@ -144,15 +145,15 @@
% it is the following.
% \begin{itemize}
% \item A control sequence |\cs| becomes |\exp_not:n { \cs }|
-% \cs{s__tl} $0$ $-1$ \cs{s__tl}.
+% \cs{s_@@} $0$ $-1$ \cs{s_@@}.
% \item A begin-group character |{| becomes \cs{exp_after:wN} |{|
-% \cs{if_false:} |}| \cs{fi:} \cs{s__tl} $1$ \meta{char code}
-% \cs{s__tl}.
+% \cs{if_false:} |}| \cs{fi:} \cs{s_@@} $1$ \meta{char code}
+% \cs{s_@@}.
% \item An end-group character |}| becomes \cs{if_false:} |{| \cs{fi:}
-% |}| \cs{s__tl} $2$ \meta{char code} \cs{s__tl}.
+% |}| \cs{s_@@} $2$ \meta{char code} \cs{s_@@}.
% \item A character with any other category code becomes
-% \cs{exp_not:n} \Arg{character} \cs{s__tl} \meta{hex catcode}
-% \meta{char code} \cs{s__tl}.
+% \cs{exp_not:n} \Arg{character} \cs{s_@@} \meta{hex catcode}
+% \meta{char code} \cs{s_@@}.
% \end{itemize}
%
% ^^A todo: ask LuaTeX list for an \ifx\undefined <active char>
@@ -162,111 +163,99 @@
%<*initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<@@=tl_analysis>
-% \end{macrocode}
-%
% \subsection{Variables and helper functions}
%
-% \begin{variable}{\s__tl}
-% The scan mark \cs{s__tl} is used as a delimiter in the internal
+% \begin{variable}{\s_@@}
+% The scan mark \cs{s_@@} is used as a delimiter in the internal
% format. This is more practical than using a quark, because we would
% then need to control expansion much more carefully: compare
-% \cs{__int_value:w} |`#1| \cs{s__tl} with \cs{__int_value:w} |`#1|
+% \cs{int_value:w} |`#1| \cs{s_@@} with \cs{int_value:w} |`#1|
% \cs{exp_stop_f:} \cs{exp_not:N} \cs{q_mark} to extract a character
% code followed by the delimiter in an \texttt{x}-expansion.
% \begin{macrocode}
-\__scan_new:N \s__tl
+\scan_new:N \s_@@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_internal_tl}
-% This token list variable is used to hand the argument of
-% \cs{tl_show_analysis:n} to \cs{tl_show_analysis:N}.
-% \begin{macrocode}
-\tl_new:N \l_@@_internal_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_token}
-% \begin{variable}{\l_@@_char_token}
+% \begin{variable}{\l_@@_analysis_token}
+% \begin{variable}{\l_@@_analysis_char_token}
% The tokens in the token list are probed with the \TeX{} primitive
-% \tn{futurelet}. We use \cs{l_@@_token} in that
+% \tn{futurelet}. We use \cs{l_@@_analysis_token} in that
% construction. In some cases, we convert the following token to a
% string before probing it: then the token variable used is
-% \cs{l_@@_char_token}.
+% \cs{l_@@_analysis_char_token}.
% \begin{macrocode}
-\cs_new_eq:NN \l_@@_token ?
-\cs_new_eq:NN \l_@@_char_token ?
+\cs_new_eq:NN \l_@@_analysis_token ?
+\cs_new_eq:NN \l_@@_analysis_char_token ?
% \end{macrocode}
% \end{variable}
% \end{variable}
%
-% \begin{variable}{\l_@@_normal_int}
+% \begin{variable}{\l_@@_analysis_normal_int}
% The number of normal (\texttt{N}-type argument) tokens since the
% last special token.
% \begin{macrocode}
-\int_new:N \l_@@_normal_int
+\int_new:N \l_@@_analysis_normal_int
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_index_int}
+% \begin{variable}{\l_@@_analysis_index_int}
% During the first pass, this is the index in the array being built.
% During the second pass, it is equal to the maximum index in the
% array from the first pass.
% \begin{macrocode}
-\int_new:N \l_@@_index_int
+\int_new:N \l_@@_analysis_index_int
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_nesting_int}
+% \begin{variable}{\l_@@_analysis_nesting_int}
% Nesting depth of explicit begin-group and end-group characters
% during the first pass. This lets us detect the end of the token list
% without a reserved end-marker.
% \begin{macrocode}
-\int_new:N \l_@@_nesting_int
+\int_new:N \l_@@_analysis_nesting_int
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_type_int}
+% \begin{variable}{\l_@@_analysis_type_int}
% When encountering special characters, we record their \enquote{type}
% in this integer.
% \begin{macrocode}
-\int_new:N \l_@@_type_int
+\int_new:N \l_@@_analysis_type_int
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\g_@@_result_tl}
+% \begin{variable}{\g_@@_analysis_result_tl}
% The result of the conversion is stored in this token list, with a
% succession of items of the form
% \begin{quote}
-% \meta{tokens} \cs{s__tl} \meta{catcode} \meta{char code} \cs{s__tl}
+% \meta{tokens} \cs{s_@@} \meta{catcode} \meta{char code} \cs{s_@@}
% \end{quote}
% \begin{macrocode}
-\tl_new:N \g_@@_result_tl
+\tl_new:N \g_@@_analysis_result_tl
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}[EXP]{\@@_extract_charcode:}
-% \begin{macro}[EXP]{\@@_extract_charcode_aux:w}
+% \begin{macro}[EXP]{\@@_analysis_extract_charcode:}
+% \begin{macro}[EXP]{\@@_analysis_extract_charcode_aux:w}
% Extracting the character code from the meaning of
-% \cs{l_@@_token}. This has no error checking, and should
+% \cs{l_@@_analysis_token}. This has no error checking, and should
% only be assumed to work for begin-group and end-group character
% tokens. It produces a number in the form |`|\meta{char}.
% \begin{macrocode}
-\cs_new:Npn \@@_extract_charcode:
+\cs_new:Npn \@@_analysis_extract_charcode:
{
- \exp_after:wN \@@_extract_charcode_aux:w
- \token_to_meaning:N \l_@@_token
+ \exp_after:wN \@@_analysis_extract_charcode_aux:w
+ \token_to_meaning:N \l_@@_analysis_token
}
-\cs_new:Npn \@@_extract_charcode_aux:w #1 ~ #2 ~ { ` }
+\cs_new:Npn \@@_analysis_extract_charcode_aux:w #1 ~ #2 ~ { ` }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_cs_space_count:NN}
-% \begin{macro}[EXP]{\@@_cs_space_count:w}
-% \begin{macro}[EXP]{\@@_cs_space_count_end:w}
+% \begin{macro}[EXP]{\@@_analysis_cs_space_count:NN}
+% \begin{macro}[EXP]{\@@_analysis_cs_space_count:w}
+% \begin{macro}[EXP]{\@@_analysis_cs_space_count_end:w}
% Counts the number of spaces in the string representation of its
% second argument, as well as the number of characters following the
% last space in that representation, and feeds the two numbers as
@@ -273,22 +262,22 @@
% semicolon-delimited arguments to the first argument. When this
% function is used, the escape character is printable and non-space.
% \begin{macrocode}
-\cs_new:Npn \@@_cs_space_count:NN #1 #2
+\cs_new:Npn \@@_analysis_cs_space_count:NN #1 #2
{
\exp_after:wN #1
- \__int_value:w \__int_eval:w 0
- \exp_after:wN \@@_cs_space_count:w
+ \int_value:w \int_eval:w 0
+ \exp_after:wN \@@_analysis_cs_space_count:w
\token_to_str:N #2
- \fi: \@@_cs_space_count_end:w ; ~ !
+ \fi: \@@_analysis_cs_space_count_end:w ; ~ !
}
-\cs_new:Npn \@@_cs_space_count:w #1 ~
+\cs_new:Npn \@@_analysis_cs_space_count:w #1 ~
{
\if_false: #1 #1 \fi:
+ 1
- \@@_cs_space_count:w
+ \@@_analysis_cs_space_count:w
}
-\cs_new:Npn \@@_cs_space_count_end:w ; #1 \fi: #2 !
- { \exp_after:wN ; \__int_value:w \str_count_ignore_spaces:n {#1} ; }
+\cs_new:Npn \@@_analysis_cs_space_count_end:w ; #1 \fi: #2 !
+ { \exp_after:wN ; \int_value:w \str_count_ignore_spaces:n {#1} ; }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -298,10 +287,10 @@
%
% Our goal is to produce a token list of the form roughly
% \begin{quote}
-% \meta{token 1} \cs{s__tl} \meta{catcode 1} \meta{char code 1} \cs{s__tl} \\
-% \meta{token 2} \cs{s__tl} \meta{catcode 2} \meta{char code 2} \cs{s__tl} \\
+% \meta{token 1} \cs{s at __} \meta{catcode 1} \meta{char code 1} \cs{s at __} \\
+% \meta{token 2} \cs{s_@@} \meta{catcode 2} \meta{char code 2} \cs{s_@@} \\
% \ldots{}
-% \meta{token N} \cs{s__tl} \meta{catcode N} \meta{char code N} \cs{s__tl}
+% \meta{token N} \cs{s_@@} \meta{catcode N} \meta{char code N} \cs{s_@@}
% \end{quote}
% Most but not all tokens can be grabbed as an undelimited
% (\texttt{N}-type) argument by \TeX{}. The plan is to have a two pass
@@ -346,18 +335,18 @@
%
% The second pass is a simple exercise in expandable loops.
%
-% \begin{macro}{\@@:n}
+% \begin{macro}{\@@_analysis:n}
% Everything is done within a group, and all definitions are
% local. We use \cs{group_align_safe_begin/end:} to avoid problems in
-% case \cs{@@:n} is used within an alignment and its argument
+% case \cs{@@_analysis:n} is used within an alignment and its argument
% contains alignment tab tokens.
% \begin{macrocode}
-\cs_new_protected:Npn \@@:n #1
+\cs_new_protected:Npn \@@_analysis:n #1
{
\group_begin:
\group_align_safe_begin:
- \@@_a:n {#1}
- \@@_b:n {#1}
+ \@@_analysis_a:n {#1}
+ \@@_analysis_b:n {#1}
\group_align_safe_end:
\group_end:
}
@@ -366,7 +355,7 @@
%
% \subsection{Disabling active characters}
%
-% \begin{macro}{\@@_disable:n}
+% \begin{macro}{\@@_analysis_disable:n}
% Active characters can cause problems later on in the processing, so
% we provide a way to disable them, by setting them to
% \texttt{undefined}. Since Unicode contains too many characters to
@@ -376,14 +365,16 @@
% \begin{macrocode}
\group_begin:
\char_set_catcode_active:N \^^@
- \cs_new_protected:Npn \@@_disable:n #1
+ \cs_new_protected:Npn \@@_analysis_disable:n #1
{
\tex_lccode:D 0 = #1 \exp_stop_f:
\tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D
}
- \cs_if_exist:NT \ptex_kanjiskip:D
+ \bool_lazy_or:nnT
+ { \sys_if_engine_ptex_p: }
+ { \sys_if_engine_uptex_p: }
{
- \cs_gset_protected:Npn \@@_disable:n #1
+ \cs_gset_protected:Npn \@@_analysis_disable:n #1
{
\if_int_compare:w 256 > #1 \exp_stop_f:
\tex_lccode:D 0 = #1 \exp_stop_f:
@@ -431,37 +422,37 @@
% \cs{str_tail:n} \Arg{token} is non-empty, because the
% escape character is printable.
%
-% \begin{macro}{\@@_a:n}
+% \begin{macro}{\@@_analysis_a:n}
% We read tokens one by one using \tn{futurelet}.
% While performing the loop, we keep track of the number of
% true begin-group characters minus the number of
-% true end-group characters in \cs{l_@@_nesting_int}.
+% true end-group characters in \cs{l_@@_analysis_nesting_int}.
% This reaches $-1$ when we read the closing brace.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_a:n #1
+\cs_new_protected:Npn \@@_analysis_a:n #1
{
- \@@_disable:n { 32 }
+ \@@_analysis_disable:n { 32 }
\int_set:Nn \tex_escapechar:D { 92 }
- \int_zero:N \l_@@_normal_int
- \int_zero:N \l_@@_index_int
- \int_zero:N \l_@@_nesting_int
- \if_false: { \fi: \@@_a_loop:w #1 }
- \int_decr:N \l_@@_index_int
+ \int_zero:N \l_@@_analysis_normal_int
+ \int_zero:N \l_@@_analysis_index_int
+ \int_zero:N \l_@@_analysis_nesting_int
+ \if_false: { \fi: \@@_analysis_a_loop:w #1 }
+ \int_decr:N \l_@@_analysis_index_int
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_a_loop:w}
+% \begin{macro}{\@@_analysis_a_loop:w}
% Read one character and check its type.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_a_loop:w
- { \tex_futurelet:D \l_@@_token \@@_a_type:w }
+\cs_new_protected:Npn \@@_analysis_a_loop:w
+ { \tex_futurelet:D \l_@@_analysis_token \@@_analysis_a_type:w }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_a_type:w}
-% At this point, \cs{l_@@_token} holds the meaning
-% of the following token. We store in \cs{l_@@_type_int}
+% \begin{macro}{\@@_analysis_a_type:w}
+% At this point, \cs{l_@@_analysis_token} holds the meaning
+% of the following token. We store in \cs{l_@@_analysis_type_int}
% information about the meaning of the token ahead:
% \begin{itemize}
% \item 0 space token;
@@ -473,19 +464,19 @@
% character changes the nesting level ($2$ is used only here,
% and is irrelevant later). Then call the auxiliary for each case.
% Note that nesting conditionals here is safe because we only skip
-% over \cs{l_@@_token} if it matches with one of the
+% over \cs{l_@@_analysis_token} if it matches with one of the
% character tokens (hence is not a primitive conditional).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_a_type:w
+\cs_new_protected:Npn \@@_analysis_a_type:w
{
- \l_@@_type_int =
- \if_meaning:w \l_@@_token \c_space_token
+ \l_@@_analysis_type_int =
+ \if_meaning:w \l_@@_analysis_token \c_space_token
0
\else:
- \if_catcode:w \exp_not:N \l_@@_token \c_group_begin_token
+ \if_catcode:w \exp_not:N \l_@@_analysis_token \c_group_begin_token
1
\else:
- \if_catcode:w \exp_not:N \l_@@_token \c_group_end_token
+ \if_catcode:w \exp_not:N \l_@@_analysis_token \c_group_end_token
- 1
\else:
2
@@ -493,26 +484,26 @@
\fi:
\fi:
\exp_stop_f:
- \if_case:w \l_@@_type_int
- \exp_after:wN \@@_a_space:w
- \or: \exp_after:wN \@@_a_bgroup:w
- \or: \exp_after:wN \@@_a_safe:N
- \else: \exp_after:wN \@@_a_egroup:w
+ \if_case:w \l_@@_analysis_type_int
+ \exp_after:wN \@@_analysis_a_space:w
+ \or: \exp_after:wN \@@_analysis_a_bgroup:w
+ \or: \exp_after:wN \@@_analysis_a_safe:N
+ \else: \exp_after:wN \@@_analysis_a_egroup:w
\fi:
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_a_space:w}
-% \begin{macro}{\@@_a_space_test:w}
+% \begin{macro}{\@@_analysis_a_space:w}
+% \begin{macro}{\@@_analysis_a_space_test:w}
% In this branch, the following token's meaning is a blank space.
% Apply \tn{string} to that token: a true blank space gives a space, a
% control sequence gives a result starting with the escape character,
% an active character gives something else than a space since we
-% disabled the space. We grab as \cs{l_@@_char_token} the first
+% disabled the space. We grab as \cs{l_@@_analysis_char_token} the first
% character of the string representation then test it in
-% \cs{@@_a_space_test:w}.
-% Also, since \cs{@@_a_store:} expects the special token to be
+% \cs{@@_analysis_a_space_test:w}.
+% Also, since \cs{@@_analysis_a_store:} expects the special token to be
% stored in the relevant \tn{toks} register, we do that. The extra
% \cs{exp_not:n} is unnecessary of course, but it makes the treatment
% of all tokens more homogeneous.
@@ -526,30 +517,30 @@
% so that the second pass does not need to test the meaning of tokens,
% only strings.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_a_space:w
+\cs_new_protected:Npn \@@_analysis_a_space:w
{
- \tex_afterassignment:D \@@_a_space_test:w
+ \tex_afterassignment:D \@@_analysis_a_space_test:w
\exp_after:wN \cs_set_eq:NN
- \exp_after:wN \l_@@_char_token
+ \exp_after:wN \l_@@_analysis_char_token
\token_to_str:N
}
-\cs_new_protected:Npn \@@_a_space_test:w
+\cs_new_protected:Npn \@@_analysis_a_space_test:w
{
- \if_meaning:w \l_@@_char_token \c_space_token
- \tex_toks:D \l_@@_index_int { \exp_not:n { ~ } }
- \@@_a_store:
+ \if_meaning:w \l_@@_analysis_char_token \c_space_token
+ \tex_toks:D \l_@@_analysis_index_int { \exp_not:n { ~ } }
+ \@@_analysis_a_store:
\else:
- \int_incr:N \l_@@_normal_int
+ \int_incr:N \l_@@_analysis_normal_int
\fi:
- \@@_a_loop:w
+ \@@_analysis_a_loop:w
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_a_bgroup:w, \@@_a_egroup:w}
+% \begin{macro}{\@@_analysis_a_bgroup:w, \@@_analysis_a_egroup:w}
% \begin{macro}
-% {\@@_a_group:nw, \@@_a_group_aux:w, \@@_a_group_auxii:w, \@@_a_group_test:w}
+% {\@@_analysis_a_group:nw, \@@_analysis_a_group_aux:w, \@@_analysis_a_group_auxii:w, \@@_analysis_a_group_test:w}
% The token is most likely a true character token with catcode $1$ or
% $2$, but it might be a control sequence, or an active character.
% Optimizing for the first case, we store in a toks register some code
@@ -561,60 +552,60 @@
% active character with that character code and re-test: if the
% following token has become undefined we can in fact safely grab it.
% We are finally ready to turn what follows to a string and test it.
-% This is one place where we need \cs{l_@@_char_token} to be a
-% separate control sequence from \cs{l_@@_token}, to compare them.
+% This is one place where we need \cs{l_@@_analysis_char_token} to be a
+% separate control sequence from \cs{l_@@_analysis_token}, to compare them.
% \begin{macrocode}
\group_begin:
\char_set_catcode_group_begin:N \^^@ % {
- \cs_new_protected:Npn \@@_a_bgroup:w
- { \@@_a_group:nw { \exp_after:wN ^^@ \if_false: } \fi: } }
+ \cs_new_protected:Npn \@@_analysis_a_bgroup:w
+ { \@@_analysis_a_group:nw { \exp_after:wN ^^@ \if_false: } \fi: } }
\char_set_catcode_group_end:N \^^@
- \cs_new_protected:Npn \@@_a_egroup:w
- { \@@_a_group:nw { \if_false: { \fi: ^^@ } } % }
+ \cs_new_protected:Npn \@@_analysis_a_egroup:w
+ { \@@_analysis_a_group:nw { \if_false: { \fi: ^^@ } } % }
\group_end:
-\cs_new_protected:Npn \@@_a_group:nw #1
+\cs_new_protected:Npn \@@_analysis_a_group:nw #1
{
- \tex_lccode:D 0 = \@@_extract_charcode: \scan_stop:
- \tex_lowercase:D { \tex_toks:D \l_@@_index_int {#1} }
+ \tex_lccode:D 0 = \@@_analysis_extract_charcode: \scan_stop:
+ \tex_lowercase:D { \tex_toks:D \l_@@_analysis_index_int {#1} }
\if_int_compare:w \tex_lccode:D 0 = \tex_escapechar:D
\int_set:Nn \tex_escapechar:D { 139 - \tex_escapechar:D }
\fi:
- \@@_disable:n { \tex_lccode:D 0 }
- \tex_futurelet:D \l_@@_token \@@_a_group_aux:w
+ \@@_analysis_disable:n { \tex_lccode:D 0 }
+ \tex_futurelet:D \l_@@_analysis_token \@@_analysis_a_group_aux:w
}
-\cs_new_protected:Npn \@@_a_group_aux:w
+\cs_new_protected:Npn \@@_analysis_a_group_aux:w
{
- \if_meaning:w \l_@@_token \tex_undefined:D
- \exp_after:wN \@@_a_safe:N
+ \if_meaning:w \l_@@_analysis_token \tex_undefined:D
+ \exp_after:wN \@@_analysis_a_safe:N
\else:
- \exp_after:wN \@@_a_group_auxii:w
+ \exp_after:wN \@@_analysis_a_group_auxii:w
\fi:
}
-\cs_new_protected:Npn \@@_a_group_auxii:w
+\cs_new_protected:Npn \@@_analysis_a_group_auxii:w
{
- \tex_afterassignment:D \@@_a_group_test:w
+ \tex_afterassignment:D \@@_analysis_a_group_test:w
\exp_after:wN \cs_set_eq:NN
- \exp_after:wN \l_@@_char_token
+ \exp_after:wN \l_@@_analysis_char_token
\token_to_str:N
}
-\cs_new_protected:Npn \@@_a_group_test:w
+\cs_new_protected:Npn \@@_analysis_a_group_test:w
{
- \if_charcode:w \l_@@_token \l_@@_char_token
- \@@_a_store:
+ \if_charcode:w \l_@@_analysis_token \l_@@_analysis_char_token
+ \@@_analysis_a_store:
\else:
- \int_incr:N \l_@@_normal_int
+ \int_incr:N \l_@@_analysis_normal_int
\fi:
- \@@_a_loop:w
+ \@@_analysis_a_loop:w
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_a_store:}
+% \begin{macro}{\@@_analysis_a_store:}
% This function is called each time we meet a special token;
-% at this point, the \tn{toks} register \cs{l_@@_index_int}
+% at this point, the \tn{toks} register \cs{l_@@_analysis_index_int}
% holds a token list which expands to the given special token.
-% Also, the value of \cs{l_@@_type_int} indicates which case
+% Also, the value of \cs{l_@@_analysis_type_int} indicates which case
% we are in:
% \begin{itemize}
% \item -1 end-group character;
@@ -634,31 +625,32 @@
% \item 2 space begin-group character.
% \end{itemize}
% This has the property that non-space characters correspond to odd
-% values of \cs{l_@@_type_int}. The number of normal tokens until
+% values of \cs{l_@@_analysis_type_int}. The number of normal tokens until
% here and the type of special token are packed into a \tn{skip}
% register. Finally, we check whether we reached the last closing
% brace, in which case we stop by disabling the looping function
% (locally).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_a_store:
+\cs_new_protected:Npn \@@_analysis_a_store:
{
- \tex_advance:D \l_@@_nesting_int \l_@@_type_int
+ \tex_advance:D \l_@@_analysis_nesting_int \l_@@_analysis_type_int
\if_int_compare:w \tex_lccode:D 0 = `\ \exp_stop_f:
- \tex_advance:D \l_@@_type_int \l_@@_type_int
+ \tex_advance:D \l_@@_analysis_type_int \l_@@_analysis_type_int
\fi:
- \tex_skip:D \l_@@_index_int
- = \l_@@_normal_int sp plus \l_@@_type_int sp \scan_stop:
- \int_incr:N \l_@@_index_int
- \int_zero:N \l_@@_normal_int
- \if_int_compare:w \l_@@_nesting_int = -1 \exp_stop_f:
- \cs_set_eq:NN \@@_a_loop:w \scan_stop:
+ \tex_skip:D \l_@@_analysis_index_int
+ = \l_@@_analysis_normal_int sp
+ plus \l_@@_analysis_type_int sp \scan_stop:
+ \int_incr:N \l_@@_analysis_index_int
+ \int_zero:N \l_@@_analysis_normal_int
+ \if_int_compare:w \l_@@_analysis_nesting_int = -1 \exp_stop_f:
+ \cs_set_eq:NN \@@_analysis_a_loop:w \scan_stop:
\fi:
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_a_safe:N}
-% \begin{macro}{\@@_a_cs:ww}
+% \begin{macro}{\@@_analysis_a_safe:N}
+% \begin{macro}{\@@_analysis_a_cs:ww}
% This should be the simplest case: since the upcoming token is safe,
% we can simply grab it in a second pass. If the token is a single
% character (including space), the \cs{if_charcode:w} test yields
@@ -672,12 +664,12 @@
% if the control sequence name contains no space, count that token
% as a number of normal tokens equal to its string length. If the
% control sequence contains spaces, they should be registered as
-% special characters by increasing \cs{l_@@_index_int}
+% special characters by increasing \cs{l_@@_analysis_index_int}
% (no need to carefully count character between each space), and
% all characters after the last space should be counted in the
% following sequence of \enquote{normal} tokens.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_a_safe:N #1
+\cs_new_protected:Npn \@@_analysis_a_safe:N #1
{
\if_charcode:w
\scan_stop:
@@ -688,22 +680,22 @@
\exp_after:wN \use_ii:nn
\fi:
{
- \@@_disable:n { `#1 }
- \int_incr:N \l_@@_normal_int
+ \@@_analysis_disable:n { `#1 }
+ \int_incr:N \l_@@_analysis_normal_int
}
- { \@@_cs_space_count:NN \@@_a_cs:ww #1 }
- \@@_a_loop:w
+ { \@@_analysis_cs_space_count:NN \@@_analysis_a_cs:ww #1 }
+ \@@_analysis_a_loop:w
}
-\cs_new_protected:Npn \@@_a_cs:ww #1; #2;
+\cs_new_protected:Npn \@@_analysis_a_cs:ww #1; #2;
{
\if_int_compare:w #1 > 0 \exp_stop_f:
- \tex_skip:D \l_@@_index_int
- = \__int_eval:w \l_@@_normal_int + 1 sp \scan_stop:
- \tex_advance:D \l_@@_index_int #1 \exp_stop_f:
+ \tex_skip:D \l_@@_analysis_index_int
+ = \int_eval:n { \l_@@_analysis_normal_int + 1 } sp \exp_stop_f:
+ \tex_advance:D \l_@@_analysis_index_int #1 \exp_stop_f:
\else:
\tex_advance:D
\fi:
- \l_@@_normal_int #2 \exp_stop_f:
+ \l_@@_analysis_normal_int #2 \exp_stop_f:
}
% \end{macrocode}
% \end{macro}
@@ -715,32 +707,32 @@
% All the necessary information is stored in \tn{skip}
% and \tn{toks} registers.
%
-% \begin{macro}{\@@_b:n}
-% \begin{macro}[EXP]{\@@_b_loop:w}
+% \begin{macro}{\@@_analysis_b:n}
+% \begin{macro}[EXP]{\@@_analysis_b_loop:w}
% Start the loop with the index $0$. No need for an end-marker:
% the loop stops by itself when the last index is read.
% We repeatedly oscillate between reading long stretches
% of normal tokens, and reading special tokens.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_b:n #1
+\cs_new_protected:Npn \@@_analysis_b:n #1
{
- \tl_gset:Nx \g_@@_result_tl
+ \tl_gset:Nx \g_@@_analysis_result_tl
{
- \@@_b_loop:w 0; #1
- \__prg_break_point:
+ \@@_analysis_b_loop:w 0; #1
+ \prg_break_point:
}
}
-\cs_new:Npn \@@_b_loop:w #1;
+\cs_new:Npn \@@_analysis_b_loop:w #1;
{
- \exp_after:wN \@@_b_normals:ww
- \__int_value:w \tex_skip:D #1 ; #1 ;
+ \exp_after:wN \@@_analysis_b_normals:ww
+ \int_value:w \tex_skip:D #1 ; #1 ;
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_b_normals:ww}
-% \begin{macro}[EXP]{\@@_b_normal:wwN}
+% \begin{macro}[EXP]{\@@_analysis_b_normals:ww}
+% \begin{macro}[EXP]{\@@_analysis_b_normal:wwN}
% The first argument is the number of normal tokens which remain
% to be read, and the second argument is the index in the array
% produced in the first step.
@@ -747,29 +739,29 @@
% A character's string representation is always one character long,
% while a control sequence is always longer (we have set the escape
% character to a printable value). In both cases, we leave
-% \cs{exp_not:n} \Arg{token} \cs{s__tl} in the input stream
+% \cs{exp_not:n} \Arg{token} \cs{s_@@} in the input stream
% (after \texttt{x}-expansion). Here, \cs{exp_not:n} is used
% rather than \cs{exp_not:N} because |#3| could be
-% a macro parameter character or could be \cs{s__tl}
+% a macro parameter character or could be \cs{s_@@}
% (which must be hidden behind braces in the result).
% \begin{macrocode}
-\cs_new:Npn \@@_b_normals:ww #1;
+\cs_new:Npn \@@_analysis_b_normals:ww #1;
{
\if_int_compare:w #1 = 0 \exp_stop_f:
- \@@_b_special:w
+ \@@_analysis_b_special:w
\fi:
- \@@_b_normal:wwN #1;
+ \@@_analysis_b_normal:wwN #1;
}
-\cs_new:Npn \@@_b_normal:wwN #1; #2; #3
+\cs_new:Npn \@@_analysis_b_normal:wwN #1; #2; #3
{
- \exp_not:n { \exp_not:n { #3 } } \s__tl
+ \exp_not:n { \exp_not:n { #3 } } \s_@@
\if_charcode:w
\scan_stop:
\exp_after:wN \use_none:n \token_to_str:N #3 \prg_do_nothing:
\scan_stop:
- \exp_after:wN \@@_b_char:Nww
+ \exp_after:wN \@@_analysis_b_char:Nww
\else:
- \exp_after:wN \@@_b_cs:Nww
+ \exp_after:wN \@@_analysis_b_cs:Nww
\fi:
#3 #1; #2;
}
@@ -777,13 +769,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_b_char:Nww}
+% \begin{macro}[EXP]{\@@_analysis_b_char:Nww}
% If the normal token we grab is a character, leave
-% \meta{catcode} \meta{charcode} followed by \cs{s__tl}
-% in the input stream, and call \cs{@@_b_normals:ww}
+% \meta{catcode} \meta{charcode} followed by \cs{s_@@}
+% in the input stream, and call \cs{@@_analysis_b_normals:ww}
% with its first argument decremented.
% \begin{macrocode}
-\cs_new:Npx \@@_b_char:Nww #1
+\cs_new:Npx \@@_analysis_b_char:Nww #1
{
\exp_not:N \if_meaning:w #1 \exp_not:N \tex_undefined:D
\token_to_str:N D \exp_not:N \else:
@@ -791,53 +783,57 @@
\token_to_str:N C \exp_not:N \else:
\exp_not:N \if_catcode:w #1 \c_catcode_letter_token
\token_to_str:N B \exp_not:N \else:
- \exp_not:N \if_catcode:w #1 \c_math_toggle_token 3 \exp_not:N \else:
- \exp_not:N \if_catcode:w #1 \c_alignment_token 4 \exp_not:N \else:
- \exp_not:N \if_catcode:w #1 \c_math_superscript_token 7 \exp_not:N \else:
- \exp_not:N \if_catcode:w #1 \c_math_subscript_token 8 \exp_not:N \else:
+ \exp_not:N \if_catcode:w #1 \c_math_toggle_token 3
+ \exp_not:N \else:
+ \exp_not:N \if_catcode:w #1 \c_alignment_token 4
+ \exp_not:N \else:
+ \exp_not:N \if_catcode:w #1 \c_math_superscript_token 7
+ \exp_not:N \else:
+ \exp_not:N \if_catcode:w #1 \c_math_subscript_token 8
+ \exp_not:N \else:
\exp_not:N \if_catcode:w #1 \c_space_token
\token_to_str:N A \exp_not:N \else:
6
\exp_not:n { \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: }
- \exp_not:N \__int_value:w `#1 \s__tl
- \exp_not:N \exp_after:wN \exp_not:N \@@_b_normals:ww
- \exp_not:N \__int_value:w \exp_not:N \__int_eval:w - 1 +
+ \exp_not:N \int_value:w `#1 \s_@@
+ \exp_not:N \exp_after:wN \exp_not:N \@@_analysis_b_normals:ww
+ \exp_not:N \int_value:w \exp_not:N \int_eval:w - 1 +
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_b_cs:Nww}
-% \begin{macro}[EXP]{\@@_b_cs_test:ww}
+% \begin{macro}[EXP]{\@@_analysis_b_cs:Nww}
+% \begin{macro}[EXP]{\@@_analysis_b_cs_test:ww}
% If the token we grab is a control sequence, leave
% |0 -1| (as category code and character code) in the input stream,
-% followed by \cs{s__tl},
-% and call \cs{@@_b_normals:ww} with updated arguments.
+% followed by \cs{s_@@},
+% and call \cs{@@_analysis_b_normals:ww} with updated arguments.
% \begin{macrocode}
-\cs_new:Npn \@@_b_cs:Nww #1
+\cs_new:Npn \@@_analysis_b_cs:Nww #1
{
- 0 -1 \s__tl
- \@@_cs_space_count:NN \@@_b_cs_test:ww #1
+ 0 -1 \s_@@
+ \@@_analysis_cs_space_count:NN \@@_analysis_b_cs_test:ww #1
}
-\cs_new:Npn \@@_b_cs_test:ww #1 ; #2 ; #3 ; #4 ;
+\cs_new:Npn \@@_analysis_b_cs_test:ww #1 ; #2 ; #3 ; #4 ;
{
- \exp_after:wN \@@_b_normals:ww
- \__int_value:w \__int_eval:w
+ \exp_after:wN \@@_analysis_b_normals:ww
+ \int_value:w \int_eval:w
\if_int_compare:w #1 = 0 \exp_stop_f:
#3
\else:
- \tex_skip:D \__int_eval:w #4 + #1 \__int_eval_end:
+ \tex_skip:D \int_eval:n { #4 + #1 } \exp_stop_f:
\fi:
- #2
\exp_after:wN ;
- \__int_value:w \__int_eval:w #4 + #1 ;
+ \int_value:w \int_eval:n { #4 + #1 } ;
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_b_special:w}
-% \begin{macro}[EXP]{\@@_b_special_char:wN}
-% \begin{macro}[EXP]{\@@_b_special_space:w}
+% \begin{macro}[EXP]{\@@_analysis_b_special:w}
+% \begin{macro}[EXP]{\@@_analysis_b_special_char:wN}
+% \begin{macro}[EXP]{\@@_analysis_b_special_space:w}
% Here, |#1| is the current index in the array built in the first pass.
% Check now whether we reached the end (we shouldn't keep the trailing
% end-group character that marked the end of the token list in the
@@ -845,18 +841,18 @@
% Unpack the \tn{toks} register: when \texttt{x}-expanding again,
% we will get the special token.
% Then leave the category code in the input stream, followed by
-% the character code, and call \cs{@@_b_loop:w} with the next index.
+% the character code, and call \cs{@@_analysis_b_loop:w} with the next index.
% \begin{macrocode}
\group_begin:
\char_set_catcode_other:N A
- \cs_new:Npn \@@_b_special:w
- \fi: \@@_b_normal:wwN 0 ; #1 ;
+ \cs_new:Npn \@@_analysis_b_special:w
+ \fi: \@@_analysis_b_normal:wwN 0 ; #1 ;
{
\fi:
- \if_int_compare:w #1 = \l_@@_index_int
- \exp_after:wN \__prg_break:
+ \if_int_compare:w #1 = \l_@@_analysis_index_int
+ \exp_after:wN \prg_break:
\fi:
- \tex_the:D \tex_toks:D #1 \s__tl
+ \tex_the:D \tex_toks:D #1 \s_@@
\if_case:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
\token_to_str:N A
\or: 1
@@ -864,23 +860,23 @@
\else: 2
\fi:
\if_int_odd:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
- \exp_after:wN \@@_b_special_char:wN \__int_value:w
+ \exp_after:wN \@@_analysis_b_special_char:wN \int_value:w
\else:
- \exp_after:wN \@@_b_special_space:w \__int_value:w
+ \exp_after:wN \@@_analysis_b_special_space:w \int_value:w
\fi:
- \__int_eval:w 1 + #1 \exp_after:wN ;
+ \int_eval:n { 1 + #1 } \exp_after:wN ;
\token_to_str:N
}
\group_end:
-\cs_new:Npn \@@_b_special_char:wN #1 ; #2
+\cs_new:Npn \@@_analysis_b_special_char:wN #1 ; #2
{
- \__int_value:w `#2 \s__tl
- \@@_b_loop:w #1 ;
+ \int_value:w `#2 \s_@@
+ \@@_analysis_b_loop:w #1 ;
}
-\cs_new:Npn \@@_b_special_space:w #1 ; ~
+\cs_new:Npn \@@_analysis_b_special_space:w #1 ; ~
{
- 32 \s__tl
- \@@_b_loop:w #1 ;
+ 32 \s_@@
+ \@@_analysis_b_loop:w #1 ;
}
% \end{macrocode}
% \end{macro}
@@ -889,11 +885,12 @@
%
% \subsection{Mapping through the analysis}
%
-% \begin{macro}{\@@_map_inline:nn}
-% \begin{macro}{\@@_map_inline_aux:Nn}
+% \begin{macro}{\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn}
+% \begin{macro}{\@@_analysis_map_inline_aux:Nn}
+% \begin{macro}{\@@_analysis_map_inline_aux:nnn}
% First obtain the analysis of the token list into
-% \cs{g_@@_result_tl}. To allow nested mappings, increase the
-% nesting depth \cs{g__prg_map_int} (shared between all modules), then
+% \cs{g_@@_analysis_result_tl}. To allow nested mappings, increase the
+% nesting depth \cs{g__kernel_prg_map_int} (shared between all modules), then
% define the looping macro, which has a name specific to that nesting
% depth. That looping grabs the \meta{tokens}, \meta{catcode} and
% \meta{char code}; it checks for the end of the loop with
@@ -902,57 +899,65 @@
% |#2|, and loops by calling itself. When the loop ends, remember to
% decrease the nesting depth.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_map_inline:nn #1
+\cs_new_protected:Npn \tl_analysis_map_inline:nn #1
{
- \@@:n {#1}
- \int_gincr:N \g__prg_map_int
- \exp_args:Nc \@@_map_inline_aux:Nn
- { @@_map_inline_ \int_use:N \g__prg_map_int :wNw }
+ \@@_analysis:n {#1}
+ \int_gincr:N \g__kernel_prg_map_int
+ \exp_args:Nc \@@_analysis_map_inline_aux:Nn
+ { @@_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw }
}
-\cs_new_protected:Npn \@@_map_inline_aux:Nn #1#2
+\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1
+ { \exp_args:No \tl_analysis_map_inline:nn #1 }
+\cs_new_protected:Npn \@@_analysis_map_inline_aux:Nn #1#2
{
- \cs_gset_protected:Npn #1 ##1 \s__tl ##2 ##3 \s__tl
+ \cs_gset_protected:Npn #1 ##1 \s_@@ ##2 ##3 \s_@@
{
\use_none:n ##2
+ \@@_analysis_map_inline_aux:nnn {##1} {##3} {##2}
+ }
+ \cs_gset_protected:Npn \@@_analysis_map_inline_aux:nnn ##1##2##3
+ {
#2
#1
}
\exp_after:wN #1
- \g_@@_result_tl
- \s__tl { ? \tl_map_break: } \s__tl
- \__prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__prg_map_int }
+ \g_@@_analysis_result_tl
+ \s_@@ { ? \tl_map_break: } \s_@@
+ \prg_break_point:Nn \tl_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \subsection{Showing the results}
%
-% \begin{macro}{\tl_show_analysis:N, \tl_show_analysis:n}
-% Add to \cs{@@:n} a third pass to display tokens to the terminal.
+% \begin{macro}{\tl_analysis_show:N, \tl_analysis_show:n}
+% Add to \cs{@@_analysis:n} a third pass to display tokens to the terminal.
% If the token list variable is not defined, throw the same error
% as \cs{tl_show:N} by simply calling that function.
% \begin{macrocode}
-\cs_new_protected:Npn \tl_show_analysis:N #1
+\cs_new_protected:Npn \tl_analysis_show:N #1
{
\tl_if_exist:NTF #1
{
- \exp_args:No \@@:n {#1}
+ \exp_args:No \@@_analysis:n {#1}
\msg_show:nnxxxx { LaTeX / kernel } { show-tl-analysis }
- { \token_to_str:N #1 } { \@@_show: } { } { }
+ { \token_to_str:N #1 } { \@@_analysis_show: } { } { }
}
{ \tl_show:N #1 }
}
-\cs_new_protected:Npn \tl_show_analysis:n #1
+\cs_new_protected:Npn \tl_analysis_show:n #1
{
- \@@:n {#1}
+ \@@_analysis:n {#1}
\msg_show:nnxxxx { LaTeX / kernel } { show-tl-analysis }
- { } { \@@_show: } { } { }
+ { } { \@@_analysis_show: } { } { }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\@@_show:, \@@_show_loop:wNw}
+% \begin{macro}[rEXP]{\@@_analysis_show:, \@@_analysis_show_loop:wNw}
% Here, |#1| \texttt{o}- and \texttt{x}-expands to the token;
% |#2| is the category code (one uppercase hexadecimal digit),
% $0$ for control sequences;
@@ -961,40 +966,40 @@
% the meaning may overflow one line, and we want to truncate
% it. Those cases are thus separated out.
% \begin{macrocode}
-\cs_new:Npn \@@_show:
+\cs_new:Npn \@@_analysis_show:
{
- \exp_after:wN \@@_show_loop:wNw \g_@@_result_tl
- \s__tl { ? \__prg_break: } \s__tl
- \__prg_break_point:
+ \exp_after:wN \@@_analysis_show_loop:wNw \g_@@_analysis_result_tl
+ \s_@@ { ? \prg_break: } \s_@@
+ \prg_break_point:
}
-\cs_new:Npn \@@_show_loop:wNw #1 \s__tl #2 #3 \s__tl
+\cs_new:Npn \@@_analysis_show_loop:wNw #1 \s_@@ #2 #3 \s_@@
{
\use_none:n #2
\iow_newline: > \use:nn { ~ } { ~ }
\if_int_compare:w "#2 = 0 \exp_stop_f:
- \exp_after:wN \@@_show_cs:n
+ \exp_after:wN \@@_analysis_show_cs:n
\else:
\if_int_compare:w "#2 = 13 \exp_stop_f:
\exp_after:wN \exp_after:wN
- \exp_after:wN \@@_show_active:n
+ \exp_after:wN \@@_analysis_show_active:n
\else:
\exp_after:wN \exp_after:wN
- \exp_after:wN \@@_show_normal:n
+ \exp_after:wN \@@_analysis_show_normal:n
\fi:
\fi:
{#1}
- \@@_show_loop:wNw
+ \@@_analysis_show_loop:wNw
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\@@_show_normal:n}
+% \begin{macro}[rEXP]{\@@_analysis_show_normal:n}
% Non-active characters are a simple matter of printing
% the character, and its meaning. Our test suite checks that
% begin-group and end-group characters do not mess up
% \TeX{}'s alignment status.
% \begin{macrocode}
-\cs_new:Npn \@@_show_normal:n #1
+\cs_new:Npn \@@_analysis_show_normal:n #1
{
\exp_after:wN \token_to_str:N #1 ~
( \exp_after:wN \token_to_meaning:N #1 )
@@ -1002,21 +1007,21 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_show_value:N}
+% \begin{macro}[EXP]{\@@_analysis_show_value:N}
% This expands to the value of |#1| if it has any.
% \begin{macrocode}
-\cs_new:Npn \@@_show_value:N #1
+\cs_new:Npn \@@_analysis_show_value:N #1
{
\token_if_expandable:NF #1
{
- \token_if_chardef:NTF #1 \__prg_break: { }
- \token_if_mathchardef:NTF #1 \__prg_break: { }
- \token_if_dim_register:NTF #1 \__prg_break: { }
- \token_if_int_register:NTF #1 \__prg_break: { }
- \token_if_skip_register:NTF #1 \__prg_break: { }
- \token_if_toks_register:NTF #1 \__prg_break: { }
+ \token_if_chardef:NTF #1 \prg_break: { }
+ \token_if_mathchardef:NTF #1 \prg_break: { }
+ \token_if_dim_register:NTF #1 \prg_break: { }
+ \token_if_int_register:NTF #1 \prg_break: { }
+ \token_if_skip_register:NTF #1 \prg_break: { }
+ \token_if_toks_register:NTF #1 \prg_break: { }
\use_none:nnn
- \__prg_break_point:
+ \prg_break_point:
\use:n { \exp_after:wN = \tex_the:D #1 }
}
}
@@ -1023,27 +1028,27 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\@@_show_cs:n}
-% \begin{macro}[rEXP]{\@@_show_active:n}
-% \begin{macro}[rEXP]{\@@_show_long:nn}
-% \begin{macro}[rEXP]{\@@_show_long_aux:nnnn}
+% \begin{macro}[rEXP]{\@@_analysis_show_cs:n}
+% \begin{macro}[rEXP]{\@@_analysis_show_active:n}
+% \begin{macro}[rEXP]{\@@_analysis_show_long:nn}
+% \begin{macro}[rEXP]{\@@_analysis_show_long_aux:nnnn}
% Control sequences and active characters are printed in the same way,
% making sure not to go beyond the \cs{l_iow_line_count_int}. In case
% of an overflow, we replace the last characters by
-% \cs{c_@@_show_etc_str}.
+% \cs{c_@@_analysis_show_etc_str}.
% \begin{macrocode}
-\cs_new:Npn \@@_show_cs:n #1
- { \exp_args:No \@@_show_long:nn {#1} { control~sequence= } }
-\cs_new:Npn \@@_show_active:n #1
- { \exp_args:No \@@_show_long:nn {#1} { active~character= } }
-\cs_new:Npn \@@_show_long:nn #1
+\cs_new:Npn \@@_analysis_show_cs:n #1
+ { \exp_args:No \@@_analysis_show_long:nn {#1} { control~sequence= } }
+\cs_new:Npn \@@_analysis_show_active:n #1
+ { \exp_args:No \@@_analysis_show_long:nn {#1} { active~character= } }
+\cs_new:Npn \@@_analysis_show_long:nn #1
{
- \@@_show_long_aux:oofn
+ \@@_analysis_show_long_aux:oofn
{ \token_to_str:N #1 }
{ \token_to_meaning:N #1 }
- { \@@_show_value:N #1 }
+ { \@@_analysis_show_value:N #1 }
}
-\cs_new:Npn \@@_show_long_aux:nnnn #1#2#3#4
+\cs_new:Npn \@@_analysis_show_long_aux:nnnn #1#2#3#4
{
\int_compare:nNnTF
{ \str_count:n { #1 ~ ( #4 #2 #3 ) } }
@@ -1052,13 +1057,13 @@
\str_range:nnn { #1 ~ ( #4 #2 #3 ) } { 1 }
{
\l_iow_line_count_int - 3
- - \str_count:N \c_@@_show_etc_str
+ - \str_count:N \c_@@_analysis_show_etc_str
}
- \c_@@_show_etc_str
+ \c_@@_analysis_show_etc_str
}
{ #1 ~ ( #4 #2 #3 ) }
}
-\cs_generate_variant:Nn \@@_show_long_aux:nnnn { oof }
+\cs_generate_variant:Nn \@@_analysis_show_long_aux:nnnn { oof }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1067,12 +1072,12 @@
%
% \subsection{Messages}
%
-% \begin{variable}{\c_@@_show_etc_str}
+% \begin{variable}{\c_@@_analysis_show_etc_str}
% When a control sequence (or active character)
% and its meaning are too long to fit in one line
% of the terminal, the end is replaced by this token list.
% \begin{macrocode}
-\tl_const:Nx \c_@@_show_etc_str % (
+\tl_const:Nx \c_@@_analysis_show_etc_str % (
{ \token_to_str:N \ETC.) }
% \end{macrocode}
% \end{variable}
@@ -1087,7 +1092,24 @@
}
% \end{macrocode}
%
+% \subsection{Deprecated functions}
+%
+% \begin{macro}[deprecated = 2019-12-31]
+% {\tl_show_analysis:N, \tl_show_analysis:n}
+% Simple renames.
% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 }
+ { \tl_analysis_show:N }
+\cs_new_protected:Npn \tl_show_analysis:N #1
+ { \tl_analysis_show:N #1 }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 }
+ { \tl_analysis_show:n }
+\cs_new_protected:Npn \tl_show_analysis:n #1
+ { \tl_analysis_show:n {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
Deleted: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,280 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3tl-build.dtx Copyright (C) 2011-2017 The 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
-%
-% https://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3kernel bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver>
-\documentclass[full,kernel]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-%
-% \title{^^A
-% The \textsf{l3tl-build} package: building token lists^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team at latex-project.org}
-% {latex-team at latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2018/03/05}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% \section{\pkg{l3tl-build} documentation}
-%
-% This module provides no user function: it is meant for kernel use
-% only.
-%
-% There are two main ways of building token lists from individual
-% tokens. Either in one go within an \texttt{x}-expanding assignment, or
-% by repeatedly using \cs{tl_put_right:Nn}. The first method takes a
-% linear time, but only allows expandable operations. The second method
-% takes a time quadratic in the length of the token list, but allows
-% expandable and non-expandable operations.
-%
-% The goal of this module is to provide functions to build a token list
-% piece by piece in linear time, while allowing non-expandable
-% operations. This is achieved by abusing \tn{toks}: adding some tokens
-% to the token list is done by storing them in a free token register
-% (time $O(1)$ for each such operation). Those token registers are only
-% put together at the end, within an \texttt{x}-expanding assignment,
-% which takes a linear time.\footnote{If we run out of token registers,
-% then the currently filled-up \tn{toks} are put together in a
-% temporary token list, and cleared, and we ultimately use
-% \cs{tl_put_right:Nx} to put those chunks together. Hence the true
-% asymptotic is quadratic, with a very small constant.} Of course,
-% all this must be done in a group: we can't go and clobber the values
-% of legitimate \tn{toks} used by \LaTeXe{}.
-%
-% Since none of the current applications need the ability to insert
-% material on the left of the token list, I have not implemented
-% that. This could be done for instance by using odd-numbered \tn{toks}
-% for the left part, and even-numbered \tn{toks} for the right part.
-%
-% \subsection{Internal functions}
-%
-% \begin{function}
-% {
-% \__tl_build:Nw, \__tl_gbuild:Nw,
-% \__tl_build_x:Nw, \__tl_gbuild_x:Nw
-% }
-% \begin{syntax}
-% \cs{__tl_build:Nw} \meta{tl~var} \texttt{\ldots{}}
-% \cs{__tl_build_one:n} \Arg{tokens_1} \texttt{\ldots{}}
-% \cs{__tl_build_one:n} \Arg{tokens_2} \texttt{\ldots{}}
-% \ldots{}
-% \cs{__tl_build_end:}
-% \end{syntax}
-% Defines the \meta{tl~var} to contain the contents of \meta{tokens1}
-% followed by \meta{tokens2}, \emph{etc.} This is built in such a way
-% to be more efficient than repeatedly using \cs{tl_put_right:Nn}. The
-% code in \enquote{\texttt{\ldots{}}} does not need to be
-% expandable. The commands \cs{__tl_build:Nw} and \cs{__tl_build_end:}
-% start and end a group. The assignment to the \meta{tl~var} occurs
-% just after the end of that group, using \cs{tl_set:Nn},
-% \cs{tl_gset:Nn}, \cs{tl_set:Nx}, or \cs{tl_gset:Nx}.
-% \end{function}
-%
-% \begin{function}{\__tl_build_one:n, \__tl_build_one:o, \__tl_build_one:x}
-% \begin{syntax}
-% \cs{__tl_build_one:n} \Arg{tokens}
-% \end{syntax}
-% This function may only be used within the scope of a
-% \cs{__tl_build:Nw} function. It adds the \meta{tokens} on the
-% right of the current token list.
-% \end{function}
-%
-% \begin{function}{\__tl_build_end:}
-% Ends the scope started by \cs{__tl_build:Nw}, and performs the
-% relevant assignment.
-% \end{function}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3tl-build} implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=tl_build>
-% \end{macrocode}
-%
-% \subsection{Variables and helper functions}
-%
-% \begin{variable}{\l_@@_start_index_int, \l_@@_index_int}
-% Integers pointing to the starting index (currently always starts at
-% zero), and the current index. The corresponding \tn{toks} are
-% accessed directly by number.
-% \begin{macrocode}
-\int_new:N \l_@@_start_index_int
-\int_new:N \l_@@_index_int
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_result_tl}
-% The resulting token list is normally built in one go by unpacking
-% all \tn{toks} in some range. In the rare cases where there are too
-% many \cs{@@_one:n} commands, leading to the depletion of
-% registers, the contents of the current set of \tn{toks} is unpacked
-% into \cs{l_@@_result_tl}. This prevents overflow from
-% affecting the end-user (beyond an obvious performance hit).
-% \begin{macrocode}
-\tl_new:N \l_@@_result_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_unpack:}
-% \begin{macro}[EXP]{\@@_unpack_loop:w}
-% The various pieces of the token list are built in \tn{toks} from the
-% \texttt{start_index} (inclusive) to the (current) \texttt{index}
-% (excluded). Those \tn{toks} are unpacked and stored in order in the
-% \texttt{result} token list. Optimizations would be possible here,
-% for instance, unpacking $10$ \tn{toks} at a time with a macro
-% expanding to |\the\toks#10...\the\toks#19|, but this should be kept
-% for much later.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_unpack:
- {
- \tl_put_right:Nx \l_@@_result_tl
- {
- \exp_after:wN \@@_unpack_loop:w
- \int_use:N \l_@@_start_index_int ;
- \__prg_break_point:
- }
- }
-\cs_new:Npn \@@_unpack_loop:w #1 ;
- {
- \if_int_compare:w #1 = \l_@@_index_int
- \exp_after:wN \__prg_break:
- \fi:
- \tex_the:D \tex_toks:D #1 \exp_stop_f:
- \exp_after:wN \@@_unpack_loop:w
- \int_use:N \__int_eval:w #1 + 1 ;
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Building the token list}
-%
-% \begin{macro}
-% {
-% \@@:Nw , \@@_x:Nw ,
-% \__tl_gbuild:Nw , \__tl_gbuild_x:Nw
-% }
-% \begin{macro}{\@@_aux:NNw}
-% Similar to what is done for coffins: redefine some command, here
-% \cs{@@_end_aux:n} to hold the relevant assignment (see
-% \cs{@@_end:} for details). Then initialize the start index and
-% the current index at zero, and empty the \texttt{result} token list.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@:Nw
- { \@@_aux:NNw \tl_set:Nn }
-\cs_new_protected:Npn \@@_x:Nw
- { \@@_aux:NNw \tl_set:Nx }
-\cs_new_protected:Npn \__tl_gbuild:Nw
- { \@@_aux:NNw \tl_gset:Nn }
-\cs_new_protected:Npn \__tl_gbuild_x:Nw
- { \@@_aux:NNw \tl_gset:Nx }
-\cs_new_protected:Npn \@@_aux:NNw #1#2
- {
- \group_begin:
- \cs_set:Npn \@@_end_assignment:n
- { \group_end: #1 #2 }
- \int_zero:N \l_@@_start_index_int
- \int_zero:N \l_@@_index_int
- \tl_clear:N \l_@@_result_tl
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_end:}
-% \begin{macro}{\@@_end_assignment:n}
-% When we are done building a token list, unpack all \tn{toks} into
-% the \texttt{result} token list, and expand this list before closing
-% the group. The \cs{@@_end_assignment:n} function is defined by
-% \cs{@@_aux:NNw} to end the group and hold the relevant
-% assignment. Its value outside is irrelevant, but just in case, we
-% set it to a function which would clean up the contents of
-% \cs{l_@@_result_tl}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_end:
- {
- \@@_unpack:
- \exp_args:No
- \@@_end_assignment:n \l_@@_result_tl
- }
-\cs_new_eq:NN \@@_end_assignment:n \use_none:n
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_one:n, \@@_one:o, \@@_one:x}
-% Store the tokens in a free \tn{toks}, then move the pointer to the
-% next one. If we overflow, unpack the current \tn{toks}, and reset
-% the current index, preparing to fill more \tn{toks}. This could be
-% optimized by avoiding to read |#1|, using \tn{afterassignment}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_one:n #1
- {
- \tex_toks:D \l_@@_index_int {#1}
- \int_incr:N \l_@@_index_int
- \if_int_compare:w \l_@@_index_int > \c_max_register_int
- \@@_unpack:
- \l_@@_index_int \l_@@_start_index_int
- \fi:
- }
-\cs_new_protected:Npn \@@_one:o #1
- {
- \tex_toks:D \l_@@_index_int \exp_after:wN {#1}
- \int_incr:N \l_@@_index_int
- \if_int_compare:w \l_@@_index_int > \c_max_register_int
- \@@_unpack:
- \l_@@_index_int \l_@@_start_index_int
- \fi:
- }
-\cs_new_protected:Npn \@@_one:x #1
- { \use:x { \@@_one:n {#1} } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -316,8 +316,7 @@
% (character code $32$ or $9$) at the end of every line.
% Otherwise, spaces (and tabs) are retained at both ends of the
% single-line string, as if it appeared in the middle of a line
-% read from a file. Only the case of a single line is supported in
-% \LuaTeX{} because of a bug in this engine.
+% read from a file.
% \end{texnote}
% \end{function}
%
@@ -346,8 +345,7 @@
% (character code $32$ or $9$) at the end of every line.
% Otherwise, spaces (and tabs) are retained at both ends of the
% single-line string, as if it appeared in the middle of a line
-% read from a file. Only the case of a single line is supported in
-% \LuaTeX{} because of a bug in this engine.
+% read from a file.
% \end{texnote}
% \end{function}
%
@@ -621,7 +619,10 @@
% resulting character tokens in the input stream. A \meta{string}
% is a series of tokens with category code $12$ (other) with the exception
% of spaces, which retain category code $10$ (space).
+% This function requires only a single expansion.
+% Its argument \emph{must} be braced.
% \begin{texnote}
+% This is the \eTeX{} primitive \tn{detokenize}.
% Converting a \meta{token list} to a \meta{string} yields a
% concatenation of the string representations of every token in the
% \meta{token list}.
@@ -754,7 +755,7 @@
% \end{function}
%
% \begin{function}[added = 2011-07-09, updated = 2012-06-25, EXP]
-% {\tl_trim_spaces:n}
+% {\tl_trim_spaces:n, \tl_trim_spaces:o}
% \begin{syntax}
% \cs{tl_trim_spaces:n} \Arg{token list}
% \end{syntax}
@@ -769,6 +770,17 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2018-04-12, EXP]
+% {\tl_trim_spaces_apply:nN, \tl_trim_spaces_apply:oN}
+% \begin{syntax}
+% \cs{tl_trim_spaces_apply:nN} \Arg{token list} \meta{function}
+% \end{syntax}
+% Removes any leading and trailing explicit space characters (explicit
+% tokens with character code~$32$ and category code~$10$) from the
+% \meta{token list} and passes the result to the \meta{function} as an
+% \texttt{n}-type argument.
+% \end{function}
+%
% \begin{function}[added = 2011-07-09]
% {
% \tl_trim_spaces:N, \tl_trim_spaces:c,
@@ -1079,22 +1091,6 @@
% code and so should only be used for short-term storage.
% \end{variable}
%
-% \section{Internal functions}
-%
-% \begin{function}{\__tl_trim_spaces:nn}
-% \begin{syntax}
-% \cs{__tl_trim_spaces:nn} |{ \q_mark| \meta{token list} |}| \Arg{continuation}
-% \end{syntax}
-% This function removes all leading and trailing explicit space
-% characters from the \meta{token list}, and expands to the
-% \meta{continuation}, followed by a brace group containing
-% \cs{use_none:n} \cs{q_mark} \meta{trimmed token list}. For
-% instance, \cs{tl_trim_spaces:n} is implemented by taking the
-% \meta{continuation} to be \cs{exp_not:o}, and the \texttt{o}-type
-% expansion removes the \cs{q_mark}. This function is also used in
-% \pkg{l3clist} and \pkg{l3candidates}.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -1121,7 +1117,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \tl_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_eq:NN #1 \c_empty_tl
}
\cs_generate_variant:Nn \tl_new:N { c }
@@ -1134,13 +1130,13 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
\cs_new_protected:Npn \tl_const:Nn #1#2
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
}
\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
\cs_new_protected:Npn \tl_const:Nx #1#2
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_nopar:Npx #1 {#2}
}
\cs_generate_variant:Nn \tl_const:Nn { c }
@@ -1183,23 +1179,25 @@
% For setting token list variables equal to each other. When checking
% is turned on, make sure both variables exist.
% \begin{macrocode}
-\tex_ifodd:D \l at expl@enable at debug@bool
- \cs_new_protected:Npn \tl_set_eq:NN #1#2
- {
- \__kernel_chk_var_local:N #1
- \__kernel_chk_var_exist:N #2
- \cs_set_eq:NN #1 #2
- }
- \cs_new_protected:Npn \tl_gset_eq:NN #1#2
- {
- \__kernel_chk_var_global:N #1
- \__kernel_chk_var_exist:N #2
- \cs_gset_eq:NN #1 #2
- }
-\else:
- \cs_new_eq:NN \tl_set_eq:NN \cs_set_eq:NN
- \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
-\fi:
+\__kernel_if_debug:TF
+ {
+ \cs_new_protected:Npn \tl_set_eq:NN #1#2
+ {
+ \__kernel_chk_var_local:N #1
+ \__kernel_chk_var_exist:N #2
+ \cs_set_eq:NN #1 #2
+ }
+ \cs_new_protected:Npn \tl_gset_eq:NN #1#2
+ {
+ \__kernel_chk_var_global:N #1
+ \__kernel_chk_var_exist:N #2
+ \cs_gset_eq:NN #1 #2
+ }
+ }
+ {
+ \cs_new_eq:NN \tl_set_eq:NN \cs_set_eq:NN
+ \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
+ }
\cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
\cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
% \end{macrocode}
@@ -1491,7 +1489,8 @@
}
{
\group_begin:
- \exp_args:No \etex_everyeof:D { \c_@@_rescan_marker_tl \exp_not:N }
+ \exp_args:No \etex_everyeof:D
+ { \c_@@_rescan_marker_tl \exp_not:N }
\int_compare:nNnT \tex_endlinechar:D = { 32 }
{ \int_set:Nn \tex_endlinechar:D { -1 } }
\tex_newlinechar:D \tex_endlinechar:D
@@ -1636,7 +1635,7 @@
\int_compare:nNnT
{
\char_value_catcode:n
- { \exp_last_unbraced:Nf ` \str_head:n {#2} ~ }
+ { \exp_last_unbraced:Nf ` { \str_head:n {#2} } ~ }
}
= { 10 } { ~ }
\exp_after:wN \@@_rescan:w
@@ -1783,9 +1782,12 @@
}
% \end{macrocode}
% The auxiliary \cs{@@_replace_auxii:nNNNnn} receives the following
-% arguments: \Arg{delimiter}
-% \meta{function} \meta{assignment} \meta{tl~var} \Arg{pattern}
-% \Arg{replacement}. All of its work is done between
+% arguments:
+% \begin{quote}
+% \Arg{delimiter} \meta{function} \meta{assignment} \\
+% \meta{tl~var} \Arg{pattern} \Arg{replacement}
+% \end{quote}
+% All of its work is done between
% \cs{group_align_safe_begin:} and \cs{group_align_safe_end:} to avoid
% issues in alignments. It does the actual replacement within
% |#3|~|#4|~|{...}|, an \texttt{x}-expanding \meta{assignment}~|#3| to
@@ -1960,13 +1962,11 @@
% The test for emptiness is based on \cs{tl_if_empty:nTF}, but
% the expansion is hard-coded for efficiency, as this auxiliary
% function is used in many places.
-% Note that this works because \cs{etex_detokenize:D} expands tokens
-% that follow until reading a catcode $1$ (begin-group) token.
% \begin{macrocode}
\cs_new:Npn \@@_if_empty_return:o #1
{
\exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \etex_detokenize:D \exp_after:wN {#1} \q_nil
+ \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
\prg_return_true:
\else:
\prg_return_false:
@@ -2067,23 +2067,20 @@
% up to be expandable and to check the value exactly. The question
% mark prevents the auxiliary from losing braces.
% \begin{macrocode}
-\use:x
+\cs_set_protected:Npn \@@_tmp:w #1
{
- \prg_new_conditional:Npnn \exp_not:N \tl_if_novalue:n ##1
+ \prg_new_conditional:Npnn \tl_if_novalue:n ##1
{ p , T , F , TF }
{
- \exp_not:N \str_if_eq:onTF
- {
- \exp_not:N \@@_if_novalue:w ? ##1 { }
- \c_novalue_tl
- }
- { ? { } \c_novalue_tl }
- { \exp_not:N \prg_return_true: }
- { \exp_not:N \prg_return_false: }
+ \str_if_eq:onTF
+ { \@@_if_novalue:w ? ##1 { } #1 }
+ { ? { } #1 }
+ { \prg_return_true: }
+ { \prg_return_false: }
}
- \cs_new:Npn \exp_not:N \@@_if_novalue:w ##1 \c_novalue_tl
- {##1}
+ \cs_new:Npn \@@_if_novalue:w ##1 #1 {##1}
}
+\exp_args:No \@@_tmp:w { \c_novalue_tl }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2112,15 +2109,15 @@
% |#1| has a single item, the token is~|^| and the catcode test
% yields \texttt{true}. Otherwise, it is one of the characters
% resulting from \cs{tl_to_str:n}, and the catcode test yields
-% \texttt{false}. Note that \cs{if_catcode:w} takes care of the
-% expansions, and that \cs{tl_to_str:n} (the \tn{detokenize}
-% primitive) actually expands tokens until finding a begin-group
-% token.
+% \texttt{false}. Note that \cs{if_catcode:w} and
+% \cs{__kernel_tl_to_str:w} are primitives that take care of
+% expansion.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF }
{
\if_catcode:w ^ \exp_after:wN \@@_if_single:nnw
- \tl_to_str:n \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
+ \__kernel_tl_to_str:w
+ \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
\prg_return_true:
\else:
\prg_return_false:
@@ -2134,7 +2131,6 @@
% \begin{macro}[EXP, noTF]{\tl_case:Nn, \tl_case:cn}
% \begin{macro}[EXP]{\@@_case:nnTF}
% \begin{macro}[EXP]{\@@_case:Nw}
-% \begin{macro}[EXP]{\__prg_case_end:nw}
% \begin{macro}[EXP]{\@@_case_end:nw}
% The aim here is to allow the case statement to be evaluated
% using a known number of expansion steps (two), and without
@@ -2187,15 +2183,13 @@
% the first \cs{q_mark} and so |#4| is the \texttt{false} code (the
% \texttt{true} code is mopped up by |#3|).
% \begin{macrocode}
-\cs_new:Npn \__prg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
{ \exp_end: #1 #4 }
-\cs_new_eq:NN \@@_case_end:nw \__prg_case_end:nw
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \subsection{Mapping to token lists}
%
@@ -2210,13 +2204,13 @@
{
\@@_map_function:Nn #2 #1
\q_recursion_tail
- \__prg_break_point:Nn \tl_map_break: { }
+ \prg_break_point:Nn \tl_map_break: { }
}
\cs_new:Npn \tl_map_function:NN
{ \exp_args:No \tl_map_function:nN }
\cs_new:Npn \@@_map_function:Nn #1#2
{
- \__quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
#1 {#2} \@@_map_function:Nn #1
}
\cs_generate_variant:Nn \tl_map_function:NN { c }
@@ -2228,19 +2222,20 @@
% \begin{macro}{\tl_map_inline:nn}
% \begin{macro}{\tl_map_inline:Nn, \tl_map_inline:cn}
% The inline functions are straight forward by now. We use a little
-% trick with the counter \cs{g__prg_map_int} to make
+% trick with the counter \cs{g__kernel_prg_map_int} to make
% them nestable. We can also make use of \cs{@@_map_function:Nn}
% from before.
% \begin{macrocode}
\cs_new_protected:Npn \tl_map_inline:nn #1#2
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:cpn
- { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_args:Nc \@@_map_function:Nn
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
#1 \q_recursion_tail
- \__prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \tl_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
\cs_new_protected:Npn \tl_map_inline:Nn
{ \exp_args:No \tl_map_inline:nn }
@@ -2260,7 +2255,7 @@
{
\@@_map_variable:Nnn #2 {#3} #1
\q_recursion_tail
- \__prg_break_point:Nn \tl_map_break: { }
+ \prg_break_point:Nn \tl_map_break: { }
}
\cs_new_protected:Npn \tl_map_variable:NNn
{ \exp_args:No \tl_map_variable:nNn }
@@ -2267,7 +2262,7 @@
\cs_new_protected:Npn \@@_map_variable:Nnn #1#2#3
{
\tl_set:Nn #1 {#3}
- \__quark_if_recursion_tail_break:NN #1 \tl_map_break:
+ \quark_if_recursion_tail_break:NN #1 \tl_map_break:
\use:n {#2}
\@@_map_variable:Nnn #1 {#2}
}
@@ -2279,12 +2274,12 @@
%
% \begin{macro}{\tl_map_break:}
% \begin{macro}{\tl_map_break:n}
-% The break statements use the general \cs{__prg_map_break:Nn}.
+% The break statements use the general \cs{prg_map_break:Nn}.
% \begin{macrocode}
\cs_new:Npn \tl_map_break:
- { \__prg_map_break:Nn \tl_map_break: { } }
+ { \prg_map_break:Nn \tl_map_break: { } }
\cs_new:Npn \tl_map_break:n
- { \__prg_map_break:Nn \tl_map_break: }
+ { \prg_map_break:Nn \tl_map_break: }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2302,7 +2297,7 @@
% These functions return the replacement text of a token list as a
% string.
% \begin{macrocode}
-\cs_new:Npn \tl_to_str:N #1 { \etex_detokenize:D \exp_after:wN {#1} }
+\cs_new:Npn \tl_to_str:N #1 { \__kernel_tl_to_str:w \exp_after:wN {#1} }
\cs_generate_variant:Nn \tl_to_str:N { c }
% \end{macrocode}
% \end{macro}
@@ -2381,6 +2376,7 @@
% \end{macro}
%
% \begin{macro}{\tl_trim_spaces:n, \tl_trim_spaces:o}
+% \begin{macro}{\tl_trim_spaces_apply:nN, \tl_trim_spaces_apply:oN}
% \begin{macro}
% {
% \tl_trim_spaces:N, \tl_trim_spaces:c,
@@ -2397,6 +2393,9 @@
\cs_new:Npn \tl_trim_spaces:n #1
{ \@@_trim_spaces:nn { \q_mark #1 } \exp_not:o }
\cs_generate_variant:Nn \tl_trim_spaces:n { o }
+\cs_new:Npn \tl_trim_spaces_apply:nN #1#2
+ { \@@_trim_spaces:nn { \q_mark #1 } { \exp_args:No #2 } }
+\cs_generate_variant:Nn \tl_trim_spaces_apply:nN { o }
\cs_new_protected:Npn \tl_trim_spaces:N #1
{ \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
\cs_new_protected:Npn \tl_gtrim_spaces:N #1
@@ -2469,6 +2468,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn, \tl_sort:nN}
@@ -2478,12 +2478,16 @@
% \subsection{Token by token changes}
%
% \begin{variable}{\q_@@_act_mark, \q_@@_act_stop}
-% The \cs{tl_act} functions may be applied to any token list.
+% The \cs[no-index]{@@_act_\ldots{}} functions may be applied to any token list.
% Hence, we use two private quarks, to allow any token, even quarks,
% in the token list.
% Only \cs{q_@@_act_mark} and \cs{q_@@_act_stop} may not appear
-% in the token lists manipulated by \cs{@@_act:NNNnn} functions. The quarks
-% are effectively defined in \pkg{l3quark}.
+% in the token lists manipulated by \cs{@@_act:NNNnn} functions.
+% No quark module yet, so do things by hand.
+% \begin{macrocode}
+\cs_new_nopar:Npn \q_@@_act_mark { \q_@@_act_mark }
+\cs_new_nopar:Npn \q_@@_act_stop { \q_@@_act_stop }
+% \end{macrocode}
% \end{variable}
%
% \begin{macro}[EXP]{\@@_act:NNNnn}
@@ -2588,7 +2592,7 @@
% \begin{macrocode}
\cs_new:Npn \tl_reverse:n #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{
\exp:w
\@@_act:NNNnn
@@ -2645,7 +2649,7 @@
% \begin{macrocode}
\cs_new:Npn \tl_head:n #1
{
- \etex_unexpanded:D
+ \__kernel_exp_not:w
\if_false: { \fi: \@@_head_auxi:nw #1 { } \q_stop }
}
\cs_new:Npn \@@_head_auxi:nw #1#2 \q_stop
@@ -2656,7 +2660,7 @@
\cs_new:Npn \@@_head_auxii:n #1
{
\exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \tl_to_str:n \exp_after:wN { \use_none:n #1 } \q_nil
+ \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q_nil
\exp_after:wN \use_i:nn
\else:
\exp_after:wN \use_ii:nn
@@ -2685,7 +2689,7 @@
% \begin{macrocode}
\cs_new:Npn \tl_tail:n #1
{
- \etex_unexpanded:D
+ \__kernel_exp_not:w
\tl_if_blank:nTF {#1}
{ { } }
{ \exp_after:wN { \use_none:n #1 } }
@@ -2928,7 +2932,7 @@
{ \exp_args:Nf \@@_item_aux:nn { \int_eval:n {#2} } {#1} }
#1
\q_recursion_tail
- \__prg_break_point:
+ \prg_break_point:
}
\cs_new:Npn \@@_item_aux:nn #1#2
{
@@ -2938,9 +2942,9 @@
}
\cs_new:Npn \@@_item:nn #1#2
{
- \__quark_if_recursion_tail_break:nN {#2} \__prg_break:
+ \quark_if_recursion_tail_break:nN {#2} \prg_break:
\int_compare:nNnTF {#1} = 1
- { \__prg_break:n { \exp_not:n {#2} } }
+ { \prg_break:n { \exp_not:n {#2} } }
{ \exp_args:Nf \@@_item:nn { \int_eval:n { #1 - 1 } } }
}
\cs_new:Npn \tl_item:Nn { \exp_args:No \tl_item:nn }
@@ -2961,7 +2965,7 @@
\cs_generate_variant:Nn \tl_log:N { c }
\cs_new_protected:Npn \@@_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{ \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } }
}
% \end{macrocode}
@@ -2980,7 +2984,7 @@
% of all these manipulations is displayed to the terminal using
% \cs{etex_showtokens:D} and an odd \cs{exp_after:wN} which expand the
% closing brace to improve the output slightly. The calls to
-% \cs{__iow_with:Nnn} ensure that the \tn{newlinechar} is set to~$10$
+% \cs{__kernel_iow_with:Nnn} ensure that the \tn{newlinechar} is set to~$10$
% so that the \cs{iow_newline:} inserted by the line-wrapping code
% are correctly recognized by \TeX{}, and that \tn{errorcontextlines}
% is $-1$ to avoid printing irrelevant context.
@@ -2990,9 +2994,9 @@
\cs_new_protected:Npn \@@_show:n #1
{
\tl_set:Nf \l_@@_internal_a_tl { \@@_show:w #1 \q_stop }
- \__iow_with:Nnn \tex_newlinechar:D { 10 }
+ \__kernel_iow_with:Nnn \tex_newlinechar:D { 10 }
{
- \__iow_with:Nnn \tex_errorcontextlines:D { -1 }
+ \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
{
\etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
{ \exp_after:wN \l_@@_internal_a_tl }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -12,7 +12,6 @@
% This file is part of the "l3kernel bundle" (The Work in LPPL)
% and all files in that bundle must be distributed together.
%
-%=[]
% -----------------------------------------------------------------------
%
% The development version of the bundle can be found at
@@ -42,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2018/03/05}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -122,7 +121,8 @@
% be an active character.
% \end{function}
%
-% \begin{function}[EXP, added = 2015-09-09]{\char_generate:nn}
+% \begin{function}[EXP, added = 2015-09-09, updated = 2018-04-19]
+% {\char_generate:nn}
% \begin{syntax}
% \cs{char_generate:nn} \Arg{charcode} \Arg{catcode}
% \end{syntax}
@@ -139,12 +139,14 @@
% \item $8$ (math subscript)
% \item $11$ (letter)
% \item $12$ (other)
+% \item $13$ (active) (not \XeTeX{})
% \end{itemize}
% and other values raise an error.
%
% The \meta{charcode} may be any one valid for the engine in use. Note
% however that for \XeTeX{} releases prior to 0.99992 only the 8-bit
-% range ($0$ to $255$) is accepted due to engine limitations.
+% range ($0$ to $255$) is accepted due to engine limitations. Note also
+% that \XeTeX{} cannot currently generate active character tokens.
% \end{function}
%
% \begin{variable}[added = 2011-09-05]{\c_catcode_other_space_tl}
@@ -443,6 +445,10 @@
% as |macro|s.
% \begin{texnote}
% This is the \TeX{} primitive \tn{meaning}.
+% The \meta{token} can thus be an explicit space tokens or an
+% explicit begin-group or end-group character token (|{|~or~|}| when
+% normal \TeX{} category codes apply) even though these are not
+% valid \texttt{N}-type arguments.
% \end{texnote}
% \end{function}
%
@@ -457,6 +463,10 @@
% \meta{token}). This function requires only a single expansion.
% \begin{texnote}
% \cs{token_to_str:N} is the \TeX{} primitive \tn{string} renamed.
+% The \meta{token} can thus be an explicit space tokens or an
+% explicit begin-group or end-group character token (|{|~or~|}| when
+% normal \TeX{} category codes apply) even though these are not
+% valid \texttt{N}-type arguments.
% \end{texnote}
% \end{function}
%
@@ -1019,9 +1029,9 @@
% expandable) results in an internal token, displayed (temporarily)
% as \cs{notexpanded: \meta{token}}, whose shape coincides with the
% \meta{token} and whose meaning differs from \tn{relax}.
-% \item An |\outer endtemplate:| (expanding to another internal token,
-% |end of alignment template|) can be encountered when peeking ahead
-% at the next token.
+% \item An |\outer endtemplate:| can be encountered when peeking ahead
+% at the next token; this expands to another internal token,
+% |end of alignment template|.
% \item Tricky programming might access a frozen |\endwrite|.
% \item Some frozen tokens can only be accessed in interactive
% sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
@@ -1095,19 +1105,6 @@
% single tokens \enquote{N-type}, as they are suitable to be used as an
% argument for a function with the signature~\texttt{:N}.
%
-% \section{Internal functions}
-%
-% \begin{function}[EXP, added = 2016-03-25]{\__char_generate:nn}
-% \begin{syntax}
-% \cs{__char_generate:nn} \Arg{charcode} \Arg{catcode}
-% \end{syntax}
-% This function is identical in operation to the public
-% \cs{char_generate:nn} but omits various sanity tests. In particular, this
-% means it is used in certain places where engine variations need to be
-% accounted for by the kernel. The \meta{catcode} must give an explicit
-% integer when expanded (and must not absorb a space for instance).
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -1130,9 +1127,9 @@
% Simple wrappers around the primitives.
% \begin{macrocode}
\cs_new_protected:Npn \char_set_catcode:nn #1#2
- { \tex_catcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_catcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_catcode:n #1
- { \tex_the:D \tex_catcode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_catcode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_catcode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_catcode:n {#1} } }
% \end{macrocode}
@@ -1265,27 +1262,27 @@
% Pretty repetitive, but necessary!
% \begin{macrocode}
\cs_new_protected:Npn \char_set_mathcode:nn #1#2
- { \tex_mathcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_mathcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_mathcode:n #1
- { \tex_the:D \tex_mathcode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_mathcode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_mathcode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_mathcode:n {#1} } }
\cs_new_protected:Npn \char_set_lccode:nn #1#2
- { \tex_lccode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_lccode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_lccode:n #1
- { \tex_the:D \tex_lccode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_lccode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_lccode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_lccode:n {#1} } }
\cs_new_protected:Npn \char_set_uccode:nn #1#2
- { \tex_uccode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_uccode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_uccode:n #1
- { \tex_the:D \tex_uccode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_uccode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_uccode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_uccode:n {#1} } }
\cs_new_protected:Npn \char_set_sfcode:nn #1#2
- { \tex_sfcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_sfcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_sfcode:n #1
- { \tex_the:D \tex_sfcode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_sfcode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_sfcode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_sfcode:n {#1} } }
% \end{macrocode}
@@ -1355,12 +1352,18 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_int_to_roman:w}
+% For efficiency in 8-bit engines, we use the faster primitive approach
+% to making roman numerals.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_int_to_roman:w \tex_romannumeral:D
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]{\char_generate:nn}
-% \begin{macro}[EXP]{\__char_generate:nn}
% \begin{macro}[EXP]{\@@_generate_aux:nn}
-% \begin{macro}[EXP]{\@@_generate_aux:nnw}
+% \begin{macro}[EXP]{\@@_generate_aux:nnw, \@@_generate_auxii:nnw}
% \begin{variable}{\l_@@_tmp_tl}
-% \begin{variable}{\c_@@_max_int}
% \begin{macro}[EXP]{\@@_generate_invalid_catcode:}
% The aim here is to generate characters of (broadly) arbitrary category
% code. Where possible, that is done using engine support (\XeTeX{},
@@ -1368,57 +1371,43 @@
% the interface layer, turn the two arguments into integers up-front so
% this is only done once.
% \begin{macrocode}
-\__kernel_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } }
\cs_new:Npn \char_generate:nn #1#2
{
\exp:w \exp_after:wN \@@_generate_aux:w
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
+ \int_value:w \int_eval:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n {#2} ;
}
-\cs_new:Npn \__char_generate:nn #1#2
- {
- \exp:w \exp_after:wN
- \@@_generate_aux:nnw \exp_after:wN
- { \__int_value:w \__int_eval:w #1 } {#2} \exp_end:
- }
% \end{macrocode}
% Before doing any actual conversion, first some special case filtering.
-% The \tn{Ucharcat} primitive cannot make active chars, so that is turned
-% off here: if the primitive gets altered then the code is already in
-% place for 8-bit engines and will kick in for \LuaTeX{} too. Spaces
-% are also banned here as \LuaTeX{} emulation only makes normal (charcode
-% $32$ spaces. However, |^^@| is filtered out separately as that can't be
+% Spaces are out here as \LuaTeX{} emulation only makes normal (charcode
+% $32$ spaces). However, |^^@| is filtered out separately as that can't be
% done with macro emulation either, so is flagged up separately. That
% done, hand off to the engine-dependent part.
% \begin{macrocode}
\cs_new:Npn \@@_generate_aux:w #1 ; #2 ;
{
- \if_int_compare:w #2 = 13 \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel } { char-active }
+ \if_int_compare:w #2 = 10 \exp_stop_f:
+ \if_int_compare:w #1 = 0 \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel } { char-null-space }
+ \else:
+ \__kernel_msg_expandable_error:nn { kernel } { char-space }
+ \fi:
\else:
- \if_int_compare:w #2 = 10 \exp_stop_f:
- \if_int_compare:w #1 = 0 \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel } { char-null-space }
- \else:
- \__kernel_msg_expandable_error:nn { kernel } { char-space }
- \fi:
+ \if_int_odd:w 0
+ \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel }
+ { char-invalid-catcode }
\else:
\if_int_odd:w 0
- \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+ \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
\__kernel_msg_expandable_error:nn { kernel }
- { char-invalid-catcode }
+ { char-out-of-range }
\else:
- \if_int_odd:w 0
- \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
- \if_int_compare:w #1 > \c_@@_max_int 1 \fi: \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel }
- { char-out-of-range }
- \else:
- \@@_generate_aux:nnw {#1} {#2}
- \fi:
+ \@@_generate_aux:nnw {#1} {#2}
\fi:
\fi:
\fi:
@@ -1432,6 +1421,9 @@
% out here using a primitive-based boolean expression for speed.
% The final level is the basic definition at the engine level: the arguments
% here are integers so there is no need to worry about them too much.
+% At present \XeTeX{} cannot generate active characters so we filter that:
+% at some future stage that may change: the slightly odd ordering of
+% auxiliaries reflects that.
% \begin{macrocode}
\group_begin:
%<*package>
@@ -1440,16 +1432,15 @@
%</package>
\char_set_catcode_other:n { 0 }
\if_int_odd:w 0
- \cs_if_exist:NT \luatex_directlua:D { 1 }
- \cs_if_exist:NT \utex_charcat:D { 1 } \exp_stop_f:
- \int_const:Nn \c_@@_max_int { 1114111 }
- \cs_if_exist:NTF \luatex_directlua:D
+ \sys_if_engine_luatex:T { 1 }
+ \sys_if_engine_xetex:T { 1 } \exp_stop_f:
+ \sys_if_engine_luatex:TF
{
\cs_new:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
{
#3
- \exp_after:wN \exp_end:
- \luatex_directlua:D { l3kernel.charcat(#1, #2) }
+ \exp_after:wN \exp_after:wN \exp_after:wN \exp_end:
+ \lua_now_x:n { l3kernel.charcat(#1, #2) }
}
}
{
@@ -1457,8 +1448,19 @@
{
#3
\exp_after:wN \exp_end:
- \utex_charcat:D #1 ~ #2 ~
+ \utex_charcat:D #1 \exp_stop_f: #2 \exp_stop_f:
}
+ \cs_new_eq:NN \@@_generate_auxii:nnw \@@_generate_aux:nnw
+ \cs_gset:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
+ {
+ #3
+ \if_int_compare:w #2 = 13 \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel } { char-active }
+ \else:
+ \@@_generate_auxii:nnw {#1} {#2}
+ \fi:
+ \exp_end:
+ }
}
\else:
% \end{macrocode}
@@ -1472,7 +1474,6 @@
% To get open/close braces into the list, they are set up using |\if_false:|
% pairing and are then |x|-type expanded together into the desired form.
% \begin{macrocode}
- \int_const:Nn \c_@@_max_int { 255 }
\tl_set:Nn \l_@@_tmp_tl { \exp_not:N \or: }
\char_set_catcode_group_begin:n { 0 } % {
\tl_put_right:Nn \l_@@_tmp_tl { ^^@ \if_false: } }
@@ -1493,7 +1494,7 @@
\tl_put_right:Nn \l_@@_tmp_tl
{
\or:
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{ \exp_after:wN ^^@ \exp_after:wN }
}
\tl_put_right:Nn \l_@@_tmp_tl { \or: }
@@ -1533,20 +1534,20 @@
\exp_args:Nx \tex_lowercase:D
{
\tl_const:Nn
- \exp_not:c { c_@@_ \__int_to_roman:w #1 _tl }
+ \exp_not:c { c_@@_ \@@_int_to_roman:w #1 _tl }
{ \exp_not:o \l_@@_tmp_tl }
}
}
%<*package>
- \int_step_function:nnnN { 0 } { 1 } { 11 } \@@_tmp:n
+ \int_step_function:nnN { 0 } { 11 } \@@_tmp:n
\group_begin:
\tl_replace_once:Nnn \l_@@_tmp_tl { ^^@ } { \ERROR }
\@@_tmp:n { 12 }
\group_end:
- \int_step_function:nnnN { 13 } { 1 } { 255 } \@@_tmp:n
+ \int_step_function:nnN { 13 } { 255 } \@@_tmp:n
%</package>
%<*initex>
- \int_step_function:nnnN { 0 } { 1 } { 255 } \@@_tmp:n
+ \int_step_function:nnN { 0 } { 255 } \@@_tmp:n
%</initex>
\cs_new:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
{
@@ -1556,7 +1557,7 @@
\exp_after:wN \exp_after:wN
\if_case:w #2
\exp_last_unbraced:Nv \exp_stop_f:
- { c_@@_ \__int_to_roman:w #1 _tl }
+ { c_@@_ \@@_int_to_roman:w #1 _tl }
\fi:
}
\fi:
@@ -1564,11 +1565,9 @@
% \end{macrocode}
% \end{macro}
% \end{variable}
-% \end{variable}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\c_catcode_other_space_tl}
% Create a space with category code $12$: an \enquote{other} space.
@@ -1609,12 +1608,12 @@
% \emph{work} with \cs{cs_new_eq:NN} but that's not really a great idea to
% show off: we want people to stick to the defined interfaces and that
% includes us.) So that these few odd names go into the log when appropriate
-% there is a need to hand-apply the \cs{__chk_if_free_cs:N} check.
+% there is a need to hand-apply the \cs{__kernel_chk_if_free_cs:N} check.
% \begin{macrocode}
\group_begin:
- \__chk_if_free_cs:N \c_group_begin_token
+ \__kernel_chk_if_free_cs:N \c_group_begin_token
\tex_global:D \tex_let:D \c_group_begin_token {
- \__chk_if_free_cs:N \c_group_end_token
+ \__kernel_chk_if_free_cs:N \c_group_end_token
\tex_global:D \tex_let:D \c_group_end_token }
\char_set_catcode_math_toggle:N \*
\cs_new_eq:NN \c_math_toggle_token *
@@ -1624,7 +1623,7 @@
\cs_new_eq:NN \c_math_superscript_token ^
\char_set_catcode_math_subscript:N \*
\cs_new_eq:NN \c_math_subscript_token *
- \__chk_if_free_cs:N \c_space_token
+ \__kernel_chk_if_free_cs:N \c_space_token
\use:n { \tex_global:D \tex_let:D \c_space_token = ~ } ~
\cs_new_eq:NN \c_catcode_letter_token a
\cs_new_eq:NN \c_catcode_other_token 1
@@ -1860,11 +1859,9 @@
##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \exp_not:N \q_stop
}
{
- \if_int_compare:w \__str_if_eq_x:nn { #2 } { cro } = 0 \exp_stop_f:
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
+ \str_if_eq_x:nnTF { #2 } { cro }
+ { \prg_return_true: }
+ { \prg_return_false: }
}
% \end{macrocode}
% \end{macro}
@@ -1964,7 +1961,7 @@
% function cannot be defined on the fly because tests must remain
% expandable): instead the first argument of the auxiliary (plus the
% delimiter to avoid complications with trailing spaces) is compared
-% using \cs{__str_if_eq_x_return:nn} to the result of applying
+% using \cs{str_if_eq_x:nnTF} to the result of applying
% \cs{token_to_str:N} to a control sequence. Second, the
% \tn{meaning} of primitives such as \tn{dimen} or \tn{dimendef}
% starts in the same way as registers such as
@@ -2012,7 +2009,7 @@
\exp_not:N \prg_return_false:
\exp_not:N \else:
}
- \exp_not:N \__str_if_eq_x_return:nn
+ \exp_not:N \str_if_eq_x:nnTF
{
\exp_not:N \exp_after:wN
\exp_not:c { @@_delimit_by_ #2 :w }
@@ -2020,6 +2017,8 @@
? \tl_to_str:n {#2} \exp_not:N \q_stop
}
{ \exp_not:n {#3} }
+ { \exp_not:N \prg_return_true: }
+ { \exp_not:N \prg_return_false: }
\cs_if_exist:cT { tex_ #2 :D }
{
\exp_not:N \fi:
Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -0,0 +1,238 @@
+% \iffalse meta-comment
+%
+%% File: l3unicode.dtx Copyright (C) 2018 The 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
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{l3unicode} package: Unicode support functions^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team at latex-project.org}
+% {latex-team at latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2018-04-30}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% This module provides Unicode-specific functions along with loading data
+% from a range of Unicode Consortium files. At present, it provides no
+% public functions.
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3unicode} implementation}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=char>
+% \end{macrocode}
+%
+% Case changing both for strings and \enquote{text} requires data from
+% the Unicode Consortium. Some of this is build in to the format (as
+% \tn{lccode} and \tn{uccode} values) but this covers only the simple
+% one-to-one situations and does not fully handle for example case folding.
+%
+% As only the data needs to remain at the end of this process, everything
+% is set up inside a group. The only thing that is outside is creating a
+% stream: they are global anyway and it is best to force a stream for
+% all engines.
+% \begin{macrocode}
+\ior_new:N \g_@@_data_ior
+\bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
+ {
+ \group_begin:
+% \end{macrocode}
+% Set up a private copy of the char-generation primitive.
+% \begin{macrocode}
+ \cs_set_eq:NN \@@_generate:w \utex_char:D
+% \end{macrocode}
+% Parse the main Unicode data file for title case exceptions (the one-to-one
+% lower and upper case mappings it contains are all be covered by the \TeX{}
+% data). There are no comments in the main data file so this can be done using
+% a standard mapping and no checks.
+% \begin{macrocode}
+ \ior_open:Nn \g_@@_data_ior { UnicodeData.txt }
+ \cs_set_protected:Npn \@@_data_auxi:w
+ #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ;
+ { \@@_data_auxii:w #1 ; }
+ \cs_set_protected:Npn \@@_data_auxii:w
+ #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop
+ {
+ \tl_if_blank:nF {#7}
+ {
+ \str_if_eq:nnF {#5} {#7}
+ {
+ \tl_const:cx
+ { c_@@_mixed_case_ \@@_generate:w "#1 _tl }
+ { \@@_generate:w "#7 }
+ }
+ }
+ }
+ \ior_map_inline:Nn \g_@@_data_ior
+ {
+ \tl_if_blank:nF {#1}
+ { \@@_data_auxi:w #1 \q_stop }
+ }
+ \ior_close:N \g_@@_data_ior
+% \end{macrocode}
+% The other data files all use C-style comments so we have to worry about
+% |#| tokens (and reading as strings). The set up for case folding is in two
+% parts. For the basic (core) mappings, folding is the same as lower casing in
+% most positions so only store the differences. For the more complex foldings,
+% always store the result, splitting up the two or three code points in the input
+% as required.
+% \begin{macrocode}
+ \ior_open:Nn \g_@@_data_ior { CaseFolding.txt }
+ \cs_set_protected:Npn \@@_data_auxi:w #1 ;~ #2 ;~ #3 ; #4 \q_stop
+ {
+ \str_if_eq:nnTF {#2} { C }
+ {
+ \int_compare:nNnF
+ { \char_value_lccode:n {"#1} } = {"#3}
+ {
+ \tl_const:cx
+ { c_@@_fold_case_ \@@_generate:w "#1 _tl }
+ { \@@_generate:w "#3 }
+ }
+ }
+ {
+ \str_if_eq:nnT {#2} { F }
+ { \@@_data_auxii:w #1 ~ #3 ~ \q_stop }
+ }
+ }
+ \cs_set_protected:Npn \@@_data_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+ {
+ \tl_const:cx { c_@@_fold_case_ \@@_generate:w "#1 _tl }
+ {
+ \@@_generate:w "#2 \exp_stop_f:
+ \@@_generate:w "#3 \exp_stop_f:
+ \tl_if_blank:nF {#4}
+ { \@@_generate:w "#4 }
+ }
+ }
+ \ior_str_map_inline:Nn \g_@@_data_ior
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \str_if_eq_x:nnF { \tl_head:n {#1} } { \c_hash_str }
+ { \@@_data_auxi:w #1 \q_stop }
+ }
+ }
+ \ior_close:N \g_@@_data_ior
+% \end{macrocode}
+% For upper and lower casing special situations, there is a bit more to
+% do as we also have title casing to consider, plus we need to stop part-way
+% through the file.
+% \begin{macrocode}
+ \ior_open:Nn \g_@@_data_ior { SpecialCasing.txt }
+ \cs_set_protected:Npn \@@_data_auxi:w
+ #1 ;~ #2 ;~ #3 ;~ #4 ; #5 \q_stop
+ {
+ \use:n { \@@_data_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop
+ \use:n { \@@_data_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
+ \str_if_eq:nnF {#3} {#4}
+ { \use:n { \@@_data_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop }
+ }
+ \cs_set_protected:Npn \@@_data_auxii:w
+ #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+ {
+ \tl_if_empty:nF {#4}
+ {
+ \tl_const:cx { c_@@_ #2 _case_ \@@_generate:w "#1 _tl }
+ {
+ \@@_generate:w "#3 \exp_stop_f:
+ \@@_generate:w "#4 \exp_stop_f:
+ \tl_if_blank:nF {#5}
+ { \@@_generate:w "#5 }
+ }
+ }
+ }
+ \ior_str_map_inline:Nn \g_@@_data_ior
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \str_if_eq_x:nnTF { \tl_head:n {#1} } { \c_hash_str }
+ {
+ \str_if_eq_x:nnT
+ {#1}
+ { \c_hash_str \c_space_tl Conditional~Mappings }
+ { \ior_map_break: }
+ }
+ { \@@_data_auxi:w #1 \q_stop }
+ }
+ }
+ \ior_close:N \g_@@_data_ior
+ \group_end:
+ }
+% \end{macrocode}
+% For the $8$-bit engines, the above is skipped but there is still some
+% set up required. As case changing can only be applied to bytes, and
+% they have to be in the ASCII range, we define a series of data stores
+% to represent them, and the data are used such that only these are
+% ever case-changed. We do open and close one file to force allocation of
+% a read: this keeps all engines in line.
+% \begin{macrocode}
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_tmp:NN #1#2
+ {
+ \quark_if_recursion_tail_stop:N #2
+ \tl_const:cn { c_@@_upper_case_ #2 _tl } {#1}
+ \tl_const:cn { c_@@_lower_case_ #1 _tl } {#2}
+ \tl_const:cn { c_@@_fold_case_ #1 _tl } {#2}
+ \@@_tmp:NN
+ }
+ \@@_tmp:NN
+ AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
+ ? \q_recursion_tail \q_recursion_stop
+ \ior_open:Nn \g_@@_data_ior { UnicodeData.txt }
+ \ior_close:N \g_@@_data_ior
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</initex|package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3keys2e.dtx (C) Copyright 2009,2011-2017 The LaTeX3 Project
+%% File: l3keys2e.dtx (C) Copyright 2009,2011-2018 The 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
@@ -60,7 +60,7 @@
% }^^A
% }
%
-% \date{Released 2018/02/21}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -131,7 +131,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2018/02/21}{}
+\ProvidesExplPackage{l3keys2e}{2018-04-30}{}
{LaTeX2e option processing using LaTeX3 keys}
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: xfp.dtx (C) Copyright 2017 The LaTeX3 Project
+%% File: xfp.dtx (C) Copyright 2017-2018 The 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
@@ -62,7 +62,7 @@
% }^^A
% }
%
-% \date{Released 2018/02/21}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -73,8 +73,8 @@
% integer expression interface for convenience.
%
% \begin{function}[EXP]{\fpeval}
-% The expandable command \cs{fpeval} takes as it's argument a floating
-% point expression and will produce a result using the normal rules of
+% The expandable command \cs{fpeval} takes as its argument a floating
+% point expression and produces a result using the normal rules of
% mathematics. As this command is expandable it can be used where \TeX{}
% requires a number and for example within a low-level \cs{edef} operation
% to give a purely numerical result.
@@ -116,15 +116,17 @@
% $\operatorname{round}(x,n,t)$ rounds to the closest value, with
% ties rounded to an even value by default, towards zero if $t=0$,
% towards $+\infty$ if $t>0$ and towards $-\infty$ if $t<0$.
-% \item Random numbers: $\mathop{rand}()$, $\mathop{randint}(m,n)$ (requires
-% \pdfTeX{} or \LuaTeX{}).
+% \item Random numbers: $\mathop{rand}()$, $\mathop{randint}(m,n)$
+% (not available in \XeTeX{}).
% \item Constants: \texttt{pi}, \texttt{deg} (one degree in radians).
% \item Dimensions, automatically expressed in points, \emph{e.g.},
% \texttt{pc} is~$12$.
% \item Automatic conversion (no need for \cs{number}) of
-% integer, dimension, and skip variables to floating points,
+% integer, dimension, and skip variables to floating points numbers,
% expressing dimensions in points and ignoring the stretch and
% shrink components of skips.
+% \item Tuples: $(x_1,\ldots{},x_n)$ that can be added together,
+% multiplied or divided by a floating point number, and nested.
% \end{itemize}
%
% An example of use could be the following.
@@ -159,7 +161,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfp}{2018/02/21}{}
+\ProvidesExplPackage{xfp}{2018-04-30}{}
{L3 Floating point unit}
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: xfrac.dtx Copyright (C) 2004, 2008-2010 Morten Hoegholm
-%% (C) 2011,2012,2014-2017 The LaTeX3 Project
+%% (C) 2011,2012,2014-2018 The 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
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2018/02/21}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -533,7 +533,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2018/02/21}{}
+\ProvidesExplPackage{xfrac}{2018-04-30}{}
{L3 Experimental split-level fractions}
% \end{macrocode}
%
@@ -745,12 +745,12 @@
false =
\cs_set:Npn \@@_relscale:
{
- \__dim_eval:n
+ \dim_eval:n
{ \box_ht:N \l_@@_tmp_box + \box_dp:N \l_@@_tmp_box }
},
true =
\cs_set:Npn \@@_relscale:
- { \box_ht:N \l_@@_slash_box }
+ { \dim_eval:n { \box_ht:N \l_@@_slash_box } }
},
scaling =
{
@@ -759,7 +759,7 @@
\cs_set:Npn \@@_fontscale:
{
\fontsize
- { \fp_use:N \l_@@_scale_factor_fp \@@_relscale: }
+ { \fp_to_dim:n { \l_@@_scale_factor_fp * \@@_relscale: } }
{ \c_zero_dim }
\selectfont
}
@@ -842,7 +842,7 @@
{
\raisebox
{
- \__dim_eval:n
+ \dim_eval:n
{
\box_ht:N \l_@@_slash_box
- \box_dp:N \l_@@_slash_box
@@ -871,7 +871,7 @@
{
\raisebox
{
- \__dim_eval:n
+ \dim_eval:n
{
\box_ht:N \l_@@_slash_box
- \dim_use:N \l_@@_numerator_top_sep_dim
Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -4,7 +4,7 @@
%% David Carlisle
%% (C) Copyright 2004-2008 Frank Mittelbach,
%% The LaTeX3 Project
-%% (C) Copyright 2009-2017 The LaTeX3 Project
+%% (C) Copyright 2009-2018 The 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
@@ -27,8 +27,8 @@
%<*driver|package>
% The version of expl3 required is tested as early as possible, as
% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2018/02/21]
-%<package>\@ifpackagelater{expl3}{2018/02/21}
+\RequirePackage{expl3}[2018-04-12]
+%<package>\@ifpackagelater{expl3}{2018-04-12}
%<package> {}
%<package> {%
%<package> \PackageError{xparse}{Support package l3kernel too old}
@@ -67,7 +67,7 @@
% }^^A
% }
%
-% \date{Released 2018/02/21}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -130,8 +130,6 @@
% Regardless of the input, the argument will be passed to the
% internal code surrounded by a brace pair. This is the \pkg{xparse}
% type specifier for a normal \TeX{} argument.
-% \item[l] An argument which reads everything up to the first
-% begin-group token: in standard \LaTeX{} this is a left brace.
% \item[r] Reads a \enquote{required} delimited argument, where the
% delimiters are given as \meta{char1} and \meta{char2}:
% \texttt{r}\meta{char1}\meta{char2}. If the opening \meta{character}
@@ -140,9 +138,6 @@
% \item[R] As for \texttt{r}, this is a \enquote{required} delimited
% argument but has a user-definable recovery \meta{default}, given
% as \texttt{R}\meta{char1}\meta{char2}\marg{default}.
-% \item[u] Reads an argument \enquote{until} \meta{tokens} are encountered,
-% where the desired \meta{tokens} are given as an argument to the
-% specifier: \texttt{u}\marg{tokens}.
% \item[v] Reads an argument \enquote{verbatim}, between the following
% character and its next occurrence, in a way similar to the argument
% of the \LaTeXe{} command \cs{verb}. Thus a \texttt{v}-type argument
@@ -174,11 +169,6 @@
% \item[t] An optional \meta{char}, which will result in a value
% \cs{BooleanTrue} if \meta{char} is present and \cs{BooleanFalse}
% otherwise. Given as \texttt{t}\meta{char}.
-% \item[g] An optional argument given inside a pair of \TeX{} group
-% tokens (in standard \LaTeX, |{| \ldots |}|), which returns
-% |-NoValue-| if not present.
-% \item[G] As for \texttt{g} but returns \meta{default} if no value
-% is given: \texttt{G}\marg{default}.
% \item[e] A set of optional \emph{embellishments}, each of which
% requires a \emph{value}: \texttt{e}\marg{chars}. If an
% embellishment is not present, |-NoValue-| is returned. Each
@@ -257,6 +247,20 @@
% arguments, but also to \texttt{g} or \texttt{G} type arguments
% followed by \texttt{m} type arguments.
%
+% As \pkg{xparse} is also used to describe interfaces that have appeared
+% in the wider \LaTeXe{} eco-system, it also defines additional argument
+% types, described in Section~\ref{sec:backwards}: the mandatory types
+% \texttt{l} and \texttt{u} and the optional brace group types
+% \texttt{g} and \texttt{G}. Their use is not recommended because it is
+% simpler for a user if all packages use a similar syntax. For the same
+% reason, delimited arguments \texttt{r}, \texttt{R}, \texttt{d} and
+% \texttt{D} should normally use delimiters that are naturally paired,
+% such as |[| and |]| or |(| and |)|, or that are identical, such as |"|
+% and~|"|. A very common syntax is to have one optional argument
+% \texttt{o} treated as a key--value list (using for instance
+% \pkg{l3keys}) followed by some mandatory arguments~\texttt{m} (or
+% \texttt{+m}).
+%
% \subsection{Spacing and optional arguments}
%
% \TeX{} will find the first argument after a function name irrespective
@@ -270,20 +274,31 @@
% \end{verbatim}
% the user input |\foo{arg1}[arg2]{arg3}| and
% \verb*|\foo{arg1} [arg2] {arg3}| will both be parsed in the same
-% way. However, spaces are \emph{not} ignored when parsing optional
-% arguments after the last mandatory argument. Thus with
+% way.
+%
+% The behavior of optional arguments \emph{after} any mandatory arguments is
+% selectable. The standard settings will allow spaces here, and thus
+% with
% \begin{verbatim}
% \NewDocumentCommand \foobar { m o } { ... }
% \end{verbatim}
-% |\foobar{arg1}[arg2]| will find an optional argument but
-% \verb*|\foobar{arg1} [arg2]| will not. This is so that trailing optional
-% arguments are not picked up \enquote{by accident} in input.
+% both |\foobar{arg1}[arg2]| and \verb*|\foobar{arg1} [arg2]| will find an
+% optional argument. This can be changed by giving the modified |!| in
+% the argument specification:
+% \begin{verbatim}
+% \NewDocumentCommand \foobar { m !o } { ... }
+% \end{verbatim}
+% where \verb*|\foobar{arg1} [arg2]| will not find an optional argument.
%
-% There is one major exception to the rules listed above: when
-% \pkg{xparse} is used to define what \TeX\ defines as \enquote{control
-% symbols} in which the function name is made up of a single character,
-% such as \enquote{\cmd{\\}}, spaces are \emph{not} ignored directly
-% after them even for mandatory arguments.
+% There is one subtly here due to the difference in handling by \TeX{}
+% of \enquote{control symbols}, where the command name is made up of a single
+% character, such as \enquote{\cmd{\\}}. Spaces are not ignored by \TeX{}
+% here, and thus it is possible to require an optional argument directly
+% follow such a command. The most common example is the use of \cmd{\\} in
+% \pkg{amsmath} environments. In \pkg{xparse} terms it has signature
+% \begin{verbatim}
+% \DeclareDocumentCommad \\ { !s !o } { ... }
+% \end{verbatim}
%
% \subsection{Required delimited arguments}
%
@@ -761,6 +776,33 @@
% \end{verbatim}
% this may be suppressed and no information messages are produced.
%
+% \section{Backwards Compatibility}
+% \label{sec:backwards}
+%
+% One role of \pkg{xparse} is to describe existing \LaTeX{} interfaces,
+% including some that are rather unusual in \LaTeX{} (as opposed to
+% formats such as plain \TeX{}) such as delimited arguments. As such,
+% the package defines some argument specifiers that should largely be
+% avoided nowadays as using them in packages leads to inconsistent user
+% interfaces. The simplest syntax is often best, with argument
+% specifications such as |mmmm| or |ommmm|, namely an optional argument
+% followed by some standard mandatory ones. The optional argument can
+% be made to support key--value syntax using tools from \pkg{l3keys}.
+%
+% The argument types that are not recommended any longer are:
+% \begin{itemize}[font=\ttfamily]
+% \item[l] A mandatory argument which reads everything up to the first
+% begin-group token: in standard \LaTeX{} this is a left brace.
+% \item[u] Reads a mandatory argument \enquote{until} \meta{tokens} are encountered,
+% where the desired \meta{tokens} are given as an argument to the
+% specifier: \texttt{u}\marg{tokens}.
+% \item[g] An optional argument given inside a pair of \TeX{} group
+% tokens (in standard \LaTeX{}, |{| \ldots |}|), which returns
+% |-NoValue-| if not present.
+% \item[G] As for \texttt{g} but returns \meta{default} if no value
+% is given: \texttt{G}\marg{default}.
+% \end{itemize}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -776,7 +818,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xparse}{2018/02/21}{}
+\ProvidesExplPackage{xparse}{2018-04-30}{}
{L3 Experimental document command parser}
% \end{macrocode}
%
@@ -929,6 +971,13 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_ignore_spaces_bool}
+% For trailing optionals.
+% \begin{macrocode}
+\bool_new:N \l_@@_ignore_spaces_bool
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\l_@@_m_args_int}
% The number of \texttt{m} arguments: if this is the same as the total
% number of arguments, then a short-cut can be taken in the creation of
@@ -1527,6 +1576,7 @@
\bool_set_false:N \l_@@_long_bool
\bool_set_false:N \l_@@_some_long_bool
\bool_set_false:N \l_@@_some_short_bool
+ \bool_set_false:N \l_@@_ignore_spaces_bool
\@@_normalize_arg_spec_loop:n #1
\q_recursion_tail \q_recursion_tail \q_recursion_tail \q_recursion_stop
\int_compare:nNnT \l_@@_current_arg_int > 9
@@ -1615,6 +1665,7 @@
% {
% \@@_normalize_type_>:w,
% \@@_normalize_type_+:w,
+% \@@_normalize_type_!:w,
% }
% Check that these prefixes have arguments, namely that the next token
% is not \cs{q_recursion_tail}, and remember to leave it after the
@@ -1645,6 +1696,13 @@
\int_decr:N \l_@@_current_arg_int
\@@_normalize_arg_spec_loop:n {#1}
}
+\cs_new_protected:cpn { @@_normalize_type_!:w } #1
+ {
+ \quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
+ \tl_put_right:Nn \l_@@_arg_spec_tl { ! }
+ \int_decr:N \l_@@_current_arg_int
+ \@@_normalize_arg_spec_loop:n {#1}
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1793,7 +1851,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_single_char_check:n #1
{
- \exp_args:Nx \tl_if_single_token:nTF { \tl_trim_spaces:n {#1} }
+ \tl_trim_spaces_apply:nN {#1} \tl_if_single_token:nTF
{
\group_begin:
\tex_escapechar:D = 92 \scan_stop:
@@ -1923,6 +1981,7 @@
{
\int_zero:N \l_@@_current_arg_int
\bool_set_false:N \l_@@_long_bool
+ \bool_set_false:N \l_@@_ignore_spaces_bool
\int_zero:N \l_@@_m_args_int
\bool_set_false:N \l_@@_defaults_bool
\tl_clear:N \l_@@_defaults_tl
@@ -1991,6 +2050,19 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_add_type_!:w}
+% Much the same for controlling trailing optional arguments.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_add_type_!:w }
+ {
+ \@@_flush_m_args:
+ \bool_set_true:N \l_@@_ignore_spaces_bool
+ \bool_set_true:N \l_@@_prefixed_bool
+ \@@_prepare_signature_bypass:N
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_add_type_>:w}
% When a processor is found, the processor code is stored. It will be
% used by \cs{@@_args_process:} once arguments are all found. Here,
@@ -2195,12 +2267,15 @@
{
@@_grab_ #1
\bool_if:NT \l_@@_long_bool { _long }
- \int_compare:nNnF \l_@@_mandatory_args_int > 0
- { _trailing }
+ \bool_lazy_and:nnT
+ { \l_@@_ignore_spaces_bool }
+ { \int_compare_p:nNn \l_@@_mandatory_args_int = 0 }
+ { _ignore_spaces }
:w
}
}
\bool_set_false:N \l_@@_long_bool
+ \bool_set_false:N \l_@@_ignore_spaces_bool
\tl_put_right:Nx \l_@@_process_all_tl
{ { \exp_not:o \l_@@_process_one_tl } }
\tl_clear:N \l_@@_process_one_tl
@@ -2498,8 +2573,8 @@
%
% \begin{macro}{\@@_grab_D:w}
% \begin{macro}{\@@_grab_D_long:w}
-% \begin{macro}{\@@_grab_D_trailing:w}
-% \begin{macro}{\@@_grab_D_long_trailing:w}
+% \begin{macro}{\@@_grab_D_ignore_spaces:w}
+% \begin{macro}{\@@_grab_D_long_ignore_spaces:w}
% The generic delimited argument grabber. The auxiliary function does
% a peek test before calling \cs{@@_grab_D_call:Nw}, so that the
% optional nature of the argument works as expected.
@@ -2514,9 +2589,9 @@
\@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected:Npn
{ _ignore_spaces }
}
-\cs_new_protected:Npn \@@_grab_D_trailing:w #1#2#3 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_D_ignore_spaces:w #1#2#3 \@@_run_code:
{ \@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected_nopar:Npn { } }
-\cs_new_protected:Npn \@@_grab_D_long_trailing:w #1#2#3 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_D_long_ignore_spaces:w #1#2#3 \@@_run_code:
{ \@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected:Npn { } }
% \end{macrocode}
% \begin{macro}{\@@_grab_D_aux:NNnNn}
@@ -2668,7 +2743,7 @@
% \begin{macro}
% {
% \@@_grab_E:w, \@@_grab_E_long:w,
-% \@@_grab_E_trailing:w, \@@_grab_E_long_trailing:w
+% \@@_grab_E_ignore_spaces:w, \@@_grab_E_long_ignore_spaces:w
% }
% \begin{macro}{\@@_grab_E:nnNn}
% \begin{macro}{\@@_grab_E_loop:nnN}
@@ -2687,13 +2762,13 @@
\cs_set_protected:Npn
{ _ignore_spaces }
}
-\cs_new_protected:Npn \@@_grab_E_trailing:w #1#2 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_E_ignore_spaces:w #1#2 \@@_run_code:
{
\@@_grab_E:nnNn {#1} {#2}
\cs_set_protected_nopar:Npn
{ }
}
-\cs_new_protected:Npn \@@_grab_E_long_trailing:w #1#2 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_E_long_ignore_spaces:w #1#2 \@@_run_code:
{
\@@_grab_E:nnNn {#1} {#2}
\cs_set_protected:Npn
@@ -2746,11 +2821,11 @@
%
% \begin{macro}{\@@_grab_G:w}
% \begin{macro}{\@@_grab_G_long:w}
-% \begin{macro}{\@@_grab_G_trailing:w}
-% \begin{macro}{\@@_grab_G_long_trailing:w}
+% \begin{macro}{\@@_grab_G_ignore_spaces:w}
+% \begin{macro}{\@@_grab_G_long_ignore_spaces:w}
% \begin{macro}{\@@_grab_G_aux:nNn}
% Optional groups are checked by meaning, so that the same code will
-% work with, for example, Con\TeX{}t-like input.
+% work with, for example, \ConTeXt{}-like input.
% \begin{macrocode}
\cs_new_protected:Npn \@@_grab_G:w #1 \@@_run_code:
{
@@ -2761,9 +2836,9 @@
{
\@@_grab_G_aux:nNn {#1} \cs_set_protected:Npn { _ignore_spaces }
}
-\cs_new_protected:Npn \@@_grab_G_trailing:w #1 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_G_ignore_spaces:w #1 \@@_run_code:
{ \@@_grab_G_aux:nNn {#1} \cs_set_protected_nopar:Npn { } }
-\cs_new_protected:Npn \@@_grab_G_long_trailing:w #1 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_G_long_ignore_spaces:w #1 \@@_run_code:
{ \@@_grab_G_aux:nNn {#1} \cs_set_protected:Npn { } }
\cs_new_protected:Npn \@@_grab_G_aux:nNn #1#2#3
{
@@ -2938,8 +3013,8 @@
%
% \begin{macro}{\@@_grab_t:w}
% \begin{macro}{\@@_grab_t_long:w}
-% \begin{macro}{\@@_grab_t_trailing:w}
-% \begin{macro}{\@@_grab_t_long_trailing:w}
+% \begin{macro}{\@@_grab_t_ignore_spaces:w}
+% \begin{macro}{\@@_grab_t_long_ignore_spaces:w}
% \begin{macro}{\@@_grab_t_aux:NNw}
% Dealing with a token is quite easy. Check the match, remove the
% token if needed and add a flag to the output.
@@ -2947,9 +3022,9 @@
\cs_new_protected:Npn \@@_grab_t:w
{ \@@_grab_t_aux:NNw \peek_meaning_remove_ignore_spaces:NTF }
\cs_new_eq:NN \@@_grab_t_long:w \@@_grab_t:w
-\cs_new_protected:Npn \@@_grab_t_trailing:w
+\cs_new_protected:Npn \@@_grab_t_ignore_spaces:w
{ \@@_grab_t_aux:NNw \peek_meaning_remove:NTF }
-\cs_new_eq:NN \@@_grab_t_long_trailing:w \@@_grab_t_trailing:w
+\cs_new_eq:NN \@@_grab_t_long_ignore_spaces:w \@@_grab_t_ignore_spaces:w
\cs_new_protected:Npn \@@_grab_t_aux:NNw #1#2#3 \@@_run_code:
{
\tl_set:Nn \l_@@_signature_tl {#3}
@@ -3895,7 +3970,7 @@
% local must be closed.
% \begin{macrocode}
\cs_new_protected:Npn \@@_check_definable:nNT #1
- { \exp_args:Nx \@@_check_definable_aux:nN { \tl_trim_spaces:n {#1} } }
+ { \tl_trim_spaces_apply:nN {#1} \@@_check_definable_aux:nN }
\group_begin:
\char_set_catcode_active:n { `? }
\cs_new_protected:Npn \@@_check_definable_aux:nN #1#2
@@ -3998,7 +4073,6 @@
\__kernel_msg_new:nnnn { xparse } { bad-arg-spec }
{ Bad~argument~specification~'#2'~for~command~'#1'. }
{
- \c__msg_coding_error_text_tl
The~argument~specification~provided~was~not~valid:~
one~or~more~mandatory~pieces~of~information~were~missing. \\ \\
LaTeX~will~ignore~this~entire~definition.
@@ -4037,7 +4111,6 @@
ends~with~optional~argument.
}
{
- \c__msg_coding_error_text_tl
Expandable~commands~must~have~a~final~mandatory~argument~
(or~no~arguments~at~all).~You~cannot~have~a~terminal~optional~
argument~with~expandable~commands.
@@ -4045,7 +4118,6 @@
\__kernel_msg_new:nnnn { xparse } { if-boolean }
{ Invalid~use~\iow_char:N\\IfBooleanTF~{#1} }
{
- \c__msg_coding_error_text_tl
The~first~argument~of~\iow_char:N\\IfBoolean(TF/T/F)~must~be~
a~boolean~argument~obtained~from~parsing~'s'~or~'t'~arguments.
}
@@ -4052,7 +4124,6 @@
\__kernel_msg_new:nnnn { xparse } { inconsistent-long }
{ Inconsistent~long~arguments~for~expandable~command~'#1'. }
{
- \c__msg_coding_error_text_tl
The~arguments~for~an~expandable~command~must~not~involve~short~
arguments~after~long~arguments.~You~have~tried~to~mix~the~two~types.
}
@@ -4059,7 +4130,6 @@
\__kernel_msg_new:nnnn { xparse } { invalid-expandable-argument-type }
{ Argument~type~'#2'~not~available~for~expandable~command~'#1'. }
{
- \c__msg_coding_error_text_tl
The~letter~'#2'~does~not~specify~an~argument~type~which~can~be~used~
in~an~expandable~command.
\\ \\
@@ -4071,7 +4141,6 @@
for~expandable~command~'#1'.
}
{
- \c__msg_coding_error_text_tl
The~letter~'#2'~does~not~specify~an~argument~type~which~can~be~used~
in~an~expandable~command~after~an~optional~argument.
\\ \\
@@ -4080,7 +4149,6 @@
\__kernel_msg_new:nnnn { xparse } { loop-in-defaults }
{ Circular~dependency~in~defaults~of~'#1'. }
{
- \c__msg_coding_error_text_tl
The~default~values~of~two~or~more~arguments~of~'#1'~depend~on~each~
other~in~a~way~that~cannot~be~resolved.
}
@@ -4105,7 +4173,6 @@
\__kernel_msg_new:nnnn { xparse } { not-definable }
{ First~argument~of~'#2'~must~be~a~command. }
{
- \c__msg_coding_error_text_tl
The~first~argument~of~'#2'~should~be~the~document~command~that~will~
be~defined.~The~provided~argument~'#1'~is~a~character.~Perhaps~a~
backslash~is~missing?
@@ -4115,7 +4182,6 @@
\__kernel_msg_new:nnnn { xparse } { not-one-token }
{ First~argument~of~'#2'~must~be~a~command. }
{
- \c__msg_coding_error_text_tl
The~first~argument~of~'#2'~should~be~the~document~command~that~will~
be~defined.~The~provided~argument~'#1'~contains~more~than~one~
token.
@@ -4128,7 +4194,6 @@
a~single~character.
}
{
- \c__msg_coding_error_text_tl
The~argument~specification~provided~was~not~valid:~in~a~place~
where~a~single~character~is~required,~LaTeX~found~'#2'. \\ \\
LaTeX~will~ignore~this~entire~definition.
@@ -4136,7 +4201,6 @@
\__kernel_msg_new:nnnn { xparse } { processor-in-expandable }
{ Argument~processor~'>{#2}'~cannot~be~used~for~the~expandable~command~'#1'. }
{
- \c__msg_coding_error_text_tl
The~argument~specification~for~#1~contains~a~processor~function:~
this~is~only~supported~for~standard~robust~commands. \\ \\
LaTeX~will~ignore~this~entire~definition.
@@ -4151,7 +4215,6 @@
\__kernel_msg_new:nnnn { xparse } { too-many-arguments }
{ Too~many~arguments~in~argument~specification~'#2'~of~command~'#1'. }
{
- \c__msg_coding_error_text_tl
The~argument~specification~provided~has~more~than~9~arguments.~
This~cannot~be~implemented. \\ \\
LaTeX~will~ignore~this~entire~definition.
@@ -4159,7 +4222,6 @@
\__kernel_msg_new:nnnn { xparse } { unknown-argument-type }
{ Unknown~argument~type~'#2'~for~the~command~'#1'. }
{
- \c__msg_coding_error_text_tl
The~letter~'#2'~does~not~specify~a~known~argument~type.~
LaTeX~will~ignore~this~entire~definition.
}
Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx 2018-04-30 22:39:09 UTC (rev 47516)
@@ -4,7 +4,7 @@
%% David Carlisle
%% (C) Copyright 2004-2010 Frank Mittelbach,
%% The LaTeX3 Project
-%% (C) Copyright 2011-2017 The LaTeX3 Project
+%% (C) Copyright 2011-2018 The 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
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2018/02/21}
+% \date{Released 2018-04-30}
%
% \maketitle
%
@@ -682,7 +682,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2018/02/21}{}
+\ProvidesExplPackage{xtemplate}{2018-04-30}{}
{L3 Experimental prototype document functions}
% \end{macrocode}
%
@@ -2576,7 +2576,6 @@
\msg_new:nnnn { xtemplate } { argument-number-mismatch }
{ Object~type~'#1'~takes~#2~argument(s). }
{
- \c__msg_coding_error_text_tl
Objects~of~type~'#1'~require~#2~argument(s).\\
You~have~tried~to~make~a~template~for~'#1'~
with~#3~argument(s),~which~is~not~possible:~
@@ -2585,7 +2584,6 @@
\msg_new:nnnn { xtemplate } { bad-number-of-arguments }
{ Bad~number~of~arguments~for~object~type~'#1'. }
{
- \c__msg_coding_error_text_tl
An~object~may~accept~between~0~and~9~arguments.\\
You~asked~to~use~#2~arguments:~this~is~not~supported.
}
@@ -2607,7 +2605,6 @@
\msg_new:nnnn { xtemplate } { choice-no-code }
{ The~choice~'#1'~requires~implementation~details. }
{
- \c__msg_coding_error_text_tl
When~creating~template~code~using~\DeclareTemplateCode,~
each~choice~name~must~have~an~associated~implementation.\\
This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
@@ -2615,7 +2612,6 @@
\msg_new:nnnn { xtemplate } { duplicate-key-interface }
{ Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. }
{
- \c__msg_coding_error_text_tl
Each~key~can~only~have~one~interface~declared~in~a~template.\\
LaTeX~found~two~interfaces~for~'#1'.
}
@@ -2629,7 +2625,6 @@
\msg_new:nnnn { xtemplate } { invalid-keytype }
{ The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
{
- \c__msg_coding_error_text_tl
Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\
\ \ <key>~:~<key-type>\\
LaTeX~could~not~find~a~<key-type>~in~your~input.
@@ -2637,7 +2632,6 @@
\msg_new:nnnn { xtemplate } { key-no-value }
{ The~key~'#1'~has~no~value~\msg_line_context:. }
{
- \c__msg_coding_error_text_tl
When~creating~an~instance~of~a~template~
every~key~listed~must~include~a~value:\\
\ \ <key>~=~<value>
@@ -2645,7 +2639,6 @@
\msg_new:nnnn { xtemplate } { key-no-variable }
{ The~key~'#1'~requires~implementation~details~\msg_line_context:. }
{
- \c__msg_coding_error_text_tl
When~creating~template~code~using~\DeclareTemplateCode,~
each~key~name~must~have~an~associated~implementation.\\
This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
@@ -2653,7 +2646,6 @@
\msg_new:nnnn { xtemplate } { key-not-implemented }
{ Key~'#1'~has~no~implementation~\msg_line_context:. }
{
- \c__msg_coding_error_text_tl
The~definition~of~key~implementations~for~template~'#2'~
of~object~type~'#3'~does~not~include~any~details~for~key~'#1'.\\
The~key~was~declared~in~the~interface~definition,~
@@ -2662,7 +2654,6 @@
\msg_new:nnnn { xtemplate } { missing-keytype }
{ The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
{
- \c__msg_coding_error_text_tl
Key~interface~definitions~should~be~of~the~form\\
\ \ #1~:~<key-type>\\
but~LaTeX~could~not~find~a~<key-type>.
@@ -2673,7 +2664,6 @@
or~has~no~implementation.
}
{
- \c__msg_coding_error_text_tl
There~is~no~code~available~for~the~template~name~given.\\
This~should~be~given~using~\DeclareTemplateCode.
}
@@ -2711,7 +2701,6 @@
\msg_new:nnnn { xtemplate } { unknown-key }
{ Unknown~template~key~'#1'. }
{
- \c__msg_coding_error_text_tl
The~key~'#1'~was~not~declared~in~the~interface~
for~the~current~template.
}
@@ -2718,7 +2707,6 @@
\msg_new:nnnn { xtemplate } { unknown-keytype }
{ The~key-type~'#1'~is~unknown. }
{
- \c__msg_coding_error_text_tl
Valid~key-types~are:\\
-~boolean;\\
-~choice;\\
@@ -2736,7 +2724,6 @@
\msg_new:nnnn { xtemplate } { unknown-object-type }
{ The~object~type~'#1'~is~unknown. }
{
- \c__msg_coding_error_text_tl
An~object~type~needs~to~be~declared~with~\DeclareObjectType
prior~to~using~it.
}
Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex 2018-04-30 17:06:06 UTC (rev 47515)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex 2018-04-30 22:39:09 UTC (rev 47516)
@@ -11,12 +11,12 @@
%% l3expan.dtx (with options: `package')
%% l3tl.dtx (with options: `package')
%% l3str.dtx (with options: `package')
+%% l3quark.dtx (with options: `package')
%% l3seq.dtx (with options: `package')
%% l3int.dtx (with options: `package')
-%% l3intarray.dtx (with options: `package')
%% l3flag.dtx (with options: `package')
-%% l3quark.dtx (with options: `package')
%% l3prg.dtx (with options: `package')
+%% l3sys.dtx (with options: `package')
%% l3clist.dtx (with options: `package')
%% l3token.dtx (with options: `package')
%% l3prop.dtx (with options: `package')
@@ -37,17 +37,17 @@
%% l3fp-trig.dtx (with options: `package')
%% l3fp-convert.dtx (with options: `package')
%% l3fp-random.dtx (with options: `package')
+%% l3intarray.dtx (with options: `package')
%% l3sort.dtx (with options: `package')
-%% l3tl-build.dtx (with options: `package')
%% l3tl-analysis.dtx (with options: `package')
%% l3regex.dtx (with options: `package')
%% l3box.dtx (with options: `package')
%% l3color-base.dtx (with options: `package')
%% l3coffins.dtx (with options: `package')
-%% l3sys.dtx (with options: `package')
+%% l3luatex.dtx (with options: `package,tex')
+%% l3unicode.dtx (with options: `package')
+%% l3candidates.dtx (with options: `package')
%% l3deprecation.dtx (with options: `package')
-%% l3candidates.dtx (with options: `package')
-%% l3luatex.dtx (with options: `package,tex')
%%
%% Copyright (C) 1990-2018 The LaTeX3 Project
%%
@@ -62,7 +62,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project
-\def\ExplFileDate{2018/03/05}%
+\def\ExplFileDate{2018-04-30}%
\begingroup
\def\next{\endgroup}%
\expandafter\ifx\csname PackageError\endcsname\relax
@@ -360,514 +360,520 @@
{
\tex_global:D \tex_let:D #2 #1
}
- \__kernel_primitive:NN \ \tex_space:D
- \__kernel_primitive:NN \/ \tex_italiccorrection:D
- \__kernel_primitive:NN \- \tex_hyphen:D
- \__kernel_primitive:NN \above \tex_above:D
- \__kernel_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D
- \__kernel_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D
- \__kernel_primitive:NN \abovewithdelims \tex_abovewithdelims:D
- \__kernel_primitive:NN \accent \tex_accent:D
- \__kernel_primitive:NN \adjdemerits \tex_adjdemerits:D
- \__kernel_primitive:NN \advance \tex_advance:D
- \__kernel_primitive:NN \afterassignment \tex_afterassignment:D
- \__kernel_primitive:NN \aftergroup \tex_aftergroup:D
- \__kernel_primitive:NN \atop \tex_atop:D
- \__kernel_primitive:NN \atopwithdelims \tex_atopwithdelims:D
- \__kernel_primitive:NN \badness \tex_badness:D
- \__kernel_primitive:NN \baselineskip \tex_baselineskip:D
- \__kernel_primitive:NN \batchmode \tex_batchmode:D
- \__kernel_primitive:NN \begingroup \tex_begingroup:D
- \__kernel_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D
- \__kernel_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D
- \__kernel_primitive:NN \binoppenalty \tex_binoppenalty:D
- \__kernel_primitive:NN \botmark \tex_botmark:D
- \__kernel_primitive:NN \box \tex_box:D
- \__kernel_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D
- \__kernel_primitive:NN \brokenpenalty \tex_brokenpenalty:D
- \__kernel_primitive:NN \catcode \tex_catcode:D
- \__kernel_primitive:NN \char \tex_char:D
- \__kernel_primitive:NN \chardef \tex_chardef:D
- \__kernel_primitive:NN \cleaders \tex_cleaders:D
- \__kernel_primitive:NN \closein \tex_closein:D
- \__kernel_primitive:NN \closeout \tex_closeout:D
- \__kernel_primitive:NN \clubpenalty \tex_clubpenalty:D
- \__kernel_primitive:NN \copy \tex_copy:D
- \__kernel_primitive:NN \count \tex_count:D
- \__kernel_primitive:NN \countdef \tex_countdef:D
- \__kernel_primitive:NN \cr \tex_cr:D
- \__kernel_primitive:NN \crcr \tex_crcr:D
- \__kernel_primitive:NN \csname \tex_csname:D
- \__kernel_primitive:NN \day \tex_day:D
- \__kernel_primitive:NN \deadcycles \tex_deadcycles:D
- \__kernel_primitive:NN \def \tex_def:D
- \__kernel_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D
- \__kernel_primitive:NN \defaultskewchar \tex_defaultskewchar:D
- \__kernel_primitive:NN \delcode \tex_delcode:D
- \__kernel_primitive:NN \delimiter \tex_delimiter:D
- \__kernel_primitive:NN \delimiterfactor \tex_delimiterfactor:D
- \__kernel_primitive:NN \delimitershortfall \tex_delimitershortfall:D
- \__kernel_primitive:NN \dimen \tex_dimen:D
- \__kernel_primitive:NN \dimendef \tex_dimendef:D
- \__kernel_primitive:NN \discretionary \tex_discretionary:D
- \__kernel_primitive:NN \displayindent \tex_displayindent:D
- \__kernel_primitive:NN \displaylimits \tex_displaylimits:D
- \__kernel_primitive:NN \displaystyle \tex_displaystyle:D
- \__kernel_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D
- \__kernel_primitive:NN \displaywidth \tex_displaywidth:D
- \__kernel_primitive:NN \divide \tex_divide:D
- \__kernel_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D
- \__kernel_primitive:NN \dp \tex_dp:D
- \__kernel_primitive:NN \dump \tex_dump:D
- \__kernel_primitive:NN \edef \tex_edef:D
- \__kernel_primitive:NN \else \tex_else:D
- \__kernel_primitive:NN \emergencystretch \tex_emergencystretch:D
- \__kernel_primitive:NN \end \tex_end:D
- \__kernel_primitive:NN \endcsname \tex_endcsname:D
- \__kernel_primitive:NN \endgroup \tex_endgroup:D
- \__kernel_primitive:NN \endinput \tex_endinput:D
- \__kernel_primitive:NN \endlinechar \tex_endlinechar:D
- \__kernel_primitive:NN \eqno \tex_eqno:D
- \__kernel_primitive:NN \errhelp \tex_errhelp:D
- \__kernel_primitive:NN \errmessage \tex_errmessage:D
- \__kernel_primitive:NN \errorcontextlines \tex_errorcontextlines:D
- \__kernel_primitive:NN \errorstopmode \tex_errorstopmode:D
- \__kernel_primitive:NN \escapechar \tex_escapechar:D
- \__kernel_primitive:NN \everycr \tex_everycr:D
- \__kernel_primitive:NN \everydisplay \tex_everydisplay:D
- \__kernel_primitive:NN \everyhbox \tex_everyhbox:D
- \__kernel_primitive:NN \everyjob \tex_everyjob:D
- \__kernel_primitive:NN \everymath \tex_everymath:D
- \__kernel_primitive:NN \everypar \tex_everypar:D
- \__kernel_primitive:NN \everyvbox \tex_everyvbox:D
- \__kernel_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D
- \__kernel_primitive:NN \expandafter \tex_expandafter:D
- \__kernel_primitive:NN \fam \tex_fam:D
- \__kernel_primitive:NN \fi \tex_fi:D
- \__kernel_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D
- \__kernel_primitive:NN \firstmark \tex_firstmark:D
- \__kernel_primitive:NN \floatingpenalty \tex_floatingpenalty:D
- \__kernel_primitive:NN \font \tex_font:D
- \__kernel_primitive:NN \fontdimen \tex_fontdimen:D
- \__kernel_primitive:NN \fontname \tex_fontname:D
- \__kernel_primitive:NN \futurelet \tex_futurelet:D
- \__kernel_primitive:NN \gdef \tex_gdef:D
- \__kernel_primitive:NN \global \tex_global:D
- \__kernel_primitive:NN \globaldefs \tex_globaldefs:D
- \__kernel_primitive:NN \halign \tex_halign:D
- \__kernel_primitive:NN \hangafter \tex_hangafter:D
- \__kernel_primitive:NN \hangindent \tex_hangindent:D
- \__kernel_primitive:NN \hbadness \tex_hbadness:D
- \__kernel_primitive:NN \hbox \tex_hbox:D
- \__kernel_primitive:NN \hfil \tex_hfil:D
- \__kernel_primitive:NN \hfill \tex_hfill:D
- \__kernel_primitive:NN \hfilneg \tex_hfilneg:D
- \__kernel_primitive:NN \hfuzz \tex_hfuzz:D
- \__kernel_primitive:NN \hoffset \tex_hoffset:D
- \__kernel_primitive:NN \holdinginserts \tex_holdinginserts:D
- \__kernel_primitive:NN \hrule \tex_hrule:D
- \__kernel_primitive:NN \hsize \tex_hsize:D
- \__kernel_primitive:NN \hskip \tex_hskip:D
- \__kernel_primitive:NN \hss \tex_hss:D
- \__kernel_primitive:NN \ht \tex_ht:D
- \__kernel_primitive:NN \hyphenation \tex_hyphenation:D
- \__kernel_primitive:NN \hyphenchar \tex_hyphenchar:D
- \__kernel_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D
- \__kernel_primitive:NN \if \tex_if:D
- \__kernel_primitive:NN \ifcase \tex_ifcase:D
- \__kernel_primitive:NN \ifcat \tex_ifcat:D
- \__kernel_primitive:NN \ifdim \tex_ifdim:D
- \__kernel_primitive:NN \ifeof \tex_ifeof:D
- \__kernel_primitive:NN \iffalse \tex_iffalse:D
- \__kernel_primitive:NN \ifhbox \tex_ifhbox:D
- \__kernel_primitive:NN \ifhmode \tex_ifhmode:D
- \__kernel_primitive:NN \ifinner \tex_ifinner:D
- \__kernel_primitive:NN \ifmmode \tex_ifmmode:D
- \__kernel_primitive:NN \ifnum \tex_ifnum:D
- \__kernel_primitive:NN \ifodd \tex_ifodd:D
- \__kernel_primitive:NN \iftrue \tex_iftrue:D
- \__kernel_primitive:NN \ifvbox \tex_ifvbox:D
- \__kernel_primitive:NN \ifvmode \tex_ifvmode:D
- \__kernel_primitive:NN \ifvoid \tex_ifvoid:D
- \__kernel_primitive:NN \ifx \tex_ifx:D
- \__kernel_primitive:NN \ignorespaces \tex_ignorespaces:D
- \__kernel_primitive:NN \immediate \tex_immediate:D
- \__kernel_primitive:NN \indent \tex_indent:D
- \__kernel_primitive:NN \input \tex_input:D
- \__kernel_primitive:NN \inputlineno \tex_inputlineno:D
- \__kernel_primitive:NN \insert \tex_insert:D
- \__kernel_primitive:NN \insertpenalties \tex_insertpenalties:D
- \__kernel_primitive:NN \interlinepenalty \tex_interlinepenalty:D
- \__kernel_primitive:NN \jobname \tex_jobname:D
- \__kernel_primitive:NN \kern \tex_kern:D
- \__kernel_primitive:NN \language \tex_language:D
- \__kernel_primitive:NN \lastbox \tex_lastbox:D
- \__kernel_primitive:NN \lastkern \tex_lastkern:D
- \__kernel_primitive:NN \lastpenalty \tex_lastpenalty:D
- \__kernel_primitive:NN \lastskip \tex_lastskip:D
- \__kernel_primitive:NN \lccode \tex_lccode:D
- \__kernel_primitive:NN \leaders \tex_leaders:D
- \__kernel_primitive:NN \left \tex_left:D
- \__kernel_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D
- \__kernel_primitive:NN \leftskip \tex_leftskip:D
- \__kernel_primitive:NN \leqno \tex_leqno:D
- \__kernel_primitive:NN \let \tex_let:D
- \__kernel_primitive:NN \limits \tex_limits:D
- \__kernel_primitive:NN \linepenalty \tex_linepenalty:D
- \__kernel_primitive:NN \lineskip \tex_lineskip:D
- \__kernel_primitive:NN \lineskiplimit \tex_lineskiplimit:D
- \__kernel_primitive:NN \long \tex_long:D
- \__kernel_primitive:NN \looseness \tex_looseness:D
- \__kernel_primitive:NN \lower \tex_lower:D
- \__kernel_primitive:NN \lowercase \tex_lowercase:D
- \__kernel_primitive:NN \mag \tex_mag:D
- \__kernel_primitive:NN \mark \tex_mark:D
- \__kernel_primitive:NN \mathaccent \tex_mathaccent:D
- \__kernel_primitive:NN \mathbin \tex_mathbin:D
- \__kernel_primitive:NN \mathchar \tex_mathchar:D
- \__kernel_primitive:NN \mathchardef \tex_mathchardef:D
- \__kernel_primitive:NN \mathchoice \tex_mathchoice:D
- \__kernel_primitive:NN \mathclose \tex_mathclose:D
- \__kernel_primitive:NN \mathcode \tex_mathcode:D
- \__kernel_primitive:NN \mathinner \tex_mathinner:D
- \__kernel_primitive:NN \mathop \tex_mathop:D
- \__kernel_primitive:NN \mathopen \tex_mathopen:D
- \__kernel_primitive:NN \mathord \tex_mathord:D
- \__kernel_primitive:NN \mathpunct \tex_mathpunct:D
- \__kernel_primitive:NN \mathrel \tex_mathrel:D
- \__kernel_primitive:NN \mathsurround \tex_mathsurround:D
- \__kernel_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D
- \__kernel_primitive:NN \maxdepth \tex_maxdepth:D
- \__kernel_primitive:NN \meaning \tex_meaning:D
- \__kernel_primitive:NN \medmuskip \tex_medmuskip:D
- \__kernel_primitive:NN \message \tex_message:D
- \__kernel_primitive:NN \mkern \tex_mkern:D
- \__kernel_primitive:NN \month \tex_month:D
- \__kernel_primitive:NN \moveleft \tex_moveleft:D
- \__kernel_primitive:NN \moveright \tex_moveright:D
- \__kernel_primitive:NN \mskip \tex_mskip:D
- \__kernel_primitive:NN \multiply \tex_multiply:D
- \__kernel_primitive:NN \muskip \tex_muskip:D
- \__kernel_primitive:NN \muskipdef \tex_muskipdef:D
- \__kernel_primitive:NN \newlinechar \tex_newlinechar:D
- \__kernel_primitive:NN \noalign \tex_noalign:D
- \__kernel_primitive:NN \noboundary \tex_noboundary:D
- \__kernel_primitive:NN \noexpand \tex_noexpand:D
- \__kernel_primitive:NN \noindent \tex_noindent:D
- \__kernel_primitive:NN \nolimits \tex_nolimits:D
- \__kernel_primitive:NN \nonscript \tex_nonscript:D
- \__kernel_primitive:NN \nonstopmode \tex_nonstopmode:D
- \__kernel_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D
- \__kernel_primitive:NN \nullfont \tex_nullfont:D
- \__kernel_primitive:NN \number \tex_number:D
- \__kernel_primitive:NN \omit \tex_omit:D
- \__kernel_primitive:NN \openin \tex_openin:D
- \__kernel_primitive:NN \openout \tex_openout:D
- \__kernel_primitive:NN \or \tex_or:D
- \__kernel_primitive:NN \outer \tex_outer:D
- \__kernel_primitive:NN \output \tex_output:D
- \__kernel_primitive:NN \outputpenalty \tex_outputpenalty:D
- \__kernel_primitive:NN \over \tex_over:D
- \__kernel_primitive:NN \overfullrule \tex_overfullrule:D
- \__kernel_primitive:NN \overline \tex_overline:D
- \__kernel_primitive:NN \overwithdelims \tex_overwithdelims:D
- \__kernel_primitive:NN \pagedepth \tex_pagedepth:D
- \__kernel_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D
- \__kernel_primitive:NN \pagefillstretch \tex_pagefillstretch:D
- \__kernel_primitive:NN \pagefilstretch \tex_pagefilstretch:D
- \__kernel_primitive:NN \pagegoal \tex_pagegoal:D
- \__kernel_primitive:NN \pageshrink \tex_pageshrink:D
- \__kernel_primitive:NN \pagestretch \tex_pagestretch:D
- \__kernel_primitive:NN \pagetotal \tex_pagetotal:D
- \__kernel_primitive:NN \par \tex_par:D
- \__kernel_primitive:NN \parfillskip \tex_parfillskip:D
- \__kernel_primitive:NN \parindent \tex_parindent:D
- \__kernel_primitive:NN \parshape \tex_parshape:D
- \__kernel_primitive:NN \parskip \tex_parskip:D
- \__kernel_primitive:NN \patterns \tex_patterns:D
- \__kernel_primitive:NN \pausing \tex_pausing:D
- \__kernel_primitive:NN \penalty \tex_penalty:D
- \__kernel_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D
- \__kernel_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D
- \__kernel_primitive:NN \predisplaysize \tex_predisplaysize:D
- \__kernel_primitive:NN \pretolerance \tex_pretolerance:D
- \__kernel_primitive:NN \prevdepth \tex_prevdepth:D
- \__kernel_primitive:NN \prevgraf \tex_prevgraf:D
- \__kernel_primitive:NN \radical \tex_radical:D
- \__kernel_primitive:NN \raise \tex_raise:D
- \__kernel_primitive:NN \read \tex_read:D
- \__kernel_primitive:NN \relax \tex_relax:D
- \__kernel_primitive:NN \relpenalty \tex_relpenalty:D
- \__kernel_primitive:NN \right \tex_right:D
- \__kernel_primitive:NN \righthyphenmin \tex_righthyphenmin:D
- \__kernel_primitive:NN \rightskip \tex_rightskip:D
- \__kernel_primitive:NN \romannumeral \tex_romannumeral:D
- \__kernel_primitive:NN \scriptfont \tex_scriptfont:D
- \__kernel_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D
- \__kernel_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D
- \__kernel_primitive:NN \scriptspace \tex_scriptspace:D
- \__kernel_primitive:NN \scriptstyle \tex_scriptstyle:D
- \__kernel_primitive:NN \scrollmode \tex_scrollmode:D
- \__kernel_primitive:NN \setbox \tex_setbox:D
- \__kernel_primitive:NN \setlanguage \tex_setlanguage:D
- \__kernel_primitive:NN \sfcode \tex_sfcode:D
- \__kernel_primitive:NN \shipout \tex_shipout:D
- \__kernel_primitive:NN \show \tex_show:D
- \__kernel_primitive:NN \showbox \tex_showbox:D
- \__kernel_primitive:NN \showboxbreadth \tex_showboxbreadth:D
- \__kernel_primitive:NN \showboxdepth \tex_showboxdepth:D
- \__kernel_primitive:NN \showlists \tex_showlists:D
- \__kernel_primitive:NN \showthe \tex_showthe:D
- \__kernel_primitive:NN \skewchar \tex_skewchar:D
- \__kernel_primitive:NN \skip \tex_skip:D
- \__kernel_primitive:NN \skipdef \tex_skipdef:D
- \__kernel_primitive:NN \spacefactor \tex_spacefactor:D
- \__kernel_primitive:NN \spaceskip \tex_spaceskip:D
- \__kernel_primitive:NN \span \tex_span:D
- \__kernel_primitive:NN \special \tex_special:D
- \__kernel_primitive:NN \splitbotmark \tex_splitbotmark:D
- \__kernel_primitive:NN \splitfirstmark \tex_splitfirstmark:D
- \__kernel_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D
- \__kernel_primitive:NN \splittopskip \tex_splittopskip:D
- \__kernel_primitive:NN \string \tex_string:D
- \__kernel_primitive:NN \tabskip \tex_tabskip:D
- \__kernel_primitive:NN \textfont \tex_textfont:D
- \__kernel_primitive:NN \textstyle \tex_textstyle:D
- \__kernel_primitive:NN \the \tex_the:D
- \__kernel_primitive:NN \thickmuskip \tex_thickmuskip:D
- \__kernel_primitive:NN \thinmuskip \tex_thinmuskip:D
- \__kernel_primitive:NN \time \tex_time:D
- \__kernel_primitive:NN \toks \tex_toks:D
- \__kernel_primitive:NN \toksdef \tex_toksdef:D
- \__kernel_primitive:NN \tolerance \tex_tolerance:D
- \__kernel_primitive:NN \topmark \tex_topmark:D
- \__kernel_primitive:NN \topskip \tex_topskip:D
- \__kernel_primitive:NN \tracingcommands \tex_tracingcommands:D
- \__kernel_primitive:NN \tracinglostchars \tex_tracinglostchars:D
- \__kernel_primitive:NN \tracingmacros \tex_tracingmacros:D
- \__kernel_primitive:NN \tracingonline \tex_tracingonline:D
- \__kernel_primitive:NN \tracingoutput \tex_tracingoutput:D
- \__kernel_primitive:NN \tracingpages \tex_tracingpages:D
- \__kernel_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D
- \__kernel_primitive:NN \tracingrestores \tex_tracingrestores:D
- \__kernel_primitive:NN \tracingstats \tex_tracingstats:D
- \__kernel_primitive:NN \uccode \tex_uccode:D
- \__kernel_primitive:NN \uchyph \tex_uchyph:D
- \__kernel_primitive:NN \underline \tex_underline:D
- \__kernel_primitive:NN \unhbox \tex_unhbox:D
- \__kernel_primitive:NN \unhcopy \tex_unhcopy:D
- \__kernel_primitive:NN \unkern \tex_unkern:D
- \__kernel_primitive:NN \unpenalty \tex_unpenalty:D
- \__kernel_primitive:NN \unskip \tex_unskip:D
- \__kernel_primitive:NN \unvbox \tex_unvbox:D
- \__kernel_primitive:NN \unvcopy \tex_unvcopy:D
- \__kernel_primitive:NN \uppercase \tex_uppercase:D
- \__kernel_primitive:NN \vadjust \tex_vadjust:D
- \__kernel_primitive:NN \valign \tex_valign:D
- \__kernel_primitive:NN \vbadness \tex_vbadness:D
- \__kernel_primitive:NN \vbox \tex_vbox:D
- \__kernel_primitive:NN \vcenter \tex_vcenter:D
- \__kernel_primitive:NN \vfil \tex_vfil:D
- \__kernel_primitive:NN \vfill \tex_vfill:D
- \__kernel_primitive:NN \vfilneg \tex_vfilneg:D
- \__kernel_primitive:NN \vfuzz \tex_vfuzz:D
- \__kernel_primitive:NN \voffset \tex_voffset:D
- \__kernel_primitive:NN \vrule \tex_vrule:D
- \__kernel_primitive:NN \vsize \tex_vsize:D
- \__kernel_primitive:NN \vskip \tex_vskip:D
- \__kernel_primitive:NN \vsplit \tex_vsplit:D
- \__kernel_primitive:NN \vss \tex_vss:D
- \__kernel_primitive:NN \vtop \tex_vtop:D
- \__kernel_primitive:NN \wd \tex_wd:D
- \__kernel_primitive:NN \widowpenalty \tex_widowpenalty:D
- \__kernel_primitive:NN \write \tex_write:D
- \__kernel_primitive:NN \xdef \tex_xdef:D
- \__kernel_primitive:NN \xleaders \tex_xleaders:D
- \__kernel_primitive:NN \xspaceskip \tex_xspaceskip:D
- \__kernel_primitive:NN \year \tex_year:D
- \__kernel_primitive:NN \beginL \etex_beginL:D
- \__kernel_primitive:NN \beginR \etex_beginR:D
- \__kernel_primitive:NN \botmarks \etex_botmarks:D
- \__kernel_primitive:NN \clubpenalties \etex_clubpenalties:D
- \__kernel_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
- \__kernel_primitive:NN \currentgrouptype \etex_currentgrouptype:D
- \__kernel_primitive:NN \currentifbranch \etex_currentifbranch:D
- \__kernel_primitive:NN \currentiflevel \etex_currentiflevel:D
- \__kernel_primitive:NN \currentiftype \etex_currentiftype:D
- \__kernel_primitive:NN \detokenize \etex_detokenize:D
- \__kernel_primitive:NN \dimexpr \etex_dimexpr:D
- \__kernel_primitive:NN \displaywidowpenalties \etex_displaywidowpenalties:D
- \__kernel_primitive:NN \endL \etex_endL:D
- \__kernel_primitive:NN \endR \etex_endR:D
- \__kernel_primitive:NN \eTeXrevision \etex_eTeXrevision:D
- \__kernel_primitive:NN \eTeXversion \etex_eTeXversion:D
- \__kernel_primitive:NN \everyeof \etex_everyeof:D
- \__kernel_primitive:NN \firstmarks \etex_firstmarks:D
- \__kernel_primitive:NN \fontchardp \etex_fontchardp:D
- \__kernel_primitive:NN \fontcharht \etex_fontcharht:D
- \__kernel_primitive:NN \fontcharic \etex_fontcharic:D
- \__kernel_primitive:NN \fontcharwd \etex_fontcharwd:D
- \__kernel_primitive:NN \glueexpr \etex_glueexpr:D
- \__kernel_primitive:NN \glueshrink \etex_glueshrink:D
- \__kernel_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
- \__kernel_primitive:NN \gluestretch \etex_gluestretch:D
- \__kernel_primitive:NN \gluestretchorder \etex_gluestretchorder:D
- \__kernel_primitive:NN \gluetomu \etex_gluetomu:D
- \__kernel_primitive:NN \ifcsname \etex_ifcsname:D
- \__kernel_primitive:NN \ifdefined \etex_ifdefined:D
- \__kernel_primitive:NN \iffontchar \etex_iffontchar:D
- \__kernel_primitive:NN \interactionmode \etex_interactionmode:D
- \__kernel_primitive:NN \interlinepenalties \etex_interlinepenalties:D
- \__kernel_primitive:NN \lastlinefit \etex_lastlinefit:D
- \__kernel_primitive:NN \lastnodetype \etex_lastnodetype:D
- \__kernel_primitive:NN \marks \etex_marks:D
- \__kernel_primitive:NN \middle \etex_middle:D
- \__kernel_primitive:NN \muexpr \etex_muexpr:D
- \__kernel_primitive:NN \mutoglue \etex_mutoglue:D
- \__kernel_primitive:NN \numexpr \etex_numexpr:D
- \__kernel_primitive:NN \pagediscards \etex_pagediscards:D
- \__kernel_primitive:NN \parshapedimen \etex_parshapedimen:D
- \__kernel_primitive:NN \parshapeindent \etex_parshapeindent:D
- \__kernel_primitive:NN \parshapelength \etex_parshapelength:D
- \__kernel_primitive:NN \predisplaydirection \etex_predisplaydirection:D
- \__kernel_primitive:NN \protected \etex_protected:D
- \__kernel_primitive:NN \readline \etex_readline:D
- \__kernel_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
- \__kernel_primitive:NN \savingvdiscards \etex_savingvdiscards:D
- \__kernel_primitive:NN \scantokens \etex_scantokens:D
- \__kernel_primitive:NN \showgroups \etex_showgroups:D
- \__kernel_primitive:NN \showifs \etex_showifs:D
- \__kernel_primitive:NN \showtokens \etex_showtokens:D
- \__kernel_primitive:NN \splitbotmarks \etex_splitbotmarks:D
- \__kernel_primitive:NN \splitdiscards \etex_splitdiscards:D
- \__kernel_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
- \__kernel_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
- \__kernel_primitive:NN \topmarks \etex_topmarks:D
- \__kernel_primitive:NN \tracingassigns \etex_tracingassigns:D
- \__kernel_primitive:NN \tracinggroups \etex_tracinggroups:D
- \__kernel_primitive:NN \tracingifs \etex_tracingifs:D
- \__kernel_primitive:NN \tracingnesting \etex_tracingnesting:D
- \__kernel_primitive:NN \tracingscantokens \etex_tracingscantokens:D
- \__kernel_primitive:NN \unexpanded \etex_unexpanded:D
- \__kernel_primitive:NN \unless \etex_unless:D
- \__kernel_primitive:NN \widowpenalties \etex_widowpenalties:D
- \__kernel_primitive:NN \pdfannot \pdftex_pdfannot:D
- \__kernel_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
- \__kernel_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
- \__kernel_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
- \__kernel_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
- \__kernel_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
- \__kernel_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
- \__kernel_primitive:NN \pdfdest \pdftex_pdfdest:D
- \__kernel_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
- \__kernel_primitive:NN \pdfendlink \pdftex_pdfendlink:D
- \__kernel_primitive:NN \pdfendthread \pdftex_pdfendthread:D
- \__kernel_primitive:NN \pdffontattr \pdftex_pdffontattr:D
- \__kernel_primitive:NN \pdffontname \pdftex_pdffontname:D
- \__kernel_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
- \__kernel_primitive:NN \pdfgamma \pdftex_pdfgamma:D
- \__kernel_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
- \__kernel_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
- \__kernel_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
- \__kernel_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
- \__kernel_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
- \__kernel_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
- \__kernel_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
- \__kernel_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
- \__kernel_primitive:NN \pdfinclusioncopyfonts \pdftex_pdfinclusioncopyfonts:D
- \__kernel_primitive:NN \pdfinclusionerrorlevel \pdftex_pdfinclusionerrorlevel:D
- \__kernel_primitive:NN \pdfinfo \pdftex_pdfinfo:D
- \__kernel_primitive:NN \pdflastannot \pdftex_pdflastannot:D
- \__kernel_primitive:NN \pdflastlink \pdftex_pdflastlink:D
- \__kernel_primitive:NN \pdflastobj \pdftex_pdflastobj:D
- \__kernel_primitive:NN \pdflastxform \pdftex_pdflastxform:D
- \__kernel_primitive:NN \pdflastximage \pdftex_pdflastximage:D
- \__kernel_primitive:NN \pdflastximagecolordepth \pdftex_pdflastximagecolordepth:D
- \__kernel_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
- \__kernel_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
- \__kernel_primitive:NN \pdfliteral \pdftex_pdfliteral:D
- \__kernel_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
- \__kernel_primitive:NN \pdfnames \pdftex_pdfnames:D
- \__kernel_primitive:NN \pdfobj \pdftex_pdfobj:D
- \__kernel_primitive:NN \pdfobjcompresslevel \pdftex_pdfobjcompresslevel:D
- \__kernel_primitive:NN \pdfoutline \pdftex_pdfoutline:D
- \__kernel_primitive:NN \pdfoutput \pdftex_pdfoutput:D
- \__kernel_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
- \__kernel_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
- \__kernel_primitive:NN \pdfpageref \pdftex_pdfpageref:D
- \__kernel_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
- \__kernel_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
- \__kernel_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
- \__kernel_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
- \__kernel_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
- \__kernel_primitive:NN \pdfrestore \pdftex_pdfrestore:D
- \__kernel_primitive:NN \pdfretval \pdftex_pdfretval:D
- \__kernel_primitive:NN \pdfsave \pdftex_pdfsave:D
- \__kernel_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
- \__kernel_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
- \__kernel_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
- \__kernel_primitive:NN \pdfsuppressptexinfo \pdftex_pdfsuppressptexinfo:D
- \__kernel_primitive:NN \pdfthread \pdftex_pdfthread:D
- \__kernel_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
- \__kernel_primitive:NN \pdftrailer \pdftex_pdftrailer:D
- \__kernel_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
- \__kernel_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
- \__kernel_primitive:NN \pdfxform \pdftex_pdfxform:D
- \__kernel_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
- \__kernel_primitive:NN \pdfxformname \pdftex_pdfxformname:D
- \__kernel_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
- \__kernel_primitive:NN \pdfximage \pdftex_pdfximage:D
- \__kernel_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
- \__kernel_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
- \__kernel_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
- \__kernel_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
- \__kernel_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
- \__kernel_primitive:NN \pdfcopyfont \pdftex_copyfont:D
- \__kernel_primitive:NN \pdfdraftmode \pdftex_draftmode:D
- \__kernel_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
- \__kernel_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
- \__kernel_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
- \__kernel_primitive:NN \pdffilesize \pdftex_filesize:D
- \__kernel_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D
- \__kernel_primitive:NN \pdffontexpand \pdftex_fontexpand:D
- \__kernel_primitive:NN \pdffontsize \pdftex_fontsize:D
- \__kernel_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
- \__kernel_primitive:NN \pdfinsertht \pdftex_insertht:D
- \__kernel_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
- \__kernel_primitive:NN \pdflastxpos \pdftex_lastxpos:D
- \__kernel_primitive:NN \pdflastypos \pdftex_lastypos:D
- \__kernel_primitive:NN \pdfmapfile \pdftex_mapfile:D
- \__kernel_primitive:NN \pdfmapline \pdftex_mapline:D
- \__kernel_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
- \__kernel_primitive:NN \pdfnoligatures \pdftex_noligatures:D
- \__kernel_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
- \__kernel_primitive:NN \pdfpageheight \pdftex_pageheight:D
- \__kernel_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
- \__kernel_primitive:NN \pdfpkmode \pdftex_pkmode:D
- \__kernel_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
- \__kernel_primitive:NN \pdfprimitive \pdftex_primitive:D
- \__kernel_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
- \__kernel_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
- \__kernel_primitive:NN \pdfrandomseed \pdftex_randomseed:D
- \__kernel_primitive:NN \pdfsavepos \pdftex_savepos:D
- \__kernel_primitive:NN \pdfstrcmp \pdftex_strcmp:D
- \__kernel_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
- \__kernel_primitive:NN \pdfshellescape \pdftex_shellescape:D
- \__kernel_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
- \__kernel_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
- \__kernel_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
- \__kernel_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
- \__kernel_primitive:NN \pdftexversion \pdftex_pdftexversion:D
- \__kernel_primitive:NN \efcode \pdftex_efcode:D
- \__kernel_primitive:NN \ifincsname \pdftex_ifincsname:D
- \__kernel_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
- \__kernel_primitive:NN \letterspacefont \pdftex_letterspacefont:D
- \__kernel_primitive:NN \lpcode \pdftex_lpcode:D
- \__kernel_primitive:NN \quitvmode \pdftex_quitvmode:D
- \__kernel_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
- \__kernel_primitive:NN \rpcode \pdftex_rpcode:D
- \__kernel_primitive:NN \synctex \pdftex_synctex:D
- \__kernel_primitive:NN \tagcode \pdftex_tagcode:D
+ \__kernel_primitive:NN \ \tex_space:D
+ \__kernel_primitive:NN \/ \tex_italiccorrection:D
+ \__kernel_primitive:NN \- \tex_hyphen:D
+ \__kernel_primitive:NN \above \tex_above:D
+ \__kernel_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D
+ \__kernel_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D
+ \__kernel_primitive:NN \abovewithdelims \tex_abovewithdelims:D
+ \__kernel_primitive:NN \accent \tex_accent:D
+ \__kernel_primitive:NN \adjdemerits \tex_adjdemerits:D
+ \__kernel_primitive:NN \advance \tex_advance:D
+ \__kernel_primitive:NN \afterassignment \tex_afterassignment:D
+ \__kernel_primitive:NN \aftergroup \tex_aftergroup:D
+ \__kernel_primitive:NN \atop \tex_atop:D
+ \__kernel_primitive:NN \atopwithdelims \tex_atopwithdelims:D
+ \__kernel_primitive:NN \badness \tex_badness:D
+ \__kernel_primitive:NN \baselineskip \tex_baselineskip:D
+ \__kernel_primitive:NN \batchmode \tex_batchmode:D
+ \__kernel_primitive:NN \begingroup \tex_begingroup:D
+ \__kernel_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D
+ \__kernel_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D
+ \__kernel_primitive:NN \binoppenalty \tex_binoppenalty:D
+ \__kernel_primitive:NN \botmark \tex_botmark:D
+ \__kernel_primitive:NN \box \tex_box:D
+ \__kernel_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D
+ \__kernel_primitive:NN \brokenpenalty \tex_brokenpenalty:D
+ \__kernel_primitive:NN \catcode \tex_catcode:D
+ \__kernel_primitive:NN \char \tex_char:D
+ \__kernel_primitive:NN \chardef \tex_chardef:D
+ \__kernel_primitive:NN \cleaders \tex_cleaders:D
+ \__kernel_primitive:NN \closein \tex_closein:D
+ \__kernel_primitive:NN \closeout \tex_closeout:D
+ \__kernel_primitive:NN \clubpenalty \tex_clubpenalty:D
+ \__kernel_primitive:NN \copy \tex_copy:D
+ \__kernel_primitive:NN \count \tex_count:D
+ \__kernel_primitive:NN \countdef \tex_countdef:D
+ \__kernel_primitive:NN \cr \tex_cr:D
+ \__kernel_primitive:NN \crcr \tex_crcr:D
+ \__kernel_primitive:NN \csname \tex_csname:D
+ \__kernel_primitive:NN \day \tex_day:D
+ \__kernel_primitive:NN \deadcycles \tex_deadcycles:D
+ \__kernel_primitive:NN \def \tex_def:D
+ \__kernel_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D
+ \__kernel_primitive:NN \defaultskewchar \tex_defaultskewchar:D
+ \__kernel_primitive:NN \delcode \tex_delcode:D
+ \__kernel_primitive:NN \delimiter \tex_delimiter:D
+ \__kernel_primitive:NN \delimiterfactor \tex_delimiterfactor:D
+ \__kernel_primitive:NN \delimitershortfall \tex_delimitershortfall:D
+ \__kernel_primitive:NN \dimen \tex_dimen:D
+ \__kernel_primitive:NN \dimendef \tex_dimendef:D
+ \__kernel_primitive:NN \discretionary \tex_discretionary:D
+ \__kernel_primitive:NN \displayindent \tex_displayindent:D
+ \__kernel_primitive:NN \displaylimits \tex_displaylimits:D
+ \__kernel_primitive:NN \displaystyle \tex_displaystyle:D
+ \__kernel_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D
+ \__kernel_primitive:NN \displaywidth \tex_displaywidth:D
+ \__kernel_primitive:NN \divide \tex_divide:D
+ \__kernel_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D
+ \__kernel_primitive:NN \dp \tex_dp:D
+ \__kernel_primitive:NN \dump \tex_dump:D
+ \__kernel_primitive:NN \edef \tex_edef:D
+ \__kernel_primitive:NN \else \tex_else:D
+ \__kernel_primitive:NN \emergencystretch \tex_emergencystretch:D
+ \__kernel_primitive:NN \end \tex_end:D
+ \__kernel_primitive:NN \endcsname \tex_endcsname:D
+ \__kernel_primitive:NN \endgroup \tex_endgroup:D
+ \__kernel_primitive:NN \endinput \tex_endinput:D
+ \__kernel_primitive:NN \endlinechar \tex_endlinechar:D
+ \__kernel_primitive:NN \eqno \tex_eqno:D
+ \__kernel_primitive:NN \errhelp \tex_errhelp:D
+ \__kernel_primitive:NN \errmessage \tex_errmessage:D
+ \__kernel_primitive:NN \errorcontextlines \tex_errorcontextlines:D
+ \__kernel_primitive:NN \errorstopmode \tex_errorstopmode:D
+ \__kernel_primitive:NN \escapechar \tex_escapechar:D
+ \__kernel_primitive:NN \everycr \tex_everycr:D
+ \__kernel_primitive:NN \everydisplay \tex_everydisplay:D
+ \__kernel_primitive:NN \everyhbox \tex_everyhbox:D
+ \__kernel_primitive:NN \everyjob \tex_everyjob:D
+ \__kernel_primitive:NN \everymath \tex_everymath:D
+ \__kernel_primitive:NN \everypar \tex_everypar:D
+ \__kernel_primitive:NN \everyvbox \tex_everyvbox:D
+ \__kernel_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D
+ \__kernel_primitive:NN \expandafter \tex_expandafter:D
+ \__kernel_primitive:NN \fam \tex_fam:D
+ \__kernel_primitive:NN \fi \tex_fi:D
+ \__kernel_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D
+ \__kernel_primitive:NN \firstmark \tex_firstmark:D
+ \__kernel_primitive:NN \floatingpenalty \tex_floatingpenalty:D
+ \__kernel_primitive:NN \font \tex_font:D
+ \__kernel_primitive:NN \fontdimen \tex_fontdimen:D
+ \__kernel_primitive:NN \fontname \tex_fontname:D
+ \__kernel_primitive:NN \futurelet \tex_futurelet:D
+ \__kernel_primitive:NN \gdef \tex_gdef:D
+ \__kernel_primitive:NN \global \tex_global:D
+ \__kernel_primitive:NN \globaldefs \tex_globaldefs:D
+ \__kernel_primitive:NN \halign \tex_halign:D
+ \__kernel_primitive:NN \hangafter \tex_hangafter:D
+ \__kernel_primitive:NN \hangindent \tex_hangindent:D
+ \__kernel_primitive:NN \hbadness \tex_hbadness:D
+ \__kernel_primitive:NN \hbox \tex_hbox:D
+ \__kernel_primitive:NN \hfil \tex_hfil:D
+ \__kernel_primitive:NN \hfill \tex_hfill:D
+ \__kernel_primitive:NN \hfilneg \tex_hfilneg:D
+ \__kernel_primitive:NN \hfuzz \tex_hfuzz:D
+ \__kernel_primitive:NN \hoffset \tex_hoffset:D
+ \__kernel_primitive:NN \holdinginserts \tex_holdinginserts:D
+ \__kernel_primitive:NN \hrule \tex_hrule:D
+ \__kernel_primitive:NN \hsize \tex_hsize:D
+ \__kernel_primitive:NN \hskip \tex_hskip:D
+ \__kernel_primitive:NN \hss \tex_hss:D
+ \__kernel_primitive:NN \ht \tex_ht:D
+ \__kernel_primitive:NN \hyphenation \tex_hyphenation:D
+ \__kernel_primitive:NN \hyphenchar \tex_hyphenchar:D
+ \__kernel_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D
+ \__kernel_primitive:NN \if \tex_if:D
+ \__kernel_primitive:NN \ifcase \tex_ifcase:D
+ \__kernel_primitive:NN \ifcat \tex_ifcat:D
+ \__kernel_primitive:NN \ifdim \tex_ifdim:D
+ \__kernel_primitive:NN \ifeof \tex_ifeof:D
+ \__kernel_primitive:NN \iffalse \tex_iffalse:D
+ \__kernel_primitive:NN \ifhbox \tex_ifhbox:D
+ \__kernel_primitive:NN \ifhmode \tex_ifhmode:D
+ \__kernel_primitive:NN \ifinner \tex_ifinner:D
+ \__kernel_primitive:NN \ifmmode \tex_ifmmode:D
+ \__kernel_primitive:NN \ifnum \tex_ifnum:D
+ \__kernel_primitive:NN \ifodd \tex_ifodd:D
+ \__kernel_primitive:NN \iftrue \tex_iftrue:D
+ \__kernel_primitive:NN \ifvbox \tex_ifvbox:D
+ \__kernel_primitive:NN \ifvmode \tex_ifvmode:D
+ \__kernel_primitive:NN \ifvoid \tex_ifvoid:D
+ \__kernel_primitive:NN \ifx \tex_ifx:D
+ \__kernel_primitive:NN \ignorespaces \tex_ignorespaces:D
+ \__kernel_primitive:NN \immediate \tex_immediate:D
+ \__kernel_primitive:NN \indent \tex_indent:D
+ \__kernel_primitive:NN \input \tex_input:D
+ \__kernel_primitive:NN \inputlineno \tex_inputlineno:D
+ \__kernel_primitive:NN \insert \tex_insert:D
+ \__kernel_primitive:NN \insertpenalties \tex_insertpenalties:D
+ \__kernel_primitive:NN \interlinepenalty \tex_interlinepenalty:D
+ \__kernel_primitive:NN \jobname \tex_jobname:D
+ \__kernel_primitive:NN \kern \tex_kern:D
+ \__kernel_primitive:NN \language \tex_language:D
+ \__kernel_primitive:NN \lastbox \tex_lastbox:D
+ \__kernel_primitive:NN \lastkern \tex_lastkern:D
+ \__kernel_primitive:NN \lastpenalty \tex_lastpenalty:D
+ \__kernel_primitive:NN \lastskip \tex_lastskip:D
+ \__kernel_primitive:NN \lccode \tex_lccode:D
+ \__kernel_primitive:NN \leaders \tex_leaders:D
+ \__kernel_primitive:NN \left \tex_left:D
+ \__kernel_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D
+ \__kernel_primitive:NN \leftskip \tex_leftskip:D
+ \__kernel_primitive:NN \leqno \tex_leqno:D
+ \__kernel_primitive:NN \let \tex_let:D
+ \__kernel_primitive:NN \limits \tex_limits:D
+ \__kernel_primitive:NN \linepenalty \tex_linepenalty:D
+ \__kernel_primitive:NN \lineskip \tex_lineskip:D
+ \__kernel_primitive:NN \lineskiplimit \tex_lineskiplimit:D
+ \__kernel_primitive:NN \long \tex_long:D
+ \__kernel_primitive:NN \looseness \tex_looseness:D
+ \__kernel_primitive:NN \lower \tex_lower:D
+ \__kernel_primitive:NN \lowercase \tex_lowercase:D
+ \__kernel_primitive:NN \mag \tex_mag:D
+ \__kernel_primitive:NN \mark \tex_mark:D
+ \__kernel_primitive:NN \mathaccent \tex_mathaccent:D
+ \__kernel_primitive:NN \mathbin \tex_mathbin:D
+ \__kernel_primitive:NN \mathchar \tex_mathchar:D
+ \__kernel_primitive:NN \mathchardef \tex_mathchardef:D
+ \__kernel_primitive:NN \mathchoice \tex_mathchoice:D
+ \__kernel_primitive:NN \mathclose \tex_mathclose:D
+ \__kernel_primitive:NN \mathcode \tex_mathcode:D
+ \__kernel_primitive:NN \mathinner \tex_mathinner:D
+ \__kernel_primitive:NN \mathop \tex_mathop:D
+ \__kernel_primitive:NN \mathopen \tex_mathopen:D
+ \__kernel_primitive:NN \mathord \tex_mathord:D
+ \__kernel_primitive:NN \mathpunct \tex_mathpunct:D
+ \__kernel_primitive:NN \mathrel \tex_mathrel:D
+ \__kernel_primitive:NN \mathsurround \tex_mathsurround:D
+ \__kernel_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D
+ \__kernel_primitive:NN \maxdepth \tex_maxdepth:D
+ \__kernel_primitive:NN \meaning \tex_meaning:D
+ \__kernel_primitive:NN \medmuskip \tex_medmuskip:D
+ \__kernel_primitive:NN \message \tex_message:D
+ \__kernel_primitive:NN \mkern \tex_mkern:D
+ \__kernel_primitive:NN \month \tex_month:D
+ \__kernel_primitive:NN \moveleft \tex_moveleft:D
+ \__kernel_primitive:NN \moveright \tex_moveright:D
+ \__kernel_primitive:NN \mskip \tex_mskip:D
+ \__kernel_primitive:NN \multiply \tex_multiply:D
+ \__kernel_primitive:NN \muskip \tex_muskip:D
+ \__kernel_primitive:NN \muskipdef \tex_muskipdef:D
+ \__kernel_primitive:NN \newlinechar \tex_newlinechar:D
+ \__kernel_primitive:NN \noalign \tex_noalign:D
+ \__kernel_primitive:NN \noboundary \tex_noboundary:D
+ \__kernel_primitive:NN \noexpand \tex_noexpand:D
+ \__kernel_primitive:NN \noindent \tex_noindent:D
+ \__kernel_primitive:NN \nolimits \tex_nolimits:D
+ \__kernel_primitive:NN \nonscript \tex_nonscript:D
+ \__kernel_primitive:NN \nonstopmode \tex_nonstopmode:D
+ \__kernel_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D
+ \__kernel_primitive:NN \nullfont \tex_nullfont:D
+ \__kernel_primitive:NN \number \tex_number:D
+ \__kernel_primitive:NN \omit \tex_omit:D
+ \__kernel_primitive:NN \openin \tex_openin:D
+ \__kernel_primitive:NN \openout \tex_openout:D
+ \__kernel_primitive:NN \or \tex_or:D
+ \__kernel_primitive:NN \outer \tex_outer:D
+ \__kernel_primitive:NN \output \tex_output:D
+ \__kernel_primitive:NN \outputpenalty \tex_outputpenalty:D
+ \__kernel_primitive:NN \over \tex_over:D
+ \__kernel_primitive:NN \overfullrule \tex_overfullrule:D
+ \__kernel_primitive:NN \overline \tex_overline:D
+ \__kernel_primitive:NN \overwithdelims \tex_overwithdelims:D
+ \__kernel_primitive:NN \pagedepth \tex_pagedepth:D
+ \__kernel_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D
+ \__kernel_primitive:NN \pagefillstretch \tex_pagefillstretch:D
+ \__kernel_primitive:NN \pagefilstretch \tex_pagefilstretch:D
+ \__kernel_primitive:NN \pagegoal \tex_pagegoal:D
+ \__kernel_primitive:NN \pageshrink \tex_pageshrink:D
+ \__kernel_primitive:NN \pagestretch \tex_pagestretch:D
+ \__kernel_primitive:NN \pagetotal \tex_pagetotal:D
+ \__kernel_primitive:NN \par \tex_par:D
+ \__kernel_primitive:NN \parfillskip \tex_parfillskip:D
+ \__kernel_primitive:NN \parindent \tex_parindent:D
+ \__kernel_primitive:NN \parshape \tex_parshape:D
+ \__kernel_primitive:NN \parskip \tex_parskip:D
+ \__kernel_primitive:NN \patterns \tex_patterns:D
+ \__kernel_primitive:NN \pausing \tex_pausing:D
+ \__kernel_primitive:NN \penalty \tex_penalty:D
+ \__kernel_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D
+ \__kernel_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D
+ \__kernel_primitive:NN \predisplaysize \tex_predisplaysize:D
+ \__kernel_primitive:NN \pretolerance \tex_pretolerance:D
+ \__kernel_primitive:NN \prevdepth \tex_prevdepth:D
+ \__kernel_primitive:NN \prevgraf \tex_prevgraf:D
+ \__kernel_primitive:NN \radical \tex_radical:D
+ \__kernel_primitive:NN \raise \tex_raise:D
+ \__kernel_primitive:NN \read \tex_read:D
+ \__kernel_primitive:NN \relax \tex_relax:D
+ \__kernel_primitive:NN \relpenalty \tex_relpenalty:D
+ \__kernel_primitive:NN \right \tex_right:D
+ \__kernel_primitive:NN \righthyphenmin \tex_righthyphenmin:D
+ \__kernel_primitive:NN \rightskip \tex_rightskip:D
+ \__kernel_primitive:NN \romannumeral \tex_romannumeral:D
+ \__kernel_primitive:NN \scriptfont \tex_scriptfont:D
+ \__kernel_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D
+ \__kernel_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D
+ \__kernel_primitive:NN \scriptspace \tex_scriptspace:D
+ \__kernel_primitive:NN \scriptstyle \tex_scriptstyle:D
+ \__kernel_primitive:NN \scrollmode \tex_scrollmode:D
+ \__kernel_primitive:NN \setbox \tex_setbox:D
+ \__kernel_primitive:NN \setlanguage \tex_setlanguage:D
+ \__kernel_primitive:NN \sfcode \tex_sfcode:D
+ \__kernel_primitive:NN \shipout \tex_shipout:D
+ \__kernel_primitive:NN \show \tex_show:D
+ \__kernel_primitive:NN \showbox \tex_showbox:D
+ \__kernel_primitive:NN \showboxbreadth \tex_showboxbreadth:D
+ \__kernel_primitive:NN \showboxdepth \tex_showboxdepth:D
+ \__kernel_primitive:NN \showlists \tex_showlists:D
+ \__kernel_primitive:NN \showthe \tex_showthe:D
+ \__kernel_primitive:NN \skewchar \tex_skewchar:D
+ \__kernel_primitive:NN \skip \tex_skip:D
+ \__kernel_primitive:NN \skipdef \tex_skipdef:D
+ \__kernel_primitive:NN \spacefactor \tex_spacefactor:D
+ \__kernel_primitive:NN \spaceskip \tex_spaceskip:D
+ \__kernel_primitive:NN \span \tex_span:D
+ \__kernel_primitive:NN \special \tex_special:D
+ \__kernel_primitive:NN \splitbotmark \tex_splitbotmark:D
+ \__kernel_primitive:NN \splitfirstmark \tex_splitfirstmark:D
+ \__kernel_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D
+ \__kernel_primitive:NN \splittopskip \tex_splittopskip:D
+ \__kernel_primitive:NN \string \tex_string:D
+ \__kernel_primitive:NN \tabskip \tex_tabskip:D
+ \__kernel_primitive:NN \textfont \tex_textfont:D
+ \__kernel_primitive:NN \textstyle \tex_textstyle:D
+ \__kernel_primitive:NN \the \tex_the:D
+ \__kernel_primitive:NN \thickmuskip \tex_thickmuskip:D
+ \__kernel_primitive:NN \thinmuskip \tex_thinmuskip:D
+ \__kernel_primitive:NN \time \tex_time:D
+ \__kernel_primitive:NN \toks \tex_toks:D
+ \__kernel_primitive:NN \toksdef \tex_toksdef:D
+ \__kernel_primitive:NN \tolerance \tex_tolerance:D
+ \__kernel_primitive:NN \topmark \tex_topmark:D
+ \__kernel_primitive:NN \topskip \tex_topskip:D
+ \__kernel_primitive:NN \tracingcommands \tex_tracingcommands:D
+ \__kernel_primitive:NN \tracinglostchars \tex_tracinglostchars:D
+ \__kernel_primitive:NN \tracingmacros \tex_tracingmacros:D
+ \__kernel_primitive:NN \tracingonline \tex_tracingonline:D
+ \__kernel_primitive:NN \tracingoutput \tex_tracingoutput:D
+ \__kernel_primitive:NN \tracingpages \tex_tracingpages:D
+ \__kernel_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D
+ \__kernel_primitive:NN \tracingrestores \tex_tracingrestores:D
+ \__kernel_primitive:NN \tracingstats \tex_tracingstats:D
+ \__kernel_primitive:NN \uccode \tex_uccode:D
+ \__kernel_primitive:NN \uchyph \tex_uchyph:D
+ \__kernel_primitive:NN \underline \tex_underline:D
+ \__kernel_primitive:NN \unhbox \tex_unhbox:D
+ \__kernel_primitive:NN \unhcopy \tex_unhcopy:D
+ \__kernel_primitive:NN \unkern \tex_unkern:D
+ \__kernel_primitive:NN \unpenalty \tex_unpenalty:D
+ \__kernel_primitive:NN \unskip \tex_unskip:D
+ \__kernel_primitive:NN \unvbox \tex_unvbox:D
+ \__kernel_primitive:NN \unvcopy \tex_unvcopy:D
+ \__kernel_primitive:NN \uppercase \tex_uppercase:D
+ \__kernel_primitive:NN \vadjust \tex_vadjust:D
+ \__kernel_primitive:NN \valign \tex_valign:D
+ \__kernel_primitive:NN \vbadness \tex_vbadness:D
+ \__kernel_primitive:NN \vbox \tex_vbox:D
+ \__kernel_primitive:NN \vcenter \tex_vcenter:D
+ \__kernel_primitive:NN \vfil \tex_vfil:D
+ \__kernel_primitive:NN \vfill \tex_vfill:D
+ \__kernel_primitive:NN \vfilneg \tex_vfilneg:D
+ \__kernel_primitive:NN \vfuzz \tex_vfuzz:D
+ \__kernel_primitive:NN \voffset \tex_voffset:D
+ \__kernel_primitive:NN \vrule \tex_vrule:D
+ \__kernel_primitive:NN \vsize \tex_vsize:D
+ \__kernel_primitive:NN \vskip \tex_vskip:D
+ \__kernel_primitive:NN \vsplit \tex_vsplit:D
+ \__kernel_primitive:NN \vss \tex_vss:D
+ \__kernel_primitive:NN \vtop \tex_vtop:D
+ \__kernel_primitive:NN \wd \tex_wd:D
+ \__kernel_primitive:NN \widowpenalty \tex_widowpenalty:D
+ \__kernel_primitive:NN \write \tex_write:D
+ \__kernel_primitive:NN \xdef \tex_xdef:D
+ \__kernel_primitive:NN \xleaders \tex_xleaders:D
+ \__kernel_primitive:NN \xspaceskip \tex_xspaceskip:D
+ \__kernel_primitive:NN \year \tex_year:D
+ \__kernel_primitive:NN \beginL \etex_beginL:D
+ \__kernel_primitive:NN \beginR \etex_beginR:D
+ \__kernel_primitive:NN \botmarks \etex_botmarks:D
+ \__kernel_primitive:NN \clubpenalties \etex_clubpenalties:D
+ \__kernel_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
+ \__kernel_primitive:NN \currentgrouptype \etex_currentgrouptype:D
+ \__kernel_primitive:NN \currentifbranch \etex_currentifbranch:D
+ \__kernel_primitive:NN \currentiflevel \etex_currentiflevel:D
+ \__kernel_primitive:NN \currentiftype \etex_currentiftype:D
+ \__kernel_primitive:NN \detokenize \etex_detokenize:D
+ \__kernel_primitive:NN \dimexpr \etex_dimexpr:D
+ \__kernel_primitive:NN \displaywidowpenalties
+ \etex_displaywidowpenalties:D
+ \__kernel_primitive:NN \endL \etex_endL:D
+ \__kernel_primitive:NN \endR \etex_endR:D
+ \__kernel_primitive:NN \eTeXrevision \etex_eTeXrevision:D
+ \__kernel_primitive:NN \eTeXversion \etex_eTeXversion:D
+ \__kernel_primitive:NN \everyeof \etex_everyeof:D
+ \__kernel_primitive:NN \firstmarks \etex_firstmarks:D
+ \__kernel_primitive:NN \fontchardp \etex_fontchardp:D
+ \__kernel_primitive:NN \fontcharht \etex_fontcharht:D
+ \__kernel_primitive:NN \fontcharic \etex_fontcharic:D
+ \__kernel_primitive:NN \fontcharwd \etex_fontcharwd:D
+ \__kernel_primitive:NN \glueexpr \etex_glueexpr:D
+ \__kernel_primitive:NN \glueshrink \etex_glueshrink:D
+ \__kernel_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
+ \__kernel_primitive:NN \gluestretch \etex_gluestretch:D
+ \__kernel_primitive:NN \gluestretchorder \etex_gluestretchorder:D
+ \__kernel_primitive:NN \gluetomu \etex_gluetomu:D
+ \__kernel_primitive:NN \ifcsname \etex_ifcsname:D
+ \__kernel_primitive:NN \ifdefined \etex_ifdefined:D
+ \__kernel_primitive:NN \iffontchar \etex_iffontchar:D
+ \__kernel_primitive:NN \interactionmode \etex_interactionmode:D
+ \__kernel_primitive:NN \interlinepenalties \etex_interlinepenalties:D
+ \__kernel_primitive:NN \lastlinefit \etex_lastlinefit:D
+ \__kernel_primitive:NN \lastnodetype \etex_lastnodetype:D
+ \__kernel_primitive:NN \marks \etex_marks:D
+ \__kernel_primitive:NN \middle \etex_middle:D
+ \__kernel_primitive:NN \muexpr \etex_muexpr:D
+ \__kernel_primitive:NN \mutoglue \etex_mutoglue:D
+ \__kernel_primitive:NN \numexpr \etex_numexpr:D
+ \__kernel_primitive:NN \pagediscards \etex_pagediscards:D
+ \__kernel_primitive:NN \parshapedimen \etex_parshapedimen:D
+ \__kernel_primitive:NN \parshapeindent \etex_parshapeindent:D
+ \__kernel_primitive:NN \parshapelength \etex_parshapelength:D
+ \__kernel_primitive:NN \predisplaydirection \etex_predisplaydirection:D
+ \__kernel_primitive:NN \protected \etex_protected:D
+ \__kernel_primitive:NN \readline \etex_readline:D
+ \__kernel_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
+ \__kernel_primitive:NN \savingvdiscards \etex_savingvdiscards:D
+ \__kernel_primitive:NN \scantokens \etex_scantokens:D
+ \__kernel_primitive:NN \showgroups \etex_showgroups:D
+ \__kernel_primitive:NN \showifs \etex_showifs:D
+ \__kernel_primitive:NN \showtokens \etex_showtokens:D
+ \__kernel_primitive:NN \splitbotmarks \etex_splitbotmarks:D
+ \__kernel_primitive:NN \splitdiscards \etex_splitdiscards:D
+ \__kernel_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
+ \__kernel_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
+ \__kernel_primitive:NN \topmarks \etex_topmarks:D
+ \__kernel_primitive:NN \tracingassigns \etex_tracingassigns:D
+ \__kernel_primitive:NN \tracinggroups \etex_tracinggroups:D
+ \__kernel_primitive:NN \tracingifs \etex_tracingifs:D
+ \__kernel_primitive:NN \tracingnesting \etex_tracingnesting:D
+ \__kernel_primitive:NN \tracingscantokens \etex_tracingscantokens:D
+ \__kernel_primitive:NN \unexpanded \etex_unexpanded:D
+ \__kernel_primitive:NN \unless \etex_unless:D
+ \__kernel_primitive:NN \widowpenalties \etex_widowpenalties:D
+ \__kernel_primitive:NN \pdfannot \pdftex_pdfannot:D
+ \__kernel_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
+ \__kernel_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
+ \__kernel_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
+ \__kernel_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
+ \__kernel_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
+ \__kernel_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
+ \__kernel_primitive:NN \pdfdest \pdftex_pdfdest:D
+ \__kernel_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
+ \__kernel_primitive:NN \pdfendlink \pdftex_pdfendlink:D
+ \__kernel_primitive:NN \pdfendthread \pdftex_pdfendthread:D
+ \__kernel_primitive:NN \pdffontattr \pdftex_pdffontattr:D
+ \__kernel_primitive:NN \pdffontname \pdftex_pdffontname:D
+ \__kernel_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
+ \__kernel_primitive:NN \pdfgamma \pdftex_pdfgamma:D
+ \__kernel_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
+ \__kernel_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
+ \__kernel_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
+ \__kernel_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
+ \__kernel_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
+ \__kernel_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
+ \__kernel_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
+ \__kernel_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
+ \__kernel_primitive:NN \pdfinclusioncopyfonts
+ \pdftex_pdfinclusioncopyfonts:D
+ \__kernel_primitive:NN \pdfinclusionerrorlevel
+ \pdftex_pdfinclusionerrorlevel:D
+ \__kernel_primitive:NN \pdfinfo \pdftex_pdfinfo:D
+ \__kernel_primitive:NN \pdflastannot \pdftex_pdflastannot:D
+ \__kernel_primitive:NN \pdflastlink \pfdftex_pdflastlink:D
+ \__kernel_primitive:NN \pdflastobj \pdftex_pdflastobj:D
+ \__kernel_primitive:NN \pdflastxform \pdftex_pdflastxform:D
+ \__kernel_primitive:NN \pdflastximage \pdftex_pdflastximage:D
+ \__kernel_primitive:NN \pdflastximagecolordepth
+ \pdftex_pdflastximagecolordepth:D
+ \__kernel_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
+ \__kernel_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
+ \__kernel_primitive:NN \pdfliteral \pdftex_pdfliteral:D
+ \__kernel_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
+ \__kernel_primitive:NN \pdfnames \pdftex_pdfnames:D
+ \__kernel_primitive:NN \pdfobj \pdftex_pdfobj:D
+ \__kernel_primitive:NN \pdfobjcompresslevel
+ \pdftex_pdfobjcompresslevel:D
+ \__kernel_primitive:NN \pdfoutline \pdftex_pdfoutline:D
+ \__kernel_primitive:NN \pdfoutput \pdftex_pdfoutput:D
+ \__kernel_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
+ \__kernel_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
+ \__kernel_primitive:NN \pdfpageref \pdftex_pdfpageref:D
+ \__kernel_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
+ \__kernel_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
+ \__kernel_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
+ \__kernel_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
+ \__kernel_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
+ \__kernel_primitive:NN \pdfrestore \pdftex_pdfrestore:D
+ \__kernel_primitive:NN \pdfretval \pdftex_pdfretval:D
+ \__kernel_primitive:NN \pdfsave \pdftex_pdfsave:D
+ \__kernel_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
+ \__kernel_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
+ \__kernel_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
+ \__kernel_primitive:NN \pdfsuppressptexinfo
+ \pdftex_pdfsuppressptexinfo:D
+ \__kernel_primitive:NN \pdfthread \pdftex_pdfthread:D
+ \__kernel_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
+ \__kernel_primitive:NN \pdftrailer \pdftex_pdftrailer:D
+ \__kernel_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
+ \__kernel_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
+ \__kernel_primitive:NN \pdfxform \pdftex_pdfxform:D
+ \__kernel_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
+ \__kernel_primitive:NN \pdfxformname \pdftex_pdfxformname:D
+ \__kernel_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
+ \__kernel_primitive:NN \pdfximage \pdftex_pdfximage:D
+ \__kernel_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
+ \__kernel_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
+ \__kernel_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
+ \__kernel_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
+ \__kernel_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
+ \__kernel_primitive:NN \pdfcopyfont \pdftex_copyfont:D
+ \__kernel_primitive:NN \pdfdraftmode \pdftex_draftmode:D
+ \__kernel_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
+ \__kernel_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
+ \__kernel_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
+ \__kernel_primitive:NN \pdffilesize \pdftex_filesize:D
+ \__kernel_primitive:NN \pdffirstlineheigh \pdftex_firstlineheight:D
+ \__kernel_primitive:NN \pdffontexpand \pdftex_fontexpand:D
+ \__kernel_primitive:NN \pdffontsize \pdftex_fontsize:D
+ \__kernel_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
+ \__kernel_primitive:NN \pdfinsertht \pdftex_insertht:D
+ \__kernel_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
+ \__kernel_primitive:NN \pdflastxpos \pdftex_lastxpos:D
+ \__kernel_primitive:NN \pdflastypos \pdftex_lastypos:D
+ \__kernel_primitive:NN \pdfmapfile \pdftex_mapfile:D
+ \__kernel_primitive:NN \pdfmapline \pdftex_mapline:D
+ \__kernel_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
+ \__kernel_primitive:NN \pdfnoligatures \pdftex_noligatures:D
+ \__kernel_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
+ \__kernel_primitive:NN \pdfpageheight \pdftex_pageheight:D
+ \__kernel_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
+ \__kernel_primitive:NN \pdfpkmode \pdftex_pkmode:D
+ \__kernel_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
+ \__kernel_primitive:NN \pdfprimitive \pdftex_primitive:D
+ \__kernel_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
+ \__kernel_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
+ \__kernel_primitive:NN \pdfrandomseed \pdftex_randomseed:D
+ \__kernel_primitive:NN \pdfsavepos \pdftex_savepos:D
+ \__kernel_primitive:NN \pdfstrcmp \pdftex_strcmp:D
+ \__kernel_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
+ \__kernel_primitive:NN \pdfshellescape \pdftex_shellescape:D
+ \__kernel_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
+ \__kernel_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
+ \__kernel_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
+ \__kernel_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
+ \__kernel_primitive:NN \pdftexversion \pdftex_pdftexversion:D
+ \__kernel_primitive:NN \efcode \pdftex_efcode:D
+ \__kernel_primitive:NN \ifincsname \pdftex_ifincsname:D
+ \__kernel_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
+ \__kernel_primitive:NN \letterspacefont \pdftex_letterspacefont:D
+ \__kernel_primitive:NN \lpcode \pdftex_lpcode:D
+ \__kernel_primitive:NN \quitvmode \pdftex_quitvmode:D
+ \__kernel_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
+ \__kernel_primitive:NN \rpcode \pdftex_rpcode:D
+ \__kernel_primitive:NN \synctex \pdftex_synctex:D
+ \__kernel_primitive:NN \tagcode \pdftex_tagcode:D
\tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
\tex_long:D \tex_def:D \use_none:n #1 { }
\tex_long:D \tex_def:D \__kernel_primitive:NN #1#2
@@ -877,378 +883,428 @@
\tex_fi:D
\use_none:n { \tex_global:D \tex_let:D #2 #1 }
}
- \__kernel_primitive:NN \suppressfontnotfounderror \xetex_suppressfontnotfounderror:D
- \__kernel_primitive:NN \XeTeXcharclass \xetex_charclass:D
- \__kernel_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
- \__kernel_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
- \__kernel_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
- \__kernel_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
- \__kernel_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
- \__kernel_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
- \__kernel_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
- \__kernel_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
- \__kernel_primitive:NN \XeTeXfeaturename \xetex_featurename:D
- \__kernel_primitive:NN \XeTeXfindfeaturebyname \xetex_findfeaturebyname:D
- \__kernel_primitive:NN \XeTeXfindselectorbyname \xetex_findselectorbyname:D
- \__kernel_primitive:NN \XeTeXfindvariationbyname \xetex_findvariationbyname:D
- \__kernel_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
- \__kernel_primitive:NN \XeTeXfonttype \xetex_fonttype:D
- \__kernel_primitive:NN \XeTeXgenerateactualtext \xetex_generateactualtext:D
- \__kernel_primitive:NN \XeTeXglyph \xetex_glyph:D
- \__kernel_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
- \__kernel_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
- \__kernel_primitive:NN \XeTeXglyphname \xetex_glyphname:D
- \__kernel_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
- \__kernel_primitive:NN \XeTeXinputnormalization \xetex_inputnormalization:D
- \__kernel_primitive:NN \XeTeXinterchartokenstate \xetex_interchartokenstate:D
- \__kernel_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
- \__kernel_primitive:NN \XeTeXisdefaultselector \xetex_isdefaultselector:D
- \__kernel_primitive:NN \XeTeXisexclusivefeature \xetex_isexclusivefeature:D
- \__kernel_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
- \__kernel_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
- \__kernel_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
- \__kernel_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
- \__kernel_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
- \__kernel_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
- \__kernel_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
- \__kernel_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
- \__kernel_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
- \__kernel_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
- \__kernel_primitive:NN \XeTeXpdffile \xetex_pdffile:D
- \__kernel_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
- \__kernel_primitive:NN \XeTeXpicfile \xetex_picfile:D
- \__kernel_primitive:NN \XeTeXselectorname \xetex_selectorname:D
- \__kernel_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
- \__kernel_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
- \__kernel_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
- \__kernel_primitive:NN \XeTeXvariation \xetex_variation:D
- \__kernel_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
- \__kernel_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
- \__kernel_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
- \__kernel_primitive:NN \XeTeXvariationname \xetex_variationname:D
- \__kernel_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
- \__kernel_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
- \__kernel_primitive:NN \mdfivesum \pdftex_mdfivesum:D
- \__kernel_primitive:NN \ifprimitive \pdftex_ifprimitive:D
- \__kernel_primitive:NN \primitive \pdftex_primitive:D
- \__kernel_primitive:NN \shellescape \pdftex_shellescape:D
- \__kernel_primitive:NN \alignmark \luatex_alignmark:D
- \__kernel_primitive:NN \aligntab \luatex_aligntab:D
- \__kernel_primitive:NN \attribute \luatex_attribute:D
- \__kernel_primitive:NN \attributedef \luatex_attributedef:D
- \__kernel_primitive:NN \automaticdiscretionary \luatex_automaticdiscretionary:D
- \__kernel_primitive:NN \automatichyphenmode \luatex_automatichyphenmode:D
- \__kernel_primitive:NN \automatichyphenpenalty \luatex_automatichyphenpenalty:D
- \__kernel_primitive:NN \begincsname \luatex_begincsname:D
- \__kernel_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
- \__kernel_primitive:NN \catcodetable \luatex_catcodetable:D
- \__kernel_primitive:NN \clearmarks \luatex_clearmarks:D
- \__kernel_primitive:NN \crampeddisplaystyle \luatex_crampeddisplaystyle:D
- \__kernel_primitive:NN \crampedscriptscriptstyle \luatex_crampedscriptscriptstyle:D
- \__kernel_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
- \__kernel_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
- \__kernel_primitive:NN \directlua \luatex_directlua:D
- \__kernel_primitive:NN \dviextension \luatex_dviextension:D
- \__kernel_primitive:NN \dvifeedback \luatex_dvifeedback:D
- \__kernel_primitive:NN \dvivariable \luatex_dvivariable:D
- \__kernel_primitive:NN \etoksapp \luatex_etoksapp:D
- \__kernel_primitive:NN \etokspre \luatex_etokspre:D
- \__kernel_primitive:NN \explicithyphenpenalty \luatex_explicithyphenpenalty:D
- \__kernel_primitive:NN \expanded \luatex_expanded:D
- \__kernel_primitive:NN \explicitdiscretionary \luatex_explicitdiscretionary:D
- \__kernel_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
- \__kernel_primitive:NN \fontid \luatex_fontid:D
- \__kernel_primitive:NN \formatname \luatex_formatname:D
- \__kernel_primitive:NN \hjcode \luatex_hjcode:D
- \__kernel_primitive:NN \hpack \luatex_hpack:D
- \__kernel_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
- \__kernel_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
- \__kernel_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
- \__kernel_primitive:NN \gleaders \luatex_gleaders:D
- \__kernel_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
- \__kernel_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
- \__kernel_primitive:NN \latelua \luatex_latelua:D
- \__kernel_primitive:NN \letcharcode \luatex_letcharcode:D
- \__kernel_primitive:NN \luaescapestring \luatex_luaescapestring:D
- \__kernel_primitive:NN \luafunction \luatex_luafunction:D
- \__kernel_primitive:NN \luatexbanner \luatex_luatexbanner:D
- \__kernel_primitive:NN \luatexrevision \luatex_luatexrevision:D
- \__kernel_primitive:NN \luatexversion \luatex_luatexversion:D
- \__kernel_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
- \__kernel_primitive:NN \mathdisplayskipmode \luatex_mathdisplayskipmode:D
- \__kernel_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
- \__kernel_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
- \__kernel_primitive:NN \mathoption \luatex_mathoption:D
- \__kernel_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
- \__kernel_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
- \__kernel_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
- \__kernel_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
- \__kernel_primitive:NN \mathstyle \luatex_mathstyle:D
- \__kernel_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
- \__kernel_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
- \__kernel_primitive:NN \nohrule \luatex_nohrule:D
- \__kernel_primitive:NN \nokerns \luatex_nokerns:D
- \__kernel_primitive:NN \noligs \luatex_noligs:D
- \__kernel_primitive:NN \nospaces \luatex_nospaces:D
- \__kernel_primitive:NN \novrule \luatex_novrule:D
- \__kernel_primitive:NN \outputbox \luatex_outputbox:D
- \__kernel_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
- \__kernel_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
- \__kernel_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
- \__kernel_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
- \__kernel_primitive:NN \pdfextension \luatex_pdfextension:D
- \__kernel_primitive:NN \pdffeedback \luatex_pdffeedback:D
- \__kernel_primitive:NN \pdfvariable \luatex_pdfvariable:D
- \__kernel_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
- \__kernel_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
- \__kernel_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
- \__kernel_primitive:NN \predisplaygapfactor \luatex_predisplaygapfactor:D
- \__kernel_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
- \__kernel_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
- \__kernel_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
- \__kernel_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
- \__kernel_primitive:NN \scantextokens \luatex_scantextokens:D
- \__kernel_primitive:NN \setfontid \luatex_setfontid:D
- \__kernel_primitive:NN \shapemode \luatex_shapemode:D
- \__kernel_primitive:NN \suppressifcsnameerror \luatex_suppressifcsnameerror:D
- \__kernel_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
- \__kernel_primitive:NN \suppressmathparerror \luatex_suppressmathparerror:D
- \__kernel_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
- \__kernel_primitive:NN \suppressprimitiveerror \luatex_suppressprimitiveerror:D
- \__kernel_primitive:NN \toksapp \luatex_toksapp:D
- \__kernel_primitive:NN \tokspre \luatex_tokspre:D
- \__kernel_primitive:NN \tpack \luatex_tpack:D
- \__kernel_primitive:NN \vpack \luatex_vpack:D
- \__kernel_primitive:NN \bodydir \luatex_bodydir:D
- \__kernel_primitive:NN \boxdir \luatex_boxdir:D
- \__kernel_primitive:NN \leftghost \luatex_leftghost:D
- \__kernel_primitive:NN \linedir \luatex_linedir:D
- \__kernel_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
- \__kernel_primitive:NN \localinterlinepenalty \luatex_localinterlinepenalty:D
- \__kernel_primitive:NN \localleftbox \luatex_localleftbox:D
- \__kernel_primitive:NN \localrightbox \luatex_localrightbox:D
- \__kernel_primitive:NN \mathdir \luatex_mathdir:D
- \__kernel_primitive:NN \pagedir \luatex_pagedir:D
- \__kernel_primitive:NN \pardir \luatex_pardir:D
- \__kernel_primitive:NN \rightghost \luatex_rightghost:D
- \__kernel_primitive:NN \textdir \luatex_textdir:D
- \__kernel_primitive:NN \adjustspacing \pdftex_adjustspacing:D
- \__kernel_primitive:NN \copyfont \pdftex_copyfont:D
- \__kernel_primitive:NN \draftmode \pdftex_draftmode:D
- \__kernel_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
- \__kernel_primitive:NN \ifabsdim \pdftex_ifabsdim:D
- \__kernel_primitive:NN \ifabsnum \pdftex_ifabsnum:D
- \__kernel_primitive:NN \ignoreligaturesinfont \pdftex_ignoreligaturesinfont:D
- \__kernel_primitive:NN \insertht \pdftex_insertht:D
- \__kernel_primitive:NN \lastsavedboxresourceindex \pdftex_pdflastxform:D
- \__kernel_primitive:NN \lastsavedimageresourceindex \pdftex_pdflastximage:D
- \__kernel_primitive:NN \lastsavedimageresourcepages \pdftex_pdflastximagepages:D
- \__kernel_primitive:NN \lastxpos \pdftex_lastxpos:D
- \__kernel_primitive:NN \lastypos \pdftex_lastypos:D
- \__kernel_primitive:NN \normaldeviate \pdftex_normaldeviate:D
- \__kernel_primitive:NN \outputmode \pdftex_pdfoutput:D
- \__kernel_primitive:NN \pageheight \pdftex_pageheight:D
- \__kernel_primitive:NN \pagewidth \pdftex_pagewith:D
- \__kernel_primitive:NN \protrudechars \pdftex_protrudechars:D
- \__kernel_primitive:NN \pxdimen \pdftex_pxdimen:D
- \__kernel_primitive:NN \randomseed \pdftex_randomseed:D
- \__kernel_primitive:NN \useboxresource \pdftex_pdfrefxform:D
- \__kernel_primitive:NN \useimageresource \pdftex_pdfrefximage:D
- \__kernel_primitive:NN \savepos \pdftex_savepos:D
- \__kernel_primitive:NN \saveboxresource \pdftex_pdfxform:D
- \__kernel_primitive:NN \saveimageresource \pdftex_pdfximage:D
- \__kernel_primitive:NN \setrandomseed \pdftex_setrandomseed:D
- \__kernel_primitive:NN \tracingfonts \pdftex_tracingfonts:D
- \__kernel_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
- \__kernel_primitive:NN \Uchar \utex_char:D
- \__kernel_primitive:NN \Ucharcat \utex_charcat:D
- \__kernel_primitive:NN \Udelcode \utex_delcode:D
- \__kernel_primitive:NN \Udelcodenum \utex_delcodenum:D
- \__kernel_primitive:NN \Udelimiter \utex_delimiter:D
- \__kernel_primitive:NN \Udelimiterover \utex_delimiterover:D
- \__kernel_primitive:NN \Udelimiterunder \utex_delimiterunder:D
- \__kernel_primitive:NN \Uhextensible \utex_hextensible:D
- \__kernel_primitive:NN \Umathaccent \utex_mathaccent:D
- \__kernel_primitive:NN \Umathaxis \utex_mathaxis:D
- \__kernel_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
- \__kernel_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
- \__kernel_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
- \__kernel_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
- \__kernel_primitive:NN \Umathbinopspacing \utex_binopspacing:D
- \__kernel_primitive:NN \Umathbinordspacing \utex_binordspacing:D
- \__kernel_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
- \__kernel_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
- \__kernel_primitive:NN \Umathchar \utex_mathchar:D
- \__kernel_primitive:NN \Umathcharclass \utex_mathcharclass:D
- \__kernel_primitive:NN \Umathchardef \utex_mathchardef:D
- \__kernel_primitive:NN \Umathcharfam \utex_mathcharfam:D
- \__kernel_primitive:NN \Umathcharnum \utex_mathcharnum:D
- \__kernel_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
- \__kernel_primitive:NN \Umathcharslot \utex_mathcharslot:D
- \__kernel_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
- \__kernel_primitive:NN \Umathcloseclosespacing \utex_closeclosespacing:D
- \__kernel_primitive:NN \Umathcloseinnerspacing \utex_closeinnerspacing:D
- \__kernel_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
- \__kernel_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
- \__kernel_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
- \__kernel_primitive:NN \Umathclosepunctspacing \utex_closepunctspacing:D
- \__kernel_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
- \__kernel_primitive:NN \Umathcode \utex_mathcode:D
- \__kernel_primitive:NN \Umathcodenum \utex_mathcodenum:D
- \__kernel_primitive:NN \Umathconnectoroverlapmin \utex_connectoroverlapmin:D
- \__kernel_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
- \__kernel_primitive:NN \Umathfractiondenomdown \utex_fractiondenomdown:D
- \__kernel_primitive:NN \Umathfractiondenomvgap \utex_fractiondenomvgap:D
- \__kernel_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
- \__kernel_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
- \__kernel_primitive:NN \Umathfractionrule \utex_fractionrule:D
- \__kernel_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
- \__kernel_primitive:NN \Umathinnerclosespacing \utex_innerclosespacing:D
- \__kernel_primitive:NN \Umathinnerinnerspacing \utex_innerinnerspacing:D
- \__kernel_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
- \__kernel_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
- \__kernel_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
- \__kernel_primitive:NN \Umathinnerpunctspacing \utex_innerpunctspacing:D
- \__kernel_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
- \__kernel_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
- \__kernel_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
- \__kernel_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
- \__kernel_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
- \__kernel_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
- \__kernel_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
- \__kernel_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
- \__kernel_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
- \__kernel_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
- \__kernel_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
- \__kernel_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
- \__kernel_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
- \__kernel_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
- \__kernel_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
- \__kernel_primitive:NN \Umathopenopspacing \utex_openopspacing:D
- \__kernel_primitive:NN \Umathopenordspacing \utex_openordspacing:D
- \__kernel_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
- \__kernel_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
- \__kernel_primitive:NN \Umathoperatorsize \utex_operatorsize:D
- \__kernel_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
- \__kernel_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
- \__kernel_primitive:NN \Umathopopspacing \utex_opopspacing:D
- \__kernel_primitive:NN \Umathopordspacing \utex_opordspacing:D
- \__kernel_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
- \__kernel_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
- \__kernel_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
- \__kernel_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
- \__kernel_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
- \__kernel_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
- \__kernel_primitive:NN \Umathordopspacing \utex_ordopspacing:D
- \__kernel_primitive:NN \Umathordordspacing \utex_ordordspacing:D
- \__kernel_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
- \__kernel_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
- \__kernel_primitive:NN \Umathoverbarkern \utex_overbarkern:D
- \__kernel_primitive:NN \Umathoverbarrule \utex_overbarrule:D
- \__kernel_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
- \__kernel_primitive:NN \Umathoverdelimiterbgap \utex_overdelimiterbgap:D
- \__kernel_primitive:NN \Umathoverdelimitervgap \utex_overdelimitervgap:D
- \__kernel_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
- \__kernel_primitive:NN \Umathpunctclosespacing \utex_punctclosespacing:D
- \__kernel_primitive:NN \Umathpunctinnerspacing \utex_punctinnerspacing:D
- \__kernel_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
- \__kernel_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
- \__kernel_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
- \__kernel_primitive:NN \Umathpunctpunctspacing \utex_punctpunctspacing:D
- \__kernel_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
- \__kernel_primitive:NN \Umathquad \utex_quad:D
- \__kernel_primitive:NN \Umathradicaldegreeafter \utex_radicaldegreeafter:D
- \__kernel_primitive:NN \Umathradicaldegreebefore \utex_radicaldegreebefore:D
- \__kernel_primitive:NN \Umathradicaldegreeraise \utex_radicaldegreeraise:D
- \__kernel_primitive:NN \Umathradicalkern \utex_radicalkern:D
- \__kernel_primitive:NN \Umathradicalrule \utex_radicalrule:D
- \__kernel_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
- \__kernel_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
- \__kernel_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
- \__kernel_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
- \__kernel_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
- \__kernel_primitive:NN \Umathrelopspacing \utex_relopspacing:D
- \__kernel_primitive:NN \Umathrelordspacing \utex_relordspacing:D
- \__kernel_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
- \__kernel_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
- \__kernel_primitive:NN \Umathskewedfractionhgap \utex_skewedfractionhgap:D
- \__kernel_primitive:NN \Umathskewedfractionvgap \utex_skewedfractionvgap:D
- \__kernel_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
- \__kernel_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
- \__kernel_primitive:NN \Umathstacknumup \utex_stacknumup:D
- \__kernel_primitive:NN \Umathstackvgap \utex_stackvgap:D
- \__kernel_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
- \__kernel_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
- \__kernel_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
- \__kernel_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
- \__kernel_primitive:NN \Umathsubtopmax \utex_subtopmax:D
- \__kernel_primitive:NN \Umathsupbottommin \utex_supbottommin:D
- \__kernel_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
- \__kernel_primitive:NN \Umathsupshiftup \utex_supshiftup:D
- \__kernel_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
- \__kernel_primitive:NN \Umathunderbarkern \utex_underbarkern:D
- \__kernel_primitive:NN \Umathunderbarrule \utex_underbarrule:D
- \__kernel_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
- \__kernel_primitive:NN \Umathunderdelimiterbgap \utex_underdelimiterbgap:D
- \__kernel_primitive:NN \Umathunderdelimitervgap \utex_underdelimitervgap:D
- \__kernel_primitive:NN \Unosubscript \utex_Unosubscript:D
- \__kernel_primitive:NN \Unosuperscript \utex_Unosuperscript:D
- \__kernel_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
- \__kernel_primitive:NN \Uradical \utex_radical:D
- \__kernel_primitive:NN \Uroot \utex_root:D
- \__kernel_primitive:NN \Uskewed \utex_skewed:D
- \__kernel_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
- \__kernel_primitive:NN \Ustack \utex_stack:D
- \__kernel_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
- \__kernel_primitive:NN \Ustartmath \utex_startmath:D
- \__kernel_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
- \__kernel_primitive:NN \Ustopmath \utex_stopmath:D
- \__kernel_primitive:NN \Usubscript \utex_subscript:D
- \__kernel_primitive:NN \Usuperscript \utex_superscript:D
- \__kernel_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
- \__kernel_primitive:NN \Uvextensible \utex_vextensible:D
- \__kernel_primitive:NN \autospacing \ptex_autospacing:D
- \__kernel_primitive:NN \autoxspacing \ptex_autoxspacing:D
- \__kernel_primitive:NN \dtou \ptex_dtou:D
- \__kernel_primitive:NN \euc \ptex_euc:D
- \__kernel_primitive:NN \ifdbox \ptex_ifdbox:D
- \__kernel_primitive:NN \ifddir \ptex_ifddir:D
- \__kernel_primitive:NN \ifmdir \ptex_ifmdir:D
- \__kernel_primitive:NN \iftbox \ptex_iftbox:D
- \__kernel_primitive:NN \iftdir \ptex_iftdir:D
- \__kernel_primitive:NN \ifybox \ptex_ifybox:D
- \__kernel_primitive:NN \ifydir \ptex_ifydir:D
- \__kernel_primitive:NN \inhibitglue \ptex_inhibitglue:D
- \__kernel_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
- \__kernel_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
- \__kernel_primitive:NN \jfam \ptex_jfam:D
- \__kernel_primitive:NN \jfont \ptex_jfont:D
- \__kernel_primitive:NN \jis \ptex_jis:D
- \__kernel_primitive:NN \kanjiskip \ptex_kanjiskip:D
- \__kernel_primitive:NN \kansuji \ptex_kansuji:D
- \__kernel_primitive:NN \kansujichar \ptex_kansujichar:D
- \__kernel_primitive:NN \kcatcode \ptex_kcatcode:D
- \__kernel_primitive:NN \kuten \ptex_kuten:D
- \__kernel_primitive:NN \noautospacing \ptex_noautospacing:D
- \__kernel_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
- \__kernel_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
- \__kernel_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
- \__kernel_primitive:NN \showmode \ptex_showmode:D
- \__kernel_primitive:NN \sjis \ptex_sjis:D
- \__kernel_primitive:NN \tate \ptex_tate:D
- \__kernel_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
- \__kernel_primitive:NN \tfont \ptex_tfont:D
- \__kernel_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
- \__kernel_primitive:NN \xspcode \ptex_xspcode:D
- \__kernel_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
- \__kernel_primitive:NN \yoko \ptex_yoko:D
- \__kernel_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
- \__kernel_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
- \__kernel_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
- \__kernel_primitive:NN \kchar \uptex_kchar:D
- \__kernel_primitive:NN \kchardef \uptex_kchardef:D
- \__kernel_primitive:NN \kuten \uptex_kuten:D
- \__kernel_primitive:NN \ucs \uptex_ucs:D
+ \__kernel_primitive:NN \suppressfontnotfounderror
+ \xetex_suppressfontnotfounderror:D
+ \__kernel_primitive:NN \XeTeXcharclass \xetex_charclass:D
+ \__kernel_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
+ \__kernel_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
+ \__kernel_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
+ \__kernel_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
+ \__kernel_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
+ \__kernel_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
+ \__kernel_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
+ \__kernel_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
+ \__kernel_primitive:NN \XeTeXfeaturename \xetex_featurename:D
+ \__kernel_primitive:NN \XeTeXfindfeaturebyname
+ \xetex_findfeaturebyname:D
+ \__kernel_primitive:NN \XeTeXfindselectorbyname
+ \xetex_findselectorbyname:D
+ \__kernel_primitive:NN \XeTeXfindvariationbyname
+ \xetex_findvariationbyname:D
+ \__kernel_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
+ \__kernel_primitive:NN \XeTeXfonttype \xetex_fonttype:D
+ \__kernel_primitive:NN \XeTeXgenerateactualtext
+ \xetex_generateactualtext:D
+ \__kernel_primitive:NN \XeTeXglyph \xetex_glyph:D
+ \__kernel_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
+ \__kernel_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
+ \__kernel_primitive:NN \XeTeXglyphname \xetex_glyphname:D
+ \__kernel_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
+ \__kernel_primitive:NN \XeTeXinputnormalization
+ \xetex_inputnormalization:D
+ \__kernel_primitive:NN \XeTeXinterchartokenstate
+ \xetex_interchartokenstate:D
+ \__kernel_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
+ \__kernel_primitive:NN \XeTeXisdefaultselector
+ \xetex_isdefaultselector:D
+ \__kernel_primitive:NN \XeTeXisexclusivefeature
+ \xetex_isexclusivefeature:D
+ \__kernel_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
+ \__kernel_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
+ \__kernel_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
+ \__kernel_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
+ \__kernel_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
+ \__kernel_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
+ \__kernel_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
+ \__kernel_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
+ \__kernel_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
+ \__kernel_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
+ \__kernel_primitive:NN \XeTeXpdffile \xetex_pdffile:D
+ \__kernel_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
+ \__kernel_primitive:NN \XeTeXpicfile \xetex_picfile:D
+ \__kernel_primitive:NN \XeTeXselectorname \xetex_selectorname:D
+ \__kernel_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
+ \__kernel_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
+ \__kernel_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
+ \__kernel_primitive:NN \XeTeXvariation \xetex_variation:D
+ \__kernel_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
+ \__kernel_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
+ \__kernel_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
+ \__kernel_primitive:NN \XeTeXvariationname \xetex_variationname:D
+ \__kernel_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
+ \__kernel_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
+ \__kernel_primitive:NN \mdfivesum \pdftex_mdfivesum:D
+ \__kernel_primitive:NN \ifprimitive \pdftex_ifprimitive:D
+ \__kernel_primitive:NN \primitive \pdftex_primitive:D
+ \__kernel_primitive:NN \shellescape \pdftex_shellescape:D
+ \__kernel_primitive:NN \alignmark \luatex_alignmark:D
+ \__kernel_primitive:NN \aligntab \luatex_aligntab:D
+ \__kernel_primitive:NN \attribute \luatex_attribute:D
+ \__kernel_primitive:NN \attributedef \luatex_attributedef:D
+ \__kernel_primitive:NN \automaticdiscretionary
+ \luatex_automaticdiscretionary:D
+ \__kernel_primitive:NN \automatichyphenmode
+ \luatex_automatichyphenmode:D
+ \__kernel_primitive:NN \automatichyphenpenalty
+ \luatex_automatichyphenpenalty:D
+ \__kernel_primitive:NN \begincsname \luatex_begincsname:D
+ \__kernel_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
+ \__kernel_primitive:NN \catcodetable \luatex_catcodetable:D
+ \__kernel_primitive:NN \clearmarks \luatex_clearmarks:D
+ \__kernel_primitive:NN \crampeddisplaystyle
+ \luatex_crampeddisplaystyle:D
+ \__kernel_primitive:NN \crampedscriptscriptstyle
+ \luatex_crampedscriptscriptstyle:D
+ \__kernel_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
+ \__kernel_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
+ \__kernel_primitive:NN \directlua \luatex_directlua:D
+ \__kernel_primitive:NN \dviextension \luatex_dviextension:D
+ \__kernel_primitive:NN \dvifeedback \luatex_dvifeedback:D
+ \__kernel_primitive:NN \dvivariable \luatex_dvivariable:D
+ \__kernel_primitive:NN \etoksapp \luatex_etoksapp:D
+ \__kernel_primitive:NN \etokspre \luatex_etokspre:D
+ \__kernel_primitive:NN \explicithyphenpenalty
+ \luatex_explicithyphenpenalty:D
+ \__kernel_primitive:NN \expanded \luatex_expanded:D
+ \__kernel_primitive:NN \explicitdiscretionary
+ \luatex_explicitdiscretionary:D
+ \__kernel_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
+ \__kernel_primitive:NN \fontid \luatex_fontid:D
+ \__kernel_primitive:NN \formatname \luatex_formatname:D
+ \__kernel_primitive:NN \hjcode \luatex_hjcode:D
+ \__kernel_primitive:NN \hpack \luatex_hpack:D
+ \__kernel_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
+ \__kernel_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
+ \__kernel_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
+ \__kernel_primitive:NN \gleaders \luatex_gleaders:D
+ \__kernel_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
+ \__kernel_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
+ \__kernel_primitive:NN \latelua \luatex_latelua:D
+ \__kernel_primitive:NN \letcharcode \luatex_letcharcode:D
+ \__kernel_primitive:NN \luaescapestring \luatex_luaescapestring:D
+ \__kernel_primitive:NN \luafunction \luatex_luafunction:D
+ \__kernel_primitive:NN \luatexbanner \luatex_luatexbanner:D
+ \__kernel_primitive:NN \luatexrevision \luatex_luatexrevision:D
+ \__kernel_primitive:NN \luatexversion \luatex_luatexversion:D
+ \__kernel_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
+ \__kernel_primitive:NN \mathdisplayskipmode
+ \luatex_mathdisplayskipmode:D
+ \__kernel_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
+ \__kernel_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
+ \__kernel_primitive:NN \mathoption \luatex_mathoption:D
+ \__kernel_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
+ \__kernel_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
+ \__kernel_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
+ \__kernel_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
+ \__kernel_primitive:NN \mathstyle \luatex_mathstyle:D
+ \__kernel_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
+ \__kernel_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
+ \__kernel_primitive:NN \nohrule \luatex_nohrule:D
+ \__kernel_primitive:NN \nokerns \luatex_nokerns:D
+ \__kernel_primitive:NN \noligs \luatex_noligs:D
+ \__kernel_primitive:NN \nospaces \luatex_nospaces:D
+ \__kernel_primitive:NN \novrule \luatex_novrule:D
+ \__kernel_primitive:NN \outputbox \luatex_outputbox:D
+ \__kernel_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
+ \__kernel_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
+ \__kernel_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
+ \__kernel_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
+ \__kernel_primitive:NN \pdfextension \luatex_pdfextension:D
+ \__kernel_primitive:NN \pdffeedback \luatex_pdffeedback:D
+ \__kernel_primitive:NN \pdfvariable \luatex_pdfvariable:D
+ \__kernel_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
+ \__kernel_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
+ \__kernel_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
+ \__kernel_primitive:NN \predisplaygapfactor
+ \luatex_predisplaygapfactor:D
+ \__kernel_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
+ \__kernel_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
+ \__kernel_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
+ \__kernel_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
+ \__kernel_primitive:NN \scantextokens \luatex_scantextokens:D
+ \__kernel_primitive:NN \setfontid \luatex_setfontid:D
+ \__kernel_primitive:NN \shapemode \luatex_shapemode:D
+ \__kernel_primitive:NN \suppressifcsnameerror
+ \luatex_suppressifcsnameerror:D
+ \__kernel_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
+ \__kernel_primitive:NN \suppressmathparerror
+ \luatex_suppressmathparerror:D
+ \__kernel_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
+ \__kernel_primitive:NN \suppressprimitiveerror
+ \luatex_suppressprimitiveerror:D
+ \__kernel_primitive:NN \toksapp \luatex_toksapp:D
+ \__kernel_primitive:NN \tokspre \luatex_tokspre:D
+ \__kernel_primitive:NN \tpack \luatex_tpack:D
+ \__kernel_primitive:NN \vpack \luatex_vpack:D
+ \__kernel_primitive:NN \bodydir \luatex_bodydir:D
+ \__kernel_primitive:NN \boxdir \luatex_boxdir:D
+ \__kernel_primitive:NN \leftghost \luatex_leftghost:D
+ \__kernel_primitive:NN \linedir \luatex_linedir:D
+ \__kernel_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
+ \__kernel_primitive:NN \localinterlinepenalty
+ \luatex_localinterlinepenalty:D
+ \__kernel_primitive:NN \localleftbox \luatex_localleftbox:D
+ \__kernel_primitive:NN \localrightbox \luatex_localrightbox:D
+ \__kernel_primitive:NN \mathdir \luatex_mathdir:D
+ \__kernel_primitive:NN \pagedir \luatex_pagedir:D
+ \__kernel_primitive:NN \pardir \luatex_pardir:D
+ \__kernel_primitive:NN \rightghost \luatex_rightghost:D
+ \__kernel_primitive:NN \textdir \luatex_textdir:D
+ \__kernel_primitive:NN \adjustspacing \pdftex_adjustspacing:D
+ \__kernel_primitive:NN \copyfont \pdftex_copyfont:D
+ \__kernel_primitive:NN \draftmode \pdftex_draftmode:D
+ \__kernel_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
+ \__kernel_primitive:NN \ifabsdim \pdftex_ifabsdim:D
+ \__kernel_primitive:NN \ifabsnum \pdftex_ifabsnum:D
+ \__kernel_primitive:NN \ignoreligaturesinfont
+ \pdftex_ignoreligaturesinfont:D
+ \__kernel_primitive:NN \insertht \pdftex_insertht:D
+ \__kernel_primitive:NN \lastsavedboxresourceindex
+ \pdftex_pdflastxform:D
+ \__kernel_primitive:NN \lastsavedimageresourceindex
+ \pdftex_pdflastximage:D
+ \__kernel_primitive:NN \lastsavedimageresourcepages
+ \pdftex_pdflastximagepages:D
+ \__kernel_primitive:NN \lastxpos \pdftex_lastxpos:D
+ \__kernel_primitive:NN \lastypos \pdftex_lastypos:D
+ \__kernel_primitive:NN \normaldeviate \pdftex_normaldeviate:D
+ \__kernel_primitive:NN \outputmode \pdftex_pdfoutput:D
+ \__kernel_primitive:NN \pageheight \pdftex_pageheight:D
+ \__kernel_primitive:NN \pagewidth \pdftex_pagewith:D
+ \__kernel_primitive:NN \protrudechars \pdftex_protrudechars:D
+ \__kernel_primitive:NN \pxdimen \pdftex_pxdimen:D
+ \__kernel_primitive:NN \randomseed \pdftex_randomseed:D
+ \__kernel_primitive:NN \useboxresource \pdftex_pdfrefxform:D
+ \__kernel_primitive:NN \useimageresource \pdftex_pdfrefximage:D
+ \__kernel_primitive:NN \savepos \pdftex_savepos:D
+ \__kernel_primitive:NN \saveboxresource \pdftex_pdfxform:D
+ \__kernel_primitive:NN \saveimageresource \pdftex_pdfximage:D
+ \__kernel_primitive:NN \setrandomseed \pdftex_setrandomseed:D
+ \__kernel_primitive:NN \tracingfonts \pdftex_tracingfonts:D
+ \__kernel_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
+ \__kernel_primitive:NN \Uchar \utex_char:D
+ \__kernel_primitive:NN \Ucharcat \utex_charcat:D
+ \__kernel_primitive:NN \Udelcode \utex_delcode:D
+ \__kernel_primitive:NN \Udelcodenum \utex_delcodenum:D
+ \__kernel_primitive:NN \Udelimiter \utex_delimiter:D
+ \__kernel_primitive:NN \Udelimiterover \utex_delimiterover:D
+ \__kernel_primitive:NN \Udelimiterunder \utex_delimiterunder:D
+ \__kernel_primitive:NN \Uhextensible \utex_hextensible:D
+ \__kernel_primitive:NN \Umathaccent \utex_mathaccent:D
+ \__kernel_primitive:NN \Umathaxis \utex_mathaxis:D
+ \__kernel_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
+ \__kernel_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
+ \__kernel_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
+ \__kernel_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
+ \__kernel_primitive:NN \Umathbinopspacing \utex_binopspacing:D
+ \__kernel_primitive:NN \Umathbinordspacing \utex_binordspacing:D
+ \__kernel_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
+ \__kernel_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
+ \__kernel_primitive:NN \Umathchar \utex_mathchar:D
+ \__kernel_primitive:NN \Umathcharclass \utex_mathcharclass:D
+ \__kernel_primitive:NN \Umathchardef \utex_mathchardef:D
+ \__kernel_primitive:NN \Umathcharfam \utex_mathcharfam:D
+ \__kernel_primitive:NN \Umathcharnum \utex_mathcharnum:D
+ \__kernel_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
+ \__kernel_primitive:NN \Umathcharslot \utex_mathcharslot:D
+ \__kernel_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
+ \__kernel_primitive:NN \Umathcloseclosespacing
+ \utex_closeclosespacing:D
+ \__kernel_primitive:NN \Umathcloseinnerspacing
+ \utex_closeinnerspacing:D
+ \__kernel_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
+ \__kernel_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
+ \__kernel_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
+ \__kernel_primitive:NN \Umathclosepunctspacing
+ \utex_closepunctspacing:D
+ \__kernel_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
+ \__kernel_primitive:NN \Umathcode \utex_mathcode:D
+ \__kernel_primitive:NN \Umathcodenum \utex_mathcodenum:D
+ \__kernel_primitive:NN \Umathconnectoroverlapmin
+ \utex_connectoroverlapmin:D
+ \__kernel_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
+ \__kernel_primitive:NN \Umathfractiondenomdown
+ \utex_fractiondenomdown:D
+ \__kernel_primitive:NN \Umathfractiondenomvgap
+ \utex_fractiondenomvgap:D
+ \__kernel_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
+ \__kernel_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
+ \__kernel_primitive:NN \Umathfractionrule \utex_fractionrule:D
+ \__kernel_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
+ \__kernel_primitive:NN \Umathinnerclosespacing
+ \utex_innerclosespacing:D
+ \__kernel_primitive:NN \Umathinnerinnerspacing
+ \utex_innerinnerspacing:D
+ \__kernel_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
+ \__kernel_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
+ \__kernel_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
+ \__kernel_primitive:NN \Umathinnerpunctspacing
+ \utex_innerpunctspacing:D
+ \__kernel_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
+ \__kernel_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
+ \__kernel_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
+ \__kernel_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
+ \__kernel_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
+ \__kernel_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
+ \__kernel_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
+ \__kernel_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
+ \__kernel_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
+ \__kernel_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
+ \__kernel_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
+ \__kernel_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
+ \__kernel_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
+ \__kernel_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
+ \__kernel_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
+ \__kernel_primitive:NN \Umathopenopspacing \utex_openopspacing:D
+ \__kernel_primitive:NN \Umathopenordspacing \utex_openordspacing:D
+ \__kernel_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
+ \__kernel_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
+ \__kernel_primitive:NN \Umathoperatorsize \utex_operatorsize:D
+ \__kernel_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
+ \__kernel_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
+ \__kernel_primitive:NN \Umathopopspacing \utex_opopspacing:D
+ \__kernel_primitive:NN \Umathopordspacing \utex_opordspacing:D
+ \__kernel_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
+ \__kernel_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
+ \__kernel_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
+ \__kernel_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
+ \__kernel_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
+ \__kernel_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
+ \__kernel_primitive:NN \Umathordopspacing \utex_ordopspacing:D
+ \__kernel_primitive:NN \Umathordordspacing \utex_ordordspacing:D
+ \__kernel_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
+ \__kernel_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
+ \__kernel_primitive:NN \Umathoverbarkern \utex_overbarkern:D
+ \__kernel_primitive:NN \Umathoverbarrule \utex_overbarrule:D
+ \__kernel_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
+ \__kernel_primitive:NN \Umathoverdelimiterbgap
+ \utex_overdelimiterbgap:D
+ \__kernel_primitive:NN \Umathoverdelimitervgap
+ \utex_overdelimitervgap:D
+ \__kernel_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
+ \__kernel_primitive:NN \Umathpunctclosespacing
+ \utex_punctclosespacing:D
+ \__kernel_primitive:NN \Umathpunctinnerspacing
+ \utex_punctinnerspacing:D
+ \__kernel_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
+ \__kernel_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
+ \__kernel_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
+ \__kernel_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
+ \__kernel_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
+ \__kernel_primitive:NN \Umathquad \utex_quad:D
+ \__kernel_primitive:NN \Umathradicaldegreeafter
+ \utex_radicaldegreeafter:D
+ \__kernel_primitive:NN \Umathradicaldegreebefore
+ \utex_radicaldegreebefore:D
+ \__kernel_primitive:NN \Umathradicaldegreeraise
+ \utex_radicaldegreeraise:D
+ \__kernel_primitive:NN \Umathradicalkern \utex_radicalkern:D
+ \__kernel_primitive:NN \Umathradicalrule \utex_radicalrule:D
+ \__kernel_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
+ \__kernel_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
+ \__kernel_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
+ \__kernel_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
+ \__kernel_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
+ \__kernel_primitive:NN \Umathrelopspacing \utex_relopspacing:D
+ \__kernel_primitive:NN \Umathrelordspacing \utex_relordspacing:D
+ \__kernel_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
+ \__kernel_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
+ \__kernel_primitive:NN \Umathskewedfractionhgap
+ \utex_skewedfractionhgap:D
+ \__kernel_primitive:NN \Umathskewedfractionvgap
+ \utex_skewedfractionvgap:D
+ \__kernel_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
+ \__kernel_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
+ \__kernel_primitive:NN \Umathstacknumup \utex_stacknumup:D
+ \__kernel_primitive:NN \Umathstackvgap \utex_stackvgap:D
+ \__kernel_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
+ \__kernel_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
+ \__kernel_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
+ \__kernel_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
+ \__kernel_primitive:NN \Umathsubtopmax \utex_subtopmax:D
+ \__kernel_primitive:NN \Umathsupbottommin \utex_supbottommin:D
+ \__kernel_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
+ \__kernel_primitive:NN \Umathsupshiftup \utex_supshiftup:D
+ \__kernel_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
+ \__kernel_primitive:NN \Umathunderbarkern \utex_underbarkern:D
+ \__kernel_primitive:NN \Umathunderbarrule \utex_underbarrule:D
+ \__kernel_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
+ \__kernel_primitive:NN \Umathunderdelimiterbgap
+ \utex_underdelimiterbgap:D
+ \__kernel_primitive:NN \Umathunderdelimitervgap
+ \utex_underdelimitervgap:D
+ \__kernel_primitive:NN \Unosubscript \utex_nosubscript:D
+ \__kernel_primitive:NN \Unosuperscript \utex_nosuperscript:D
+ \__kernel_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
+ \__kernel_primitive:NN \Uradical \utex_radical:D
+ \__kernel_primitive:NN \Uroot \utex_root:D
+ \__kernel_primitive:NN \Uskewed \utex_skewed:D
+ \__kernel_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
+ \__kernel_primitive:NN \Ustack \utex_stack:D
+ \__kernel_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
+ \__kernel_primitive:NN \Ustartmath \utex_startmath:D
+ \__kernel_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
+ \__kernel_primitive:NN \Ustopmath \utex_stopmath:D
+ \__kernel_primitive:NN \Usubscript \utex_subscript:D
+ \__kernel_primitive:NN \Usuperscript \utex_superscript:D
+ \__kernel_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
+ \__kernel_primitive:NN \Uvextensible \utex_vextensible:D
+ \__kernel_primitive:NN \autospacing \ptex_autospacing:D
+ \__kernel_primitive:NN \autoxspacing \ptex_autoxspacing:D
+ \__kernel_primitive:NN \dtou \ptex_dtou:D
+ \__kernel_primitive:NN \epTeXinputencoding \ptex_inputencoding:D
+ \__kernel_primitive:NN \epTeXversion \ptex_epTeXversion:D
+ \__kernel_primitive:NN \euc \ptex_euc:D
+ \__kernel_primitive:NN \ifdbox \ptex_ifdbox:D
+ \__kernel_primitive:NN \ifddir \ptex_ifddir:D
+ \__kernel_primitive:NN \ifmdir \ptex_ifmdir:D
+ \__kernel_primitive:NN \iftbox \ptex_iftbox:D
+ \__kernel_primitive:NN \iftdir \ptex_iftdir:D
+ \__kernel_primitive:NN \ifybox \ptex_ifybox:D
+ \__kernel_primitive:NN \ifydir \ptex_ifydir:D
+ \__kernel_primitive:NN \inhibitglue \ptex_inhibitglue:D
+ \__kernel_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
+ \__kernel_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
+ \__kernel_primitive:NN \jfam \ptex_jfam:D
+ \__kernel_primitive:NN \jfont \ptex_jfont:D
+ \__kernel_primitive:NN \jis \ptex_jis:D
+ \__kernel_primitive:NN \kanjiskip \ptex_kanjiskip:D
+ \__kernel_primitive:NN \kansuji \ptex_kansuji:D
+ \__kernel_primitive:NN \kansujichar \ptex_kansujichar:D
+ \__kernel_primitive:NN \kcatcode \ptex_kcatcode:D
+ \__kernel_primitive:NN \kuten \ptex_kuten:D
+ \__kernel_primitive:NN \noautospacing \ptex_noautospacing:D
+ \__kernel_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
+ \__kernel_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
+ \__kernel_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
+ \__kernel_primitive:NN \ptexversion \ptex_ptexversion:D
+ \__kernel_primitive:NN \showmode \ptex_showmode:D
+ \__kernel_primitive:NN \sjis \ptex_sjis:D
+ \__kernel_primitive:NN \tate \ptex_tate:D
+ \__kernel_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
+ \__kernel_primitive:NN \tfont \ptex_tfont:D
+ \__kernel_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
+ \__kernel_primitive:NN \xspcode \ptex_xspcode:D
+ \__kernel_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
+ \__kernel_primitive:NN \yoko \ptex_yoko:D
+ \__kernel_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
+ \__kernel_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
+ \__kernel_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
+ \__kernel_primitive:NN \kchar \uptex_kchar:D
+ \__kernel_primitive:NN \kchardef \uptex_kchardef:D
+ \__kernel_primitive:NN \kuten \uptex_kuten:D
+ \__kernel_primitive:NN \ucs \uptex_ucs:D
+ \__kernel_primitive:NN \uptexversion \uptex_uptexversion:D
\tex_endgroup:D
\etex_ifdefined:D \@@end
\tex_let:D \tex_end:D \@@end
@@ -1299,57 +1355,62 @@
\tex_fi:D
\tex_fi:D
\etex_ifdefined:D \luatexsuppressfontnotfounderror
- \tex_let:D \luatex_alignmark:D \luatexalignmark
- \tex_let:D \luatex_aligntab:D \luatexaligntab
- \tex_let:D \luatex_attribute:D \luatexattribute
- \tex_let:D \luatex_attributedef:D \luatexattributedef
- \tex_let:D \luatex_catcodetable:D \luatexcatcodetable
- \tex_let:D \luatex_clearmarks:D \luatexclearmarks
- \tex_let:D \luatex_crampeddisplaystyle:D \luatexcrampeddisplaystyle
- \tex_let:D \luatex_crampedscriptscriptstyle:D \luatexcrampedscriptscriptstyle
- \tex_let:D \luatex_crampedscriptstyle:D \luatexcrampedscriptstyle
- \tex_let:D \luatex_crampedtextstyle:D \luatexcrampedtextstyle
- \tex_let:D \luatex_fontid:D \luatexfontid
- \tex_let:D \luatex_formatname:D \luatexformatname
- \tex_let:D \luatex_gleaders:D \luatexgleaders
- \tex_let:D \luatex_initcatcodetable:D \luatexinitcatcodetable
- \tex_let:D \luatex_latelua:D \luatexlatelua
- \tex_let:D \luatex_luaescapestring:D \luatexluaescapestring
- \tex_let:D \luatex_luafunction:D \luatexluafunction
- \tex_let:D \luatex_mathstyle:D \luatexmathstyle
- \tex_let:D \luatex_nokerns:D \luatexnokerns
- \tex_let:D \luatex_noligs:D \luatexnoligs
- \tex_let:D \luatex_outputbox:D \luatexoutputbox
- \tex_let:D \luatex_pageleftoffset:D \luatexpageleftoffset
- \tex_let:D \luatex_pagetopoffset:D \luatexpagetopoffset
- \tex_let:D \luatex_postexhyphenchar:D \luatexpostexhyphenchar
- \tex_let:D \luatex_posthyphenchar:D \luatexposthyphenchar
- \tex_let:D \luatex_preexhyphenchar:D \luatexpreexhyphenchar
- \tex_let:D \luatex_prehyphenchar:D \luatexprehyphenchar
- \tex_let:D \luatex_savecatcodetable:D \luatexsavecatcodetable
- \tex_let:D \luatex_scantextokens:D \luatexscantextokens
- \tex_let:D \luatex_suppressifcsnameerror:D \luatexsuppressifcsnameerror
- \tex_let:D \luatex_suppresslongerror:D \luatexsuppresslongerror
- \tex_let:D \luatex_suppressmathparerror:D \luatexsuppressmathparerror
- \tex_let:D \luatex_suppressoutererror:D \luatexsuppressoutererror
- \tex_let:D \utex_char:D \luatexUchar
- \tex_let:D \xetex_suppressfontnotfounderror:D \luatexsuppressfontnotfounderror
- \tex_let:D \luatex_bodydir:D \luatexbodydir
- \tex_let:D \luatex_boxdir:D \luatexboxdir
- \tex_let:D \luatex_leftghost:D \luatexleftghost
- \tex_let:D \luatex_localbrokenpenalty:D \luatexlocalbrokenpenalty
- \tex_let:D \luatex_localinterlinepenalty:D \luatexlocalinterlinepenalty
- \tex_let:D \luatex_localleftbox:D \luatexlocalleftbox
- \tex_let:D \luatex_localrightbox:D \luatexlocalrightbox
- \tex_let:D \luatex_mathdir:D \luatexmathdir
- \tex_let:D \luatex_pagebottomoffset:D \luatexpagebottomoffset
- \tex_let:D \luatex_pagedir:D \luatexpagedir
- \tex_let:D \pdftex_pageheight:D \luatexpageheight
- \tex_let:D \luatex_pagerightoffset:D \luatexpagerightoffset
- \tex_let:D \pdftex_pagewidth:D \luatexpagewidth
- \tex_let:D \luatex_pardir:D \luatexpardir
- \tex_let:D \luatex_rightghost:D \luatexrightghost
- \tex_let:D \luatex_textdir:D \luatextextdir
+ \tex_let:D \luatex_alignmark:D \luatexalignmark
+ \tex_let:D \luatex_aligntab:D \luatexaligntab
+ \tex_let:D \luatex_attribute:D \luatexattribute
+ \tex_let:D \luatex_attributedef:D \luatexattributedef
+ \tex_let:D \luatex_catcodetable:D \luatexcatcodetable
+ \tex_let:D \luatex_clearmarks:D \luatexclearmarks
+ \tex_let:D \luatex_crampeddisplaystyle:D \luatexcrampeddisplaystyle
+ \tex_let:D \luatex_crampedscriptscriptstyle:D
+ \luatexcrampedscriptscriptstyle
+ \tex_let:D \luatex_crampedscriptstyle:D \luatexcrampedscriptstyle
+ \tex_let:D \luatex_crampedtextstyle:D \luatexcrampedtextstyle
+ \tex_let:D \luatex_fontid:D \luatexfontid
+ \tex_let:D \luatex_formatname:D \luatexformatname
+ \tex_let:D \luatex_gleaders:D \luatexgleaders
+ \tex_let:D \luatex_initcatcodetable:D \luatexinitcatcodetable
+ \tex_let:D \luatex_latelua:D \luatexlatelua
+ \tex_let:D \luatex_luaescapestring:D \luatexluaescapestring
+ \tex_let:D \luatex_luafunction:D \luatexluafunction
+ \tex_let:D \luatex_mathstyle:D \luatexmathstyle
+ \tex_let:D \luatex_nokerns:D \luatexnokerns
+ \tex_let:D \luatex_noligs:D \luatexnoligs
+ \tex_let:D \luatex_outputbox:D \luatexoutputbox
+ \tex_let:D \luatex_pageleftoffset:D \luatexpageleftoffset
+ \tex_let:D \luatex_pagetopoffset:D \luatexpagetopoffset
+ \tex_let:D \luatex_postexhyphenchar:D \luatexpostexhyphenchar
+ \tex_let:D \luatex_posthyphenchar:D \luatexposthyphenchar
+ \tex_let:D \luatex_preexhyphenchar:D \luatexpreexhyphenchar
+ \tex_let:D \luatex_prehyphenchar:D \luatexprehyphenchar
+ \tex_let:D \luatex_savecatcodetable:D \luatexsavecatcodetable
+ \tex_let:D \luatex_scantextokens:D \luatexscantextokens
+ \tex_let:D \luatex_suppressifcsnameerror:D
+ \luatexsuppressifcsnameerror
+ \tex_let:D \luatex_suppresslongerror:D \luatexsuppresslongerror
+ \tex_let:D \luatex_suppressmathparerror:D
+ \luatexsuppressmathparerror
+ \tex_let:D \luatex_suppressoutererror:D \luatexsuppressoutererror
+ \tex_let:D \utex_char:D \luatexUchar
+ \tex_let:D \xetex_suppressfontnotfounderror:D
+ \luatexsuppressfontnotfounderror
+ \tex_let:D \luatex_bodydir:D \luatexbodydir
+ \tex_let:D \luatex_boxdir:D \luatexboxdir
+ \tex_let:D \luatex_leftghost:D \luatexleftghost
+ \tex_let:D \luatex_localbrokenpenalty:D \luatexlocalbrokenpenalty
+ \tex_let:D \luatex_localinterlinepenalty:D
+ \luatexlocalinterlinepenalty
+ \tex_let:D \luatex_localleftbox:D \luatexlocalleftbox
+ \tex_let:D \luatex_localrightbox:D \luatexlocalrightbox
+ \tex_let:D \luatex_mathdir:D \luatexmathdir
+ \tex_let:D \luatex_pagebottomoffset:D \luatexpagebottomoffset
+ \tex_let:D \luatex_pagedir:D \luatexpagedir
+ \tex_let:D \pdftex_pageheight:D \luatexpageheight
+ \tex_let:D \luatex_pagerightoffset:D \luatexpagerightoffset
+ \tex_let:D \pdftex_pagewidth:D \luatexpagewidth
+ \tex_let:D \luatex_pardir:D \luatexpardir
+ \tex_let:D \luatex_rightghost:D \luatexrightghost
+ \tex_let:D \luatex_textdir:D \luatextextdir
\tex_fi:D
\tex_ifnum:D 0
\etex_ifdefined:D \pdftex_pdftexversion:D 1 \tex_fi:D
@@ -1427,8 +1488,9 @@
\tex_chardef:D \exp_end: = 0 ~
\tex_let:D \token_to_meaning:N \tex_meaning:D
\tex_let:D \cs_meaning:N \tex_meaning:D
-\tex_let:D \tl_to_str:n \etex_detokenize:D
-\tex_let:D \token_to_str:N \tex_string:D
+\tex_let:D \tl_to_str:n \etex_detokenize:D
+\tex_let:D \token_to_str:N \tex_string:D
+\tex_let:D \__kernel_tl_to_str:w \etex_detokenize:D
\tex_let:D \scan_stop: \tex_relax:D
\tex_let:D \group_begin: \tex_begingroup:D
\tex_let:D \group_end: \tex_endgroup:D
@@ -1492,6 +1554,7 @@
\cs_set_nopar:Npx \l__exp_internal_tl {#1}
\l__exp_internal_tl
}
+\cs_set:Npn \use_x:n #1 { \luatex_expanded:D {#1} }
\cs_set:Npn \use:n #1 {#1}
\cs_set:Npn \use:nn #1#2 {#1#2}
\cs_set:Npn \use:nnn #1#2#3 {#1#2#3}
@@ -1511,7 +1574,8 @@
\cs_set:Npn \use_none_delimit_by_q_recursion_stop:w #1 \q_recursion_stop { }
\cs_set:Npn \use_i_delimit_by_q_nil:nw #1#2 \q_nil {#1}
\cs_set:Npn \use_i_delimit_by_q_stop:nw #1#2 \q_stop {#1}
-\cs_set:Npn \use_i_delimit_by_q_recursion_stop:nw #1#2 \q_recursion_stop {#1}
+\cs_set:Npn \use_i_delimit_by_q_recursion_stop:nw
+ #1#2 \q_recursion_stop {#1}
\cs_set:Npn \use_none:n #1 { }
\cs_set:Npn \use_none:nn #1#2 { }
\cs_set:Npn \use_none:nnn #1#2#3 { }
@@ -1521,17 +1585,17 @@
\cs_set:Npn \use_none:nnnnnnn #1#2#3#4#5#6#7 { }
\cs_set:Npn \use_none:nnnnnnnn #1#2#3#4#5#6#7#8 { }
\cs_set:Npn \use_none:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { }
-\cs_set_protected:Npn \__kernel_debug:TF #1#2 {#2}
+\cs_set_protected:Npn \__kernel_if_debug:TF #1#2 {#2}
\tex_ifodd:D \l at expl@enable at debug@bool
- \cs_set_protected:Npn \__kernel_debug:TF #1#2 {#1}
+ \cs_set_protected:Npn \__kernel_if_debug:TF #1#2 {#1}
\fi:
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \debug_on:n #1
{
\exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
{
- \cs_if_exist_use:cF { __debug_##1_on: }
+ \cs_if_exist_use:cF { __debug_ ##1 _on: }
{ \__kernel_msg_error:nnn { kernel } { debug } {##1} }
}
}
@@ -1539,7 +1603,7 @@
{
\exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
{
- \cs_if_exist_use:cF { __debug_##1_off: }
+ \cs_if_exist_use:cF { __debug_ ##1 _off: }
{ \__kernel_msg_error:nnn { kernel } { debug } {##1} }
}
}
@@ -1556,7 +1620,7 @@
{ \tl_to_str:n { \debug_off:n {#1} } }
}
}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_nopar:Npn \l__debug_suspended_tl { }
\cs_set_protected:Npn \debug_suspend:
@@ -1579,7 +1643,7 @@
\cs_set_protected:Npn \debug_suspend: { }
\cs_set_protected:Npn \debug_resume: { }
}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: }
{
@@ -1636,7 +1700,7 @@
\fi:
}
{ }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__debug_chk_var_scope_aux:NN #1#2
{ \exp_args:NNf \__debug_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
@@ -1666,7 +1730,7 @@
}
}
{ }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: }
{
@@ -1674,7 +1738,7 @@
{
\__debug_suspended:T { ##1 \use_none:nnnnnnn }
\exp_after:wN \__debug_chk_expr_aux:nNnN
- \exp_after:wN { \tex_the:D ##2 ##1 \tex_relax:D }
+ \exp_after:wN { \tex_the:D ##2 ##1 \scan_stop: }
##2
}
}
@@ -1687,7 +1751,7 @@
{
\tex_romannumeral:D - 0
\exp_after:wN \use_none:n
- \__int_value:w #3 #2 #1 \tex_relax:D
+ \int_value:w #3 #2 #1 \scan_stop:
}
{
\__kernel_msg_expandable_error:nnnn
@@ -1697,7 +1761,7 @@
}
}
{ }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: }
{
@@ -1713,7 +1777,7 @@
\fi:
}
{ }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__debug_deprecation_on:
{ \g__debug_deprecation_on_tl }
@@ -1730,16 +1794,23 @@
{
\cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2 { }
}
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5#
{
\if_meaning:w \cs_new_protected:Npn #3
+ \exp_after:wN \use_i:nn
\else:
- \__kernel_msg_error:nnx { kernel } { debug-unpatchable }
- { \token_to_str:N #3 ~(for~deprecation) }
+ \if_meaning:w \cs_new:Npn #3
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_ii:nn
+ \else:
+ \__kernel_msg_error:nnx { kernel } { debug-unpatchable }
+ { \token_to_str:N #3 ~(for~deprecation) }
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nn
+ \fi:
\fi:
- \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
+ { \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5} }
+ { \__debug_deprecation_expandable:nnNnn {#1} {#2} #4 {#5} }
}
\cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5
{
@@ -1746,7 +1817,7 @@
\tl_gput_right:Nn \g__debug_deprecation_on_tl
{
\tex_let:D #3 \scan_stop:
- \__deprecation_error:Nnn #3 {#2} {#1}
+ \__kernel_deprecation_error:Nnn #3 {#2} {#1}
}
\tl_gput_right:Nn \g__debug_deprecation_off_tl
{
@@ -1762,9 +1833,23 @@
\exp_not:N #3
}
}
+ \cs_set_protected:Npn \__debug_deprecation_expandable:nnNnn #1#2#3#4#5
+ {
+ \tl_gput_right:Nn \g__debug_deprecation_on_tl
+ {
+ \tex_let:D #3 \scan_stop:
+ \__kernel_deprecation_error:Nnn #3 {#2} {#1}
+ }
+ \tl_gput_right:Nn \g__debug_deprecation_off_tl
+ {
+ \tex_let:D #3 \scan_stop:
+ \cs_set:Npn #3 #4 {#5}
+ }
+ \cs_new:Npn #3 #4 {#5}
+ }
}
{ \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2 { } }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2#3#4#5#
{ \__debug_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } }
@@ -1783,11 +1868,12 @@
{ \__kernel_patch_args:nnnNNpn { } { } }
\cs_set_protected:Npn \__kernel_patch_conditional_args:nNNpnn
{ \__kernel_patch_conditional_args:nnnNNpnn { } { } }
-\__kernel_debug:TF
+\__kernel_if_debug:TF
{
\cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3#4#5#6#
{ \__debug_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} }
- \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6#
+ \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn
+ #1#2#3#4#5#6#
{ \__debug_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} }
\cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7
{
@@ -1806,7 +1892,8 @@
}
{
\cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3 { }
- \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3 { }
+ \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn
+ #1#2#3 { }
}
\cs_set:Npn \prg_return_true:
{ \exp_after:wN \use_i:nn \exp:w }
@@ -1822,8 +1909,12 @@
{ \__prg_generate_conditional_parm:nnNpnn { new } { _protected } }
\cs_set_protected:Npn \__prg_generate_conditional_parm:nnNpnn #1#2#3#4#
{
- \__cs_split_function:NN #3 \__prg_generate_conditional:nnNnnnnn
- {#1} {#2} {#4}
+ \use:x
+ {
+ \__prg_generate_conditional:nnNnnnnn
+ \cs_split_function:N #3
+ }
+ {#1} {#2} {#4}
}
\cs_set_protected:Npn \prg_set_conditional:Nnn
{ \__prg_generate_conditional_count:nnNnn { set } { } }
@@ -1835,12 +1926,16 @@
{ \__prg_generate_conditional_count:nnNnn { new } { _protected } }
\cs_set_protected:Npn \__prg_generate_conditional_count:nnNnn #1#2#3
{
- \__cs_split_function:NN #3 \__prg_generate_conditional_count:nnNnnnn
- {#1} {#2}
+ \use:x
+ {
+ \__prg_generate_conditional_count:nnNnnnn
+ \cs_split_function:N #3
+ }
+ {#1} {#2}
}
\cs_set_protected:Npn \__prg_generate_conditional_count:nnNnnnn #1#2#3#4#5
{
- \__cs_parm_from_arg_count:nnF
+ \__kernel_cs_parm_from_arg_count:nnF
{ \__prg_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
{ \tl_count:n {#2} }
{
@@ -1926,8 +2021,8 @@
\use:x
{
\exp_not:N \__prg_set_eq_conditional:nnNnnNNw
- \__cs_split_function:NN #2 \prg_do_nothing:
- \__cs_split_function:NN #3 \prg_do_nothing:
+ \cs_split_function:N #2
+ \cs_split_function:N #3
\exp_not:N #1
\tl_to_str:n {#4}
\exp_not:n { , \q_recursion_tail , \q_recursion_stop }
@@ -1990,27 +2085,23 @@
}
\cs_set:Npn \__cs_to_str:N #1 { \c_zero }
\cs_set:Npn \__cs_to_str:w #1 \__cs_to_str:N
- { - \__int_value:w \fi: \exp_after:wN \c_zero }
-\cs_set:Npx \__cs_split_function:NN #1
+ { - \int_value:w \fi: \exp_after:wN \c_zero }
+\cs_set_protected:Npn \__cs_tmp:w #1
{
- \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN
- \exp_not:N \exp_after:wN \exp_not:N \__cs_split_function_auxi:w
- \exp_not:N \cs_to_str:N #1 \exp_not:N \q_mark \c_true_bool
- \token_to_str:N : \exp_not:N \q_mark \c_false_bool
- \exp_not:N \q_stop
+ \cs_set:Npn \cs_split_function:N ##1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \__cs_split_function_auxi:w
+ \cs_to_str:N ##1 \q_mark \c_true_bool
+ #1 \q_mark \c_false_bool \q_stop
+ }
+ \cs_set:Npn \__cs_split_function_auxi:w
+ ##1 #1 ##2 \q_mark ##3##4 \q_stop
+ { \__cs_split_function_auxii:w ##1 \q_mark \q_stop {##2} ##3 }
+ \cs_set:Npn \__cs_split_function_auxii:w ##1 \q_mark ##2 \q_stop
+ { {##1} }
}
-\use:x
- {
- \cs_set:Npn \exp_not:N \__cs_split_function_auxi:w
- ##1 \token_to_str:N : ##2 \exp_not:N \q_mark ##3##4 \exp_not:N \q_stop ##5
- }
- { \__cs_split_function_auxii:w #5 #1 \q_mark \q_stop {#2} #3 }
-\cs_set:Npn \__cs_split_function_auxii:w #1#2 \q_mark #3 \q_stop
- { #1 {#2} }
-\cs_set:Npn \__cs_get_function_name:N #1
- { \__cs_split_function:NN #1 \use_i:nnn }
-\cs_set:Npn \__cs_get_function_signature:N #1
- { \__cs_split_function:NN #1 \use_ii:nnn }
+\exp_after:wN \__cs_tmp:w \token_to_str:N :
\prg_set_conditional:Npnn \cs_if_exist:N #1 { p , T , F , TF }
{
\if_meaning:w #1 \scan_stop:
@@ -2085,7 +2176,7 @@
{ \cs_if_exist:cTF {#1} { \use:c {#1} } { } }
\cs_set_protected:Npn \__kernel_msg_error:nnxx #1#2#3#4
{
- \tex_newlinechar:D = `\^^J \tex_relax:D
+ \tex_newlinechar:D = `\^^J \scan_stop:
\tex_errmessage:D
{
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~! ^^J
@@ -2107,9 +2198,12 @@
\cs_set_protected:Npn \iow_term:x
{ \tex_immediate:D \tex_write:D 16 }
\__kernel_patch:nnNNpn { }
- { \__kernel_debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
-\cs_set_protected:Npn \__chk_if_free_cs:N #1
{
+ \__kernel_debug_log:x
+ { Defining~\token_to_str:N #1~ \msg_line_context: }
+ }
+\cs_set_protected:Npn \__kernel_chk_if_free_cs:N #1
+ {
\cs_if_free:NF #1
{
\__kernel_msg_error:nnxx { kernel } { command-already-defined }
@@ -2116,13 +2210,13 @@
{ \token_to_str:N #1 } { \token_to_meaning:N #1 }
}
}
-\cs_set_protected:Npn \__chk_if_free_cs:c
- { \exp_args:Nc \__chk_if_free_cs:N }
+\cs_set_protected:Npn \__kernel_chk_if_free_cs:c
+ { \exp_args:Nc \__kernel_chk_if_free_cs:N }
\cs_set:Npn \__cs_tmp:w #1#2
{
\cs_set_protected:Npn #1 ##1
{
- \__chk_if_free_cs:N ##1
+ \__kernel_chk_if_free_cs:N ##1
#2 ##1
}
}
@@ -2170,7 +2264,7 @@
\cs_new_protected:Npn \cs_gset_eq:cc { \exp_args:Ncc \cs_gset_eq:NN }
\cs_new_protected:Npn \cs_new_eq:NN #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\tex_global:D \cs_set_eq:NN #1
}
\cs_new_protected:Npn \cs_new_eq:cN { \exp_args:Nc \cs_new_eq:NN }
@@ -2187,12 +2281,12 @@
\fi:
{ \cs_gset_eq:cN {#1} \tex_undefined:D }
}
-\cs_set_protected:Npn \__cs_parm_from_arg_count:nnF #1#2
+\cs_set_protected:Npn \__kernel_cs_parm_from_arg_count:nnF #1#2
{
\exp_args:Nx \__cs_parm_from_arg_count_test:nnF
{
\exp_after:wN \exp_not:n
- \if_case:w \__int_eval:n {#2}
+ \if_case:w \int_eval:n {#2}
{ }
\or: { ##1 }
\or: { ##1##2 }
@@ -2218,7 +2312,9 @@
{ #2 {#1} }
}
\cs_new:Npn \__cs_count_signature:N #1
- { \int_eval:n { \__cs_split_function:NN #1 \__cs_count_signature:nnN } }
+ { \exp_args:Nf \__cs_count_signature:n { \cs_split_function:N #1 } }
+\cs_new:Npn \__cs_count_signature:n #1
+ { \int_eval:n { \__cs_count_signature:nnN #1 } }
\cs_new:Npn \__cs_count_signature:nnN #1#2#3
{
\if_meaning:w \c_true_bool #3
@@ -2231,7 +2327,7 @@
{ \exp_args:Nc \__cs_count_signature:N }
\cs_new_protected:Npn \cs_generate_from_arg_count:NNnn #1#2#3#4
{
- \__cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
+ \__kernel_cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
{
\__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
{ \token_to_str:N #1 } { \int_eval:n {#3} }
@@ -2253,8 +2349,12 @@
}
\cs_new_protected:Npn \__cs_generate_from_signature:NNn #1#2
{
- \__cs_split_function:NN #2 \__cs_generate_from_signature:nnNNNn
- #1 #2
+ \use:x
+ {
+ \__cs_generate_from_signature:nnNNNn
+ \cs_split_function:N #2
+ }
+ #1 #2
}
\cs_new_protected:Npn \__cs_generate_from_signature:nnNNNn #1#2#3#4#5#6
{
@@ -2352,7 +2452,7 @@
\cs_new:Npn \cs_if_eq:ccTF { \exp_args:Ncc \cs_if_eq:NNTF }
\cs_new:Npn \cs_if_eq:ccT { \exp_args:Ncc \cs_if_eq:NNT }
\cs_new:Npn \cs_if_eq:ccF { \exp_args:Ncc \cs_if_eq:NNF }
-\cs_new_protected:Npn \__kernel_check_defined:NT #1#2
+\cs_new_protected:Npn \__kernel_chk_defined:NT #1#2
{
\cs_if_exist:NTF #1
{#2}
@@ -2371,7 +2471,7 @@
{ \exp_args:Nc \__kernel_register_log:N }
\cs_new_protected:Npn \__kernel_register_show_aux:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{
\exp_args:No \__kernel_register_show_aux:nNN
{ \tex_the:D #2 } #2 #1
@@ -2393,19 +2493,19 @@
\group_end:
#1 { \token_to_str:N #2 = \cs_meaning:N #2 }
}
-\cs_new_nopar:Npn \prg_do_nothing: { }
-\cs_new_eq:NN \__prg_break_point:Nn \use_ii:nn
-\cs_new:Npn \__prg_map_break:Nn #1#2#3 \__prg_break_point:Nn #4#5
+\cs_new:Npn \prg_do_nothing: { }
+\cs_new_eq:NN \prg_break_point:Nn \use_ii:nn
+\cs_new:Npn \prg_map_break:Nn #1#2#3 \prg_break_point:Nn #4#5
{
#5
\if_meaning:w #1 #4
\exp_after:wN \use_iii:nnn
\fi:
- \__prg_map_break:Nn #1 {#2}
+ \prg_map_break:Nn #1 {#2}
}
-\cs_new_eq:NN \__prg_break_point: \prg_do_nothing:
-\cs_new:Npn \__prg_break: #1 \__prg_break_point: { }
-\cs_new:Npn \__prg_break:n #1#2 \__prg_break_point: {#1}
+\cs_new_eq:NN \prg_break_point: \prg_do_nothing:
+\cs_new:Npn \prg_break: #1 \prg_break_point: { }
+\cs_new:Npn \prg_break:n #1#2 \prg_break_point: {#1}
%% File: l3expan.dtx Copyright (C) 1990-2018 The LaTeX3 project
\cs_new:Npn \__exp_arg_next:nnn #1#2#3 { #2 \::: { #3 {#1} } }
\cs_new:Npn \__exp_arg_next:Nnn #1#2#3 { #2 \::: { #3 #1 } }
@@ -2426,8 +2526,9 @@
\use:nn { \cs_new_eq:NN \exp_stop_f: } { ~ }
\cs_new_protected:Npn \::x #1 \::: #2#3
{
- \cs_set_nopar:Npx \l__exp_internal_tl { {#3} }
- \exp_after:wN \__exp_arg_next:nnn \l__exp_internal_tl {#1} {#2}
+ \cs_set_nopar:Npx \l__exp_internal_tl
+ { \exp_not:n { #1 \::: } { \exp_not:n {#2} {#3} } }
+ \l__exp_internal_tl
}
\cs_new:Npn \::V #1 \::: #2#3
{
@@ -2674,25 +2775,29 @@
{ \exp_after:wN \__exp_last_two_unbraced:noN \exp_after:wN {#3} {#2} #1 }
\cs_new:Npn \__exp_last_two_unbraced:noN #1#2#3
{ \exp_after:wN #3 #2 #1 }
+\cs_new_eq:NN \__kernel_exp_not:w \etex_unexpanded:D
\cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: }
-\cs_new:Npn \exp_not:o #1 { \etex_unexpanded:D \exp_after:wN {#1} }
+\cs_new:Npn \exp_not:o #1 { \__kernel_exp_not:w \exp_after:wN {#1} }
\cs_new:Npn \exp_not:f #1
{ \etex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
\cs_new:Npn \exp_not:V #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{ \exp:w \__exp_eval_register:N #1 }
}
\cs_new:Npn \exp_not:v #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{ \exp:w \__exp_eval_register:c {#1} }
}
\group_begin:
\tex_catcode:D `\^^@ = 13
\cs_new_protected:Npn \exp_end_continue_f:w { `^^@ }
- \cs_new:Npn ^^@
- { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } }
+ \if_cs_exist:N ^^@
+ \else:
+ \cs_new:Npn ^^@
+ { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } }
+ \fi:
\cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 }
\group_end:
\__kernel_patch:nnNNpn { \__kernel_chk_cs_exist:N #1 } { }
@@ -2699,11 +2804,15 @@
\cs_new_protected:Npn \cs_generate_variant:Nn #1#2
{
\__cs_generate_variant:N #1
- \exp_after:wN \__cs_split_function:NN
- \exp_after:wN #1
- \exp_after:wN \__cs_generate_variant:nnNN
- \exp_after:wN #1
- \tl_to_str:n {#2} , \scan_stop: , \q_recursion_stop
+ \use:x
+ {
+ \__cs_generate_variant:nnNN
+ \cs_split_function:N #1
+ \exp_not:N #1
+ \tl_to_str:n {#2} ,
+ \exp_not:N \scan_stop: ,
+ \exp_not:N \q_recursion_stop
+ }
}
\cs_new_protected:Npn \cs_generate_variant:cn
{ \exp_args:Nc \cs_generate_variant:Nn }
@@ -2840,7 +2949,8 @@
#5
}
}
-\cs_new:Npn \__cs_generate_variant_loop_special:NNwNNnn #1#2#3 \q_stop #4#5#6#7
+\cs_new:Npn \__cs_generate_variant_loop_special:NNwNNnn
+ #1#2#3 \q_stop #4#5#6#7
{
#3 \q_stop #4 #5 {#6} {#7}
\exp_not:n
@@ -2903,13 +3013,10 @@
{ : \exp_not:N \use_i:nn }
}
}
-\use:x
+\exp_last_unbraced:NNNNo
+ \cs_new_protected:Npn \__cs_generate_internal_variant:wwnNwnn #1
+ { \token_to_str:N x } #2 \q_mark #3#4#5 \q_stop #6#7
{
- \cs_new_protected:Npn \exp_not:N \__cs_generate_internal_variant:wwnNwnn
- ##1 \token_to_str:N x ##2 \exp_not:N \q_mark
- ##3 ##4 ##5 \exp_not:N \q_stop ##6 ##7
- }
- {
#3
\cs_if_free:cT {#6} { #4 {#6} {#7} }
}
@@ -2919,7 +3026,13 @@
\__cs_generate_internal_variant_loop:n
}
\cs_new_protected:Npn \prg_generate_conditional_variant:Nnn #1
- { \__cs_split_function:NN #1 \__cs_generate_variant:nnNnn }
+ {
+ \use:x
+ {
+ \__cs_generate_variant:nnNnn
+ \cs_split_function:N #1
+ }
+ }
\cs_new_protected:Npn \__cs_generate_variant:nnNnn #1#2#3#4#5
{
\if_meaning:w \c_false_bool #3
@@ -2958,10 +3071,35 @@
{ \cs_generate_variant:cn { #1 : #2 F } }
\cs_new_protected:Npn \__cs_generate_variant_TF_form:nnn #1#2
{ \cs_generate_variant:cn { #1 : #2 TF } }
+\cs_new_protected:Npn \exp_args_generate:n #1
+ {
+ \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
+ {
+ \str_map_inline:nn {##1}
+ {
+ \str_if_in:nnF { NnpcofVvx } {####1}
+ {
+ \__kernel_msg_error:nnnn { kernel } { invalid-exp-args }
+ {####1} {##1}
+ \str_map_break:n { \use_none:nnnn }
+ }
+ }
+ \exp_args:Nc \__cs_args_generate:Nn { exp_args:N ##1 } {##1}
+ }
+ }
+\cs_new_protected:Npn \__cs_args_generate:Nn #1#2
+ {
+ \cs_if_exist:NF #1
+ {
+ \str_if_in:nnTF {#2} { x } { \cs_new_protected:Npx } { \cs_new:Npx }
+ #1 { \tl_map_function:nN { #2 : } \__cs_args_generate:n }
+ }
+ }
+\cs_new:Npn \__cs_args_generate:n #1 { \exp_not:c { :: #1 } }
%% File: l3tl.dtx Copyright (C) 1990-2018 The LaTeX3 Project
\cs_new_protected:Npn \tl_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_eq:NN #1 \c_empty_tl
}
\cs_generate_variant:Nn \tl_new:N { c }
@@ -2968,13 +3106,13 @@
\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
\cs_new_protected:Npn \tl_const:Nn #1#2
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
}
\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
\cs_new_protected:Npn \tl_const:Nx #1#2
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_nopar:Npx #1 {#2}
}
\cs_generate_variant:Nn \tl_const:Nn { c }
@@ -2991,23 +3129,25 @@
{ \tl_if_exist:NTF #1 { \tl_gclear:N #1 } { \tl_new:N #1 } }
\cs_generate_variant:Nn \tl_clear_new:N { c }
\cs_generate_variant:Nn \tl_gclear_new:N { c }
-\tex_ifodd:D \l at expl@enable at debug@bool
- \cs_new_protected:Npn \tl_set_eq:NN #1#2
- {
- \__kernel_chk_var_local:N #1
- \__kernel_chk_var_exist:N #2
- \cs_set_eq:NN #1 #2
- }
- \cs_new_protected:Npn \tl_gset_eq:NN #1#2
- {
- \__kernel_chk_var_global:N #1
- \__kernel_chk_var_exist:N #2
- \cs_gset_eq:NN #1 #2
- }
-\else:
- \cs_new_eq:NN \tl_set_eq:NN \cs_set_eq:NN
- \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
-\fi:
+\__kernel_if_debug:TF
+ {
+ \cs_new_protected:Npn \tl_set_eq:NN #1#2
+ {
+ \__kernel_chk_var_local:N #1
+ \__kernel_chk_var_exist:N #2
+ \cs_set_eq:NN #1 #2
+ }
+ \cs_new_protected:Npn \tl_gset_eq:NN #1#2
+ {
+ \__kernel_chk_var_global:N #1
+ \__kernel_chk_var_exist:N #2
+ \cs_gset_eq:NN #1 #2
+ }
+ }
+ {
+ \cs_new_eq:NN \tl_set_eq:NN \cs_set_eq:NN
+ \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
+ }
\cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
\cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
\__kernel_patch:nnNNpn
@@ -3147,7 +3287,8 @@
}
{
\group_begin:
- \exp_args:No \etex_everyeof:D { \c__tl_rescan_marker_tl \exp_not:N }
+ \exp_args:No \etex_everyeof:D
+ { \c__tl_rescan_marker_tl \exp_not:N }
\int_compare:nNnT \tex_endlinechar:D = { 32 }
{ \int_set:Nn \tex_endlinechar:D { -1 } }
\tex_newlinechar:D \tex_endlinechar:D
@@ -3224,7 +3365,7 @@
\int_compare:nNnT
{
\char_value_catcode:n
- { \exp_last_unbraced:Nf ` \str_head:n {#2} ~ }
+ { \exp_last_unbraced:Nf ` { \str_head:n {#2} } ~ }
}
= { 10 } { ~ }
\exp_after:wN \__tl_rescan:w
@@ -3342,7 +3483,7 @@
\cs_new:Npn \__tl_if_empty_return:o #1
{
\exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \etex_detokenize:D \exp_after:wN {#1} \q_nil
+ \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
\prg_return_true:
\else:
\prg_return_false:
@@ -3390,23 +3531,20 @@
}
\prg_generate_conditional_variant:Nnn \tl_if_in:nn
{ V , o , no } { T , F , TF }
-\use:x
+\cs_set_protected:Npn \__tl_tmp:w #1
{
- \prg_new_conditional:Npnn \exp_not:N \tl_if_novalue:n ##1
+ \prg_new_conditional:Npnn \tl_if_novalue:n ##1
{ p , T , F , TF }
{
- \exp_not:N \str_if_eq:onTF
- {
- \exp_not:N \__tl_if_novalue:w ? ##1 { }
- \c_novalue_tl
- }
- { ? { } \c_novalue_tl }
- { \exp_not:N \prg_return_true: }
- { \exp_not:N \prg_return_false: }
+ \str_if_eq:onTF
+ { \__tl_if_novalue:w ? ##1 { } #1 }
+ { ? { } #1 }
+ { \prg_return_true: }
+ { \prg_return_false: }
}
- \cs_new:Npn \exp_not:N \__tl_if_novalue:w ##1 \c_novalue_tl
- {##1}
+ \cs_new:Npn \__tl_if_novalue:w ##1 #1 {##1}
}
+\exp_args:No \__tl_tmp:w { \c_novalue_tl }
\cs_new:Npn \tl_if_single_p:N { \exp_args:No \tl_if_single_p:n }
\cs_new:Npn \tl_if_single:NT { \exp_args:No \tl_if_single:nT }
\cs_new:Npn \tl_if_single:NF { \exp_args:No \tl_if_single:nF }
@@ -3414,7 +3552,8 @@
\prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF }
{
\if_catcode:w ^ \exp_after:wN \__tl_if_single:nnw
- \tl_to_str:n \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
+ \__kernel_tl_to_str:w
+ \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
\prg_return_true:
\else:
\prg_return_false:
@@ -3452,32 +3591,32 @@
\cs_generate_variant:Nn \tl_case:Nn { c }
\prg_generate_conditional_variant:Nnn \tl_case:Nn
{ c } { T , F , TF }
-\cs_new:Npn \__prg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \__tl_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
{ \exp_end: #1 #4 }
-\cs_new_eq:NN \__tl_case_end:nw \__prg_case_end:nw
\cs_new:Npn \tl_map_function:nN #1#2
{
\__tl_map_function:Nn #2 #1
\q_recursion_tail
- \__prg_break_point:Nn \tl_map_break: { }
+ \prg_break_point:Nn \tl_map_break: { }
}
\cs_new:Npn \tl_map_function:NN
{ \exp_args:No \tl_map_function:nN }
\cs_new:Npn \__tl_map_function:Nn #1#2
{
- \__quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
#1 {#2} \__tl_map_function:Nn #1
}
\cs_generate_variant:Nn \tl_map_function:NN { c }
\cs_new_protected:Npn \tl_map_inline:nn #1#2
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:cpn
- { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
+ { __tl_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_args:Nc \__tl_map_function:Nn
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { __tl_map_ \int_use:N \g__kernel_prg_map_int :w }
#1 \q_recursion_tail
- \__prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \tl_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
\cs_new_protected:Npn \tl_map_inline:Nn
{ \exp_args:No \tl_map_inline:nn }
@@ -3486,7 +3625,7 @@
{
\__tl_map_variable:Nnn #2 {#3} #1
\q_recursion_tail
- \__prg_break_point:Nn \tl_map_break: { }
+ \prg_break_point:Nn \tl_map_break: { }
}
\cs_new_protected:Npn \tl_map_variable:NNn
{ \exp_args:No \tl_map_variable:nNn }
@@ -3493,17 +3632,17 @@
\cs_new_protected:Npn \__tl_map_variable:Nnn #1#2#3
{
\tl_set:Nn #1 {#3}
- \__quark_if_recursion_tail_break:NN #1 \tl_map_break:
+ \quark_if_recursion_tail_break:NN #1 \tl_map_break:
\use:n {#2}
\__tl_map_variable:Nnn #1 {#2}
}
\cs_generate_variant:Nn \tl_map_variable:NNn { c }
\cs_new:Npn \tl_map_break:
- { \__prg_map_break:Nn \tl_map_break: { } }
+ { \prg_map_break:Nn \tl_map_break: { } }
\cs_new:Npn \tl_map_break:n
- { \__prg_map_break:Nn \tl_map_break: }
+ { \prg_map_break:Nn \tl_map_break: }
\cs_generate_variant:Nn \tl_to_str:n { V }
-\cs_new:Npn \tl_to_str:N #1 { \etex_detokenize:D \exp_after:wN {#1} }
+\cs_new:Npn \tl_to_str:N #1 { \__kernel_tl_to_str:w \exp_after:wN {#1} }
\cs_generate_variant:Nn \tl_to_str:N { c }
\cs_new:Npn \tl_use:N #1
{
@@ -3546,6 +3685,9 @@
\cs_new:Npn \tl_trim_spaces:n #1
{ \__tl_trim_spaces:nn { \q_mark #1 } \exp_not:o }
\cs_generate_variant:Nn \tl_trim_spaces:n { o }
+\cs_new:Npn \tl_trim_spaces_apply:nN #1#2
+ { \__tl_trim_spaces:nn { \q_mark #1 } { \exp_args:No #2 } }
+\cs_generate_variant:Nn \tl_trim_spaces_apply:nN { o }
\cs_new_protected:Npn \tl_trim_spaces:N #1
{ \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
\cs_new_protected:Npn \tl_gtrim_spaces:N #1
@@ -3590,6 +3732,8 @@
{ ##3 { \use_none:n ##1 } }
}
\__tl_tmp:w { ~ }
+\cs_new_nopar:Npn \q__tl_act_mark { \q__tl_act_mark }
+\cs_new_nopar:Npn \q__tl_act_stop { \q__tl_act_stop }
\cs_new:Npn \__tl_act:NNNnn #1#2#3#4#5
{
\group_align_safe_begin:
@@ -3638,7 +3782,7 @@
{ #2 \__tl_act_result:n { #1 #3 } }
\cs_new:Npn \tl_reverse:n #1
{
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{
\exp:w
\__tl_act:NNNnn
@@ -3664,7 +3808,7 @@
\cs_generate_variant:Nn \tl_greverse:N { c }
\cs_new:Npn \tl_head:n #1
{
- \etex_unexpanded:D
+ \__kernel_exp_not:w
\if_false: { \fi: \__tl_head_auxi:nw #1 { } \q_stop }
}
\cs_new:Npn \__tl_head_auxi:nw #1#2 \q_stop
@@ -3675,7 +3819,7 @@
\cs_new:Npn \__tl_head_auxii:n #1
{
\exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \tl_to_str:n \exp_after:wN { \use_none:n #1 } \q_nil
+ \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q_nil
\exp_after:wN \use_i:nn
\else:
\exp_after:wN \use_ii:nn
@@ -3688,7 +3832,7 @@
\cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n }
\cs_new:Npn \tl_tail:n #1
{
- \etex_unexpanded:D
+ \__kernel_exp_not:w
\tl_if_blank:nTF {#1}
{ { } }
{ \exp_after:wN { \use_none:n #1 } }
@@ -3812,7 +3956,7 @@
{ \exp_args:Nf \__tl_item_aux:nn { \int_eval:n {#2} } {#1} }
#1
\q_recursion_tail
- \__prg_break_point:
+ \prg_break_point:
}
\cs_new:Npn \__tl_item_aux:nn #1#2
{
@@ -3822,9 +3966,9 @@
}
\cs_new:Npn \__tl_item:nn #1#2
{
- \__quark_if_recursion_tail_break:nN {#2} \__prg_break:
+ \quark_if_recursion_tail_break:nN {#2} \prg_break:
\int_compare:nNnTF {#1} = 1
- { \__prg_break:n { \exp_not:n {#2} } }
+ { \prg_break:n { \exp_not:n {#2} } }
{ \exp_args:Nf \__tl_item:nn { \int_eval:n { #1 - 1 } } }
}
\cs_new:Npn \tl_item:Nn { \exp_args:No \tl_item:nn }
@@ -3835,7 +3979,7 @@
\cs_generate_variant:Nn \tl_log:N { c }
\cs_new_protected:Npn \__tl_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{ \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } }
}
\cs_new_protected:Npn \tl_show:n #1
@@ -3843,9 +3987,9 @@
\cs_new_protected:Npn \__tl_show:n #1
{
\tl_set:Nf \l__tl_internal_a_tl { \__tl_show:w #1 \q_stop }
- \__iow_with:Nnn \tex_newlinechar:D { 10 }
+ \__kernel_iow_with:Nnn \tex_newlinechar:D { 10 }
{
- \__iow_with:Nnn \tex_errorcontextlines:D { -1 }
+ \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
{
\etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
{ \exp_after:wN \l__tl_internal_a_tl }
@@ -3893,8 +4037,11 @@
\tl_if_blank:nF {#1}
{
\cs_new_protected:cpx { str_ #1 :Nn } ##1##2
- { \exp_not:c { tl_ #1 :Nx } ##1 { \exp_not:N \tl_to_str:n {##2} } }
- \exp_args:Nc \cs_generate_variant:Nn { str_ #1 :Nn } { Nx , cn , cx }
+ {
+ \exp_not:c { tl_ #1 :Nx } ##1
+ { \exp_not:N \tl_to_str:n {##2} }
+ }
+ \cs_generate_variant:cn { str_ #1 :Nn } { Nx , cn , cx }
\__str_tmp:n
}
}
@@ -3960,16 +4107,22 @@
{ \str_greplace_all:Nnn #1 {#2} { } }
\cs_generate_variant:Nn \str_remove_all:Nn { c }
\cs_generate_variant:Nn \str_gremove_all:Nn { c }
-\prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N { p , T , F , TF }
-\prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c { p , T , F , TF }
-\prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N { p , T , F , TF }
-\prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c
+ { p , T , F , TF }
\cs_new:Npn \__str_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
\cs_if_exist:NT \luatex_luatexversion:D
{
+ \cs_set_eq:NN \lua_escape_x:n \luatex_luaescapestring:D
+ \cs_set_eq:NN \lua_now_x:n \luatex_directlua:D
\cs_set:Npn \__str_if_eq_x:nn #1#2
{
- \luatex_directlua:D
+ \lua_now_x:n
{
l3kernel.strcmp
(
@@ -3980,20 +4133,10 @@
}
\cs_new:Npn \__str_escape_x:n #1
{
- \luatex_luaescapestring:D
- {
- \etex_detokenize:D \exp_after:wN { \luatex_expanded:D {#1} }
- }
+ \lua_escape_x:n
+ { \__kernel_tl_to_str:w \use_x:n { {#1} } }
}
}
-\cs_new:Npn \__str_if_eq_x_return:nn #1 #2
- {
- \if_int_compare:w \__str_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f:
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
\prg_new_conditional:Npnn \str_if_eq:nn #1#2 { p , T , F , TF }
{
\if_int_compare:w
@@ -4010,7 +4153,8 @@
}
\prg_new_conditional:Npnn \str_if_eq:NN #1#2 { p , TF , T , F }
{
- \if_int_compare:w \__str_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
+ \if_int_compare:w
+ \__str_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
= 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi:
}
\prg_generate_conditional_variant:Nnn \str_if_eq:NN
@@ -4088,14 +4232,15 @@
{ \__str_case_end:nw {#3} }
{ \__str_case_x:nw {#1} }
}
-\cs_new_eq:NN \__str_case_end:nw \__prg_case_end:nw
+\cs_new:Npn \__str_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+ { \exp_end: #1 #4 }
\cs_new:Npn \str_map_function:nN #1#2
{
\exp_after:wN \__str_map_function:w
\exp_after:wN \__str_map_function:Nn \exp_after:wN #2
- \etex_detokenize:D {#1}
+ \__kernel_tl_to_str:w {#1}
\q_recursion_tail ? ~
- \__prg_break_point:Nn \str_map_break: { }
+ \prg_break_point:Nn \str_map_break: { }
}
\cs_new:Npn \str_map_function:NN
{ \exp_args:No \str_map_function:nN }
@@ -4111,17 +4256,18 @@
\cs_generate_variant:Nn \str_map_function:NN { c }
\cs_new_protected:Npn \str_map_inline:nn #1#2
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:cpn
- { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
+ { __str_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\use:x
{
\exp_not:N \__str_map_inline:NN
- \exp_not:c { __prg_map_ \int_use:N \g__prg_map_int :w }
- \__str_to_other_fast:n {#1}
+ \exp_not:c { __str_map_ \int_use:N \g__kernel_prg_map_int :w }
+ \__kernel_str_to_other_fast:n {#1}
}
\q_recursion_tail
- \__prg_break_point:Nn \str_map_break: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \str_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
\cs_new_protected:Npn \str_map_inline:Nn
{ \exp_args:No \str_map_inline:nn }
@@ -4128,7 +4274,7 @@
\cs_generate_variant:Nn \str_map_inline:Nn { c }
\cs_new:Npn \__str_map_inline:NN #1#2
{
- \__quark_if_recursion_tail_break:NN #2 \str_map_break:
+ \quark_if_recursion_tail_break:NN #2 \str_map_break:
\exp_args:No #1 { \token_to_str:N #2 }
\__str_map_inline:NN #1
}
@@ -4137,16 +4283,16 @@
\use:x
{
\exp_not:n { \__str_map_variable:NnN #2 {#3} }
- \__str_to_other_fast:n {#1}
+ \__kernel_str_to_other_fast:n {#1}
}
\q_recursion_tail
- \__prg_break_point:Nn \str_map_break: { }
+ \prg_break_point:Nn \str_map_break: { }
}
\cs_new_protected:Npn \str_map_variable:NNn
{ \exp_args:No \str_map_variable:nNn }
\cs_new_protected:Npn \__str_map_variable:NnN #1#2#3
{
- \__quark_if_recursion_tail_break:NN #3 \str_map_break:
+ \quark_if_recursion_tail_break:NN #3 \str_map_break:
\str_set:Nn #1 {#3}
\use:n {#2}
\__str_map_variable:NnN #1 {#2}
@@ -4153,10 +4299,10 @@
}
\cs_generate_variant:Nn \str_map_variable:NNn { c }
\cs_new:Npn \str_map_break:
- { \__prg_map_break:Nn \str_map_break: { } }
+ { \prg_map_break:Nn \str_map_break: { } }
\cs_new:Npn \str_map_break:n
- { \__prg_map_break:Nn \str_map_break: }
-\cs_new:Npn \__str_to_other:n #1
+ { \prg_map_break:Nn \str_map_break: }
+\cs_new:Npn \__kernel_str_to_other:n #1
{
\exp_after:wN \__str_to_other_loop:w
\tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_mark \q_stop
@@ -4179,7 +4325,7 @@
\cs_new:Npn \__str_to_other_end:w \fi: #1 \q_mark #2 * A #3 \q_stop
{ \fi: #2 }
}
-\cs_new:Npn \__str_to_other_fast:n #1
+\cs_new:Npn \__kernel_str_to_other_fast:n #1
{
\exp_after:wN \__str_to_other_fast_loop:w \tl_to_str:n {#1} ~
A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop
@@ -4208,17 +4354,16 @@
\exp_args:Nf \tl_to_str:n
{
\exp_args:Nf \__str_item:nn
- { \__str_to_other:n {#1} } {#2}
+ { \__kernel_str_to_other:n {#1} } {#2}
}
}
\cs_new:Npn \str_item_ignore_spaces:nn #1
{ \exp_args:No \__str_item:nn { \tl_to_str:n {#1} } }
-\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } }
\cs_new:Npn \__str_item:nn #1#2
{
\exp_after:wN \__str_item:w
- \__int_value:w \__int_eval:w #2 \exp_after:wN ;
- \__int_value:w \__str_count:n {#1} ;
+ \int_value:w \int_eval:n {#2} \exp_after:wN ;
+ \int_value:w \__str_count:n {#1} ;
#1 \q_stop
}
\cs_new:Npn \__str_item:w #1; #2;
@@ -4230,7 +4375,7 @@
{
\exp_after:wN \use_i_delimit_by_q_stop:nw
\exp:w \exp_after:wN \__str_skip_exp_end:w
- \__int_value:w \__int_eval:w #1 + #2 ;
+ \int_value:w \int_eval:n { #1 + #2 } ;
}
}
{
@@ -4248,12 +4393,15 @@
\exp_after:wN \__str_skip_loop:wNNNNNNNN
\else:
\exp_after:wN \__str_skip_end:w
- \__int_value:w \__int_eval:w
+ \int_value:w \int_eval:w
\fi:
#1 ;
}
\cs_new:Npn \__str_skip_loop:wNNNNNNNN #1; #2#3#4#5#6#7#8#9
- { \exp_after:wN \__str_skip_exp_end:w \__int_value:w \__int_eval:w #1 - 8 ; }
+ {
+ \exp_after:wN \__str_skip_exp_end:w
+ \int_value:w \int_eval:n { #1 - 8 } ;
+ }
\cs_new:Npn \__str_skip_end:w #1 ;
{
\exp_after:wN \__str_skip_end:NNNNNNNN
@@ -4267,19 +4415,17 @@
\exp_args:Nf \tl_to_str:n
{
\exp_args:Nf \__str_range:nnn
- { \__str_to_other:n {#1} } {#2} {#3}
+ { \__kernel_str_to_other:n {#1} } {#2} {#3}
}
}
\cs_new:Npn \str_range_ignore_spaces:nnn #1
{ \exp_args:No \__str_range:nnn { \tl_to_str:n {#1} } }
-\__kernel_patch_args:nNNpn
- { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } }
\cs_new:Npn \__str_range:nnn #1#2#3
{
\exp_after:wN \__str_range:w
- \__int_value:w \__str_count:n {#1} \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 - 1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #3 ;
+ \int_value:w \__str_count:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN ;
+ \int_value:w \int_eval:n {#3} ;
#1 \q_stop
}
\cs_new:Npn \__str_range:w #1; #2; #3;
@@ -4291,7 +4437,7 @@
\cs_new:Npn \__str_range:nnw #1#2
{
\exp_after:wN \__str_collect_delimit_by_q_stop:w
- \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
+ \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
\exp:w \__str_skip_exp_end:w #1 ;
}
\cs_new:Npn \__str_range_normalize:nn #1#2
@@ -4327,14 +4473,15 @@
\cs_new:Npn \__str_collect_loop:wnNNNNNNN #1; #2 #3#4#5#6#7#8#9
{
\exp_after:wN \__str_collect_loop:wn
- \__int_value:w \__int_eval:w #1 - 7 ;
+ \int_value:w \int_eval:n { #1 - 7 } ;
{ #2 #3#4#5#6#7#8#9 }
}
\cs_new:Npn \__str_collect_end:wn #1 ;
{
\exp_after:wN \__str_collect_end:nnnnnnnnw
- \if_case:w \if_int_compare:w #1 > 0 \exp_stop_f: #1 \else: 0 \fi: \exp_stop_f:
- \or: \or: \or: \or: \or: \or: \fi:
+ \if_case:w \if_int_compare:w #1 > 0 \exp_stop_f:
+ #1 \else: 0 \fi: \exp_stop_f:
+ \or: \or: \or: \or: \or: \or: \fi:
}
\cs_new:Npn \__str_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop
{ #1#2#3#4#5#6#7#8 }
@@ -4445,7 +4592,8 @@
\cs_new:Npn \__str_change_case_output:nw #1#2 \__str_change_case_result:n #3
{ #2 \__str_change_case_result:n { #3 #1 } }
\cs_generate_variant:Nn \__str_change_case_output:nw { f }
-\cs_new:Npn \__str_change_case_end:wn #1 \__str_change_case_result:n #2 { #2 }
+\cs_new:Npn \__str_change_case_end:wn #1 \__str_change_case_result:n #2
+ { \tl_to_str:n {#2} }
\cs_new:Npn \__str_change_case_loop:nw #1#2 \q_recursion_stop
{
\tl_if_head_is_space:nTF {#2}
@@ -4453,8 +4601,8 @@
{ \__str_change_case_char:nN }
{#1} #2 \q_recursion_stop
}
-\use:x
- { \cs_new:Npn \exp_not:N \__str_change_case_space:n ##1 \c_space_tl }
+\exp_last_unbraced:NNNNo
+ \cs_new:Npn \__str_change_case_space:n #1 \c_space_tl
{
\__str_change_case_output:nw { ~ }
\__str_change_case_loop:nw {#1}
@@ -4463,33 +4611,10 @@
{
\quark_if_recursion_tail_stop_do:Nn #2
{ \__str_change_case_end:wn }
- \cs_if_exist:cTF { c__unicode_ #1 _ #2 _tl }
- {
- \__str_change_case_output:fw
- { \tl_to_str:c { c__unicode_ #1 _ #2 _tl } }
- }
- { \__str_change_case_char_aux:nN {#1} #2 }
+ \__str_change_case_output:fw
+ { \use:c { char_ #1 _case:N } #2 }
\__str_change_case_loop:nw {#1}
}
-\cs_if_exist:NTF \utex_char:D
- {
- \cs_new:Npn \__str_change_case_char_aux:nN #1#2
- {
- \int_compare:nNnTF { \use:c { __str_lookup_ #1 :N } #2 } = { 0 }
- { \__str_change_case_output:nw {#2} }
- {
- \__str_change_case_output:fw
- { \utex_char:D \use:c { __str_lookup_ #1 :N } #2 ~ }
- }
- }
- \cs_new_protected:Npn \__str_lookup_lower:N #1 { \tex_lccode:D `#1 }
- \cs_new_protected:Npn \__str_lookup_upper:N #1 { \tex_uccode:D `#1 }
- \cs_new_eq:NN \__str_lookup_fold:N \__str_lookup_lower:N
- }
- {
- \cs_new:Npn \__str_change_case_char_aux:nN #1#2
- { \__str_change_case_output:nw {#2} }
- }
\str_const:Nx \c_ampersand_str { \cs_to_str:N \& }
\str_const:Nx \c_atsign_str { \cs_to_str:N \@ }
\str_const:Nx \c_backslash_str { \cs_to_str:N \\ }
@@ -4509,134 +4634,122 @@
\cs_new_eq:NN \str_show:n \tl_show:n
\cs_new_eq:NN \str_show:N \tl_show:N
\cs_generate_variant:Nn \str_show:N { c }
-\group_begin:
- \tex_chardef:D \g__unicode_data_ior
- \etex_numexpr:D
- \cs_if_exist:NTF \lastallocatedread
- { \lastallocatedread }
- {
- \cs_if_exist:NTF \c_syst_last_allocated_read
- { \c_syst_last_allocated_read }
- { \tex_count:D 16 ~ }
- }
- + 1
- \scan_stop:
- \cs_set_protected:Npn \__unicode_map_inline:n #1
- {
- \group_begin:
- \tex_catcode:D `\# = 12 \scan_stop:
- \tex_catcode:D `\ = 10 \scan_stop:
- \tex_openin:D \g__unicode_data_ior = #1 \scan_stop:
- \cs_if_exist:NT \utex_char:D
- { \__unicode_map_loop: }
- \tex_closein:D \g__unicode_data_ior
- \group_end:
- }
- \cs_set_protected:Npn \__unicode_map_loop:
- {
- \tex_ifeof:D \g__unicode_data_ior
- \exp_after:wN \use_none:n
- \else:
- \exp_after:wN \use:n
- \fi:
- {
- \tex_read:D \g__unicode_data_ior to \l__unicode_tmp_tl
- \if_meaning:w \c_empty_tl \l__unicode_tmp_tl
- \else:
- \exp_after:wN \__unicode_parse:w \l__unicode_tmp_tl \q_stop
- \fi:
- \__unicode_map_loop:
- }
- }
- \cs_set_protected:Npn \__unicode_parse:w #1#2 \q_stop
- {
- \reverse_if:N \if:w \c_hash_str #1
- \__unicode_parse_auxi:w #1#2 \q_stop
- \else:
- \if_int_compare:w \__str_if_eq_x:nn
- { \exp_not:n {#2} } { ~Conditional~Mappings~ } = 0 \exp_stop_f:
- \cs_set_protected:Npn \__unicode_parse:w ##1 \q_stop { }
- \fi:
- \fi:
- }
- \cs_set_protected:Npn \__unicode_store:nnnnn #1#2#3#4#5
- {
- \tl_const:cx { c__unicode_ #2 _ \utex_char:D "#1 _tl }
- {
- \utex_char:D "#3 ~
- \utex_char:D "#4 ~
- \tl_if_blank:nF {#5}
- { \utex_char:D "#5 }
- }
- }
- \cs_set_protected:Npn \__unicode_parse_auxi:w
- #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ;
- { \__unicode_parse_auxii:w #1 ; }
- \cs_set_protected:Npn \__unicode_parse_auxii:w
- #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop
- {
- \tl_if_blank:nF {#7}
- {
- \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f:
- \else:
- \tl_const:cx
- { c__unicode_mixed_ \utex_char:D "#1 _tl }
- { \utex_char:D "#7 }
- \fi:
- }
- }
- \__unicode_map_inline:n { UnicodeData.txt }
- \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ;~ #2 ;~ #3 ; #4 \q_stop
- {
- \if_int_compare:w \__str_if_eq_x:nn {#2} { C } = 0 \exp_stop_f:
- \if_int_compare:w \tex_lccode:D "#1 = "#3 \scan_stop:
- \else:
- \tl_const:cx
- { c__unicode_fold_ \utex_char:D "#1 _tl }
- { \utex_char:D "#3 ~ }
- \fi:
- \else:
- \if_int_compare:w \__str_if_eq_x:nn {#2} { F } = 0 \exp_stop_f:
- \__unicode_parse_auxii:w #1 ~ #3 ~ \q_stop
- \fi:
- \fi:
- }
- \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
- { \__unicode_store:nnnnn {#1} { fold } {#2} {#3} {#4} }
- \__unicode_map_inline:n { CaseFolding.txt }
- \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ;~ #2 ;~ #3 ;~ #4 ; #5 \q_stop
- {
- \use:n { \__unicode_parse_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop
- \use:n { \__unicode_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
- \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f:
- \else:
- \use:n { \__unicode_parse_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop
- \fi:
- }
- \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
- {
- \tl_if_empty:nF {#4}
- { \__unicode_store:nnnnn {#1} {#2} {#3} {#4} {#5} }
- }
- \__unicode_map_inline:n { SpecialCasing.txt }
- \cs_if_exist:NF \utex_char:D
- {
- \cs_set_protected:Npn \__unicode_tmp:NN #1#2
- {
- \if_meaning:w \q_recursion_tail #2
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
- \fi:
- \tl_const:cn { c__unicode_fold_ #1 _tl } {#2}
- \tl_const:cn { c__unicode_lower_ #1 _tl } {#2}
- \tl_const:cn { c__unicode_upper_ #2 _tl } {#1}
- \__unicode_tmp:NN
- }
- \__unicode_tmp:NN
- AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
- ? \q_recursion_tail \q_recursion_stop
- }
-\group_end:
-%% File: l3seq.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3quark.dtx Copyright (C) 1990-2018 The LaTeX3 Project
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN q #1 } { }
+\cs_new_protected:Npn \quark_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \cs_gset_nopar:Npn #1 {#1}
+ }
+\quark_new:N \q_nil
+\quark_new:N \q_mark
+\quark_new:N \q_no_value
+\quark_new:N \q_stop
+\quark_new:N \q_recursion_tail
+\quark_new:N \q_recursion_stop
+\cs_new:Npn \quark_if_recursion_tail_stop:N #1
+ {
+ \if_meaning:w \q_recursion_tail #1
+ \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \fi:
+ }
+\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1
+ {
+ \if_meaning:w \q_recursion_tail #1
+ \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
+ \else:
+ \exp_after:wN \use_none:n
+ \fi:
+ }
+\cs_new:Npn \quark_if_recursion_tail_stop:n #1
+ {
+ \tl_if_empty:oTF
+ { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
+ { \use_none_delimit_by_q_recursion_stop:w }
+ { }
+ }
+\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1
+ {
+ \tl_if_empty:oTF
+ { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
+ { \use_i_delimit_by_q_recursion_stop:nw }
+ { \use_none:n }
+ }
+\cs_new:Npn \__quark_if_recursion_tail:w
+ #1 \q_recursion_tail #2 ? #3 ?! { #1 #2 }
+\cs_generate_variant:Nn \quark_if_recursion_tail_stop:n { o }
+\cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn { o }
+\cs_new:Npn \quark_if_recursion_tail_break:NN #1#2
+ {
+ \if_meaning:w \q_recursion_tail #1
+ \exp_after:wN #2
+ \fi:
+ }
+\cs_new:Npn \quark_if_recursion_tail_break:nN #1#2
+ {
+ \tl_if_empty:oT
+ { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
+ {#2}
+ }
+\prg_new_conditional:Npnn \quark_if_nil:N #1 { p, T , F , TF }
+ {
+ \if_meaning:w \q_nil #1
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\prg_new_conditional:Npnn \quark_if_no_value:N #1 { p, T , F , TF }
+ {
+ \if_meaning:w \q_no_value #1
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\prg_generate_conditional_variant:Nnn \quark_if_no_value:N
+ { c } { p , T , F , TF }
+\prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
+ {
+ \__quark_if_empty_return:o
+ { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! }
+ }
+\cs_new:Npn \__quark_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 }
+\prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF }
+ {
+ \__quark_if_empty_return:o
+ { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
+ }
+\cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
+\prg_generate_conditional_variant:Nnn \quark_if_nil:n
+ { V , o } { p , TF , T , F }
+\cs_new:Npn \__quark_if_empty_return:o #1
+ {
+ \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
+ \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\tl_new:N \g__scan_marks_tl
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN s #1 } { }
+\cs_new_protected:Npn \scan_new:N #1
+ {
+ \tl_if_in:NnTF \g__scan_marks_tl { #1 }
+ {
+ \__kernel_msg_error:nnx { kernel } { scanmark-already-defined }
+ { \token_to_str:N #1 }
+ }
+ {
+ \tl_gput_right:Nn \g__scan_marks_tl {#1}
+ \cs_new_eq:NN #1 \scan_stop:
+ }
+ }
+\scan_new:N \s_stop
+\cs_new:Npn \use_none_delimit_by_s_stop:w #1 \s_stop { }
+%% File: l3seq.dtx Copyright (C) 1990-2018 The LaTeX3 Project
+\scan_new:N \s__seq
\cs_new:Npn \__seq_item:n
{
\__kernel_msg_expandable_error:nn { kernel } { misused-sequence }
@@ -4648,7 +4761,7 @@
\tl_const:Nn \c_empty_seq { \s__seq }
\cs_new_protected:Npn \seq_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs_gset_eq:NN #1 \c_empty_seq
}
\cs_generate_variant:Nn \seq_new:N { c }
@@ -4861,10 +4974,10 @@
#1
\group_end:
\prg_return_false:
- \__prg_break_point:
+ \prg_break_point:
}
\cs_new:Npn \__seq_if_in:
- { \__prg_break:n { \group_end: \prg_return_true: } }
+ { \prg_break:n { \group_end: \prg_return_true: } }
\prg_generate_conditional_variant:Nnn \seq_if_in:Nn
{ NV , Nv , No , Nx , c , cV , cv , co , cx } { T , F , TF }
\cs_new_protected:Npn \__seq_pop:NNNN #1#2#3#4
@@ -4912,18 +5025,21 @@
\cs_generate_variant:Nn \seq_gpop_left:NN { c }
\cs_new_protected:Npn \seq_get_right:NN #1#2
{
- \exp_after:wN \use_i_ii:nnn
- \exp_after:wN \__seq_get_right_loop:nn
- \exp_after:wN \q_no_value
- #1
- { ?? \tl_set:Nn #2 }
- { } { }
+ \tl_set:Nx #2
+ {
+ \exp_after:wN \use_i_ii:nnn
+ \exp_after:wN \__seq_get_right_loop:nw
+ \exp_after:wN \q_no_value
+ #1
+ \__seq_get_right_end:NnN \__seq_item:n
+ }
}
-\cs_new_protected:Npn \__seq_get_right_loop:nn #1#2
+\cs_new:Npn \__seq_get_right_loop:nw #1#2 \__seq_item:n
{
- \use_none:nn #2 {#1}
- \__seq_get_right_loop:nn
+ #2 \use_none:n {#1}
+ \__seq_get_right_loop:nw
}
+\cs_new:Npn \__seq_get_right_end:NnN #1#2#3 { \exp_not:n {#2} }
\cs_generate_variant:Nn \seq_get_right:NN { c }
\cs_new_protected:Npn \seq_pop_right:NN
{ \__seq_pop:NNNN \__seq_pop_right:NNN \tl_set:Nx }
@@ -4960,27 +5076,35 @@
{ c } { T , F , TF }
\prg_generate_conditional_variant:Nnn \seq_get_right:NN
{ c } { T , F , TF }
-\prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2
+ { T , F , TF }
{ \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_set:Nn #1 #2 }
-\prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2
+ { T , F , TF }
{ \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_gset:Nn #1 #2 }
-\prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2
+ { T , F , TF }
{ \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_set:Nx #1 #2 }
-\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF }
+\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2
+ { T , F , TF }
{ \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_gset:Nx #1 #2 }
-\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c }
+ { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c }
+ { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c }
+ { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c }
+ { T , F , TF }
\cs_new:Npn \seq_item:Nn #1
{ \exp_after:wN \__seq_item:wNn #1 \q_stop #1 }
\cs_new:Npn \__seq_item:wNn \s__seq #1 \q_stop #2#3
{
- \exp_args:Nf \__seq_item:nnn
+ \exp_args:Nf \__seq_item:nwn
{ \exp_args:Nf \__seq_item:nN { \int_eval:n {#3} } #2 }
#1
- { ? \__prg_break: } { }
- \__prg_break_point:
+ \prg_break: \__seq_item:n { }
+ \prg_break_point:
}
\cs_new:Npn \__seq_item:nN #1#2
{
@@ -4988,32 +5112,32 @@
{ \int_eval:n { \seq_count:N #2 + 1 + #1 } }
{#1}
}
-\cs_new:Npn \__seq_item:nnn #1#2#3
+\cs_new:Npn \__seq_item:nwn #1#2 \__seq_item:n #3
{
- \use_none:n #2
+ #2
\int_compare:nNnTF {#1} = 1
- { \__prg_break:n { \exp_not:n {#3} } }
- { \exp_args:Nf \__seq_item:nnn { \int_eval:n { #1 - 1 } } }
+ { \prg_break:n { \exp_not:n {#3} } }
+ { \exp_args:Nf \__seq_item:nwn { \int_eval:n { #1 - 1 } } }
}
\cs_generate_variant:Nn \seq_item:Nn { c }
\cs_new:Npn \seq_map_break:
- { \__prg_map_break:Nn \seq_map_break: { } }
+ { \prg_map_break:Nn \seq_map_break: { } }
\cs_new:Npn \seq_map_break:n
- { \__prg_map_break:Nn \seq_map_break: }
+ { \prg_map_break:Nn \seq_map_break: }
\cs_new:Npn \seq_map_function:NN #1#2
{
\exp_after:wN \use_i_ii:nnn
- \exp_after:wN \__seq_map_function:NNn
+ \exp_after:wN \__seq_map_function:Nw
\exp_after:wN #2
#1
- { ? \seq_map_break: } { }
- \__prg_break_point:Nn \seq_map_break: { }
+ \prg_break: \__seq_item:n { } \prg_break_point:
+ \prg_break_point:Nn \seq_map_break: { }
}
-\cs_new:Npn \__seq_map_function:NNn #1#2#3
+\cs_new:Npn \__seq_map_function:Nw #1#2 \__seq_item:n #3
{
- \use_none:n #2
+ #2
#1 {#3}
- \__seq_map_function:NNn #1
+ \__seq_map_function:Nw #1
}
\cs_generate_variant:Nn \seq_map_function:NN { c }
\cs_new_protected:Npn \__seq_push_item_def:n
@@ -5028,21 +5152,21 @@
}
\cs_new_protected:Npn \__seq_push_item_def:
{
- \int_gincr:N \g__prg_map_int
- \cs_gset_eq:cN { __prg_map_ \int_use:N \g__prg_map_int :w }
+ \int_gincr:N \g__kernel_prg_map_int
+ \cs_gset_eq:cN { __seq_map_ \int_use:N \g__kernel_prg_map_int :w }
\__seq_item:n
}
\cs_new_protected:Npn \__seq_pop_item_def:
{
\cs_gset_eq:Nc \__seq_item:n
- { __prg_map_ \int_use:N \g__prg_map_int :w }
- \int_gdecr:N \g__prg_map_int
+ { __seq_map_ \int_use:N \g__kernel_prg_map_int :w }
+ \int_gdecr:N \g__kernel_prg_map_int
}
\cs_new_protected:Npn \seq_map_inline:Nn #1#2
{
\__seq_push_item_def:n {#2}
#1
- \__prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: }
+ \prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: }
}
\cs_generate_variant:Nn \seq_map_inline:Nn { c }
\cs_new_protected:Npn \seq_map_variable:NNn #1#2#3
@@ -5053,7 +5177,7 @@
\exp_not:n {#3}
}
#1
- \__prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: }
+ \prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: }
}
\cs_generate_variant:Nn \seq_map_variable:NNn { Nc }
\cs_generate_variant:Nn \seq_map_variable:NNn { c , cc }
@@ -5061,11 +5185,25 @@
{
\int_eval:n
{
- 0
- \seq_map_function:NN #1 \__seq_count:n
+ \exp_after:wN \use_i:nn
+ \exp_after:wN \__seq_count:w
+ #1
+ \__seq_count_end:w \__seq_item:n 7
+ \__seq_count_end:w \__seq_item:n 6
+ \__seq_count_end:w \__seq_item:n 5
+ \__seq_count_end:w \__seq_item:n 4
+ \__seq_count_end:w \__seq_item:n 3
+ \__seq_count_end:w \__seq_item:n 2
+ \__seq_count_end:w \__seq_item:n 1
+ \__seq_count_end:w \__seq_item:n 0
+ \prg_break_point:
}
}
-\cs_new:Npn \__seq_count:n #1 { + 1 }
+\cs_new:Npn \__seq_count:w
+ #1 \__seq_item:n #2 \__seq_item:n #3 \__seq_item:n #4 \__seq_item:n
+ #5 \__seq_item:n #6 \__seq_item:n #7 \__seq_item:n #8 #9 \__seq_item:n
+ { #9 8 + \__seq_count:w }
+\cs_new:Npn \__seq_count_end:w 8 + \__seq_count:w #1#2 \prg_break_point: {#1}
\cs_generate_variant:Nn \seq_count:N { c }
\cs_new:Npn \seq_use:Nnnn #1#2#3#4
{
@@ -5142,7 +5280,7 @@
\cs_generate_variant:Nn \seq_log:N { c }
\cs_new_protected:Npn \__seq_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{
#1 { LaTeX/kernel } { show-seq }
{ \token_to_str:N #2 }
@@ -5155,7 +5293,7 @@
\seq_new:N \g_tmpa_seq
\seq_new:N \g_tmpb_seq
%% File: l3int.dtx Copyright (C) 1990-2018 The LaTeX3 Project
-\cs_new_eq:NN \__int_value:w \tex_number:D
+\cs_new_eq:NN \int_value:w \tex_number:D
\cs_new_eq:NN \__int_eval:w \etex_numexpr:D
\cs_new_eq:NN \__int_eval_end: \tex_relax:D
\cs_new_eq:NN \if_int_odd:w \tex_ifodd:D
@@ -5163,16 +5301,14 @@
\__kernel_patch_args:nNNpn
{ { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_eval:n } }
\cs_new:Npn \int_eval:n #1
- { \__int_value:w \__int_eval:w #1 \__int_eval_end: }
+ { \int_value:w \__int_eval:w #1 \__int_eval_end: }
+\cs_new:Npn \int_eval:w { \int_value:w \__int_eval:w }
\__kernel_patch_args:nNNpn
- { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \__int_eval:n } }
-\cs_new:Npn \__int_eval:n #1 { \__int_eval:w #1 \__int_eval_end: }
-\__kernel_patch_args:nNNpn
{ { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_abs:n } }
\cs_new:Npn \int_abs:n #1
{
- \__int_value:w \exp_after:wN \__int_abs:N
- \__int_value:w \__int_eval:w #1 \__int_eval_end:
+ \int_value:w \exp_after:wN \__int_abs:N
+ \int_value:w \__int_eval:w #1 \__int_eval_end:
\exp_stop_f:
}
\cs_new:Npn \__int_abs:N #1
@@ -5184,9 +5320,9 @@
}
\cs_set:Npn \int_max:nn #1#2
{
- \__int_value:w \exp_after:wN \__int_maxmin:wwN
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
+ \int_value:w \exp_after:wN \__int_maxmin:wwN
+ \int_value:w \__int_eval:w #1 \exp_after:wN ;
+ \int_value:w \__int_eval:w #2 ;
>
\exp_stop_f:
}
@@ -5197,9 +5333,9 @@
}
\cs_set:Npn \int_min:nn #1#2
{
- \__int_value:w \exp_after:wN \__int_maxmin:wwN
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
+ \int_value:w \exp_after:wN \__int_maxmin:wwN
+ \int_value:w \__int_eval:w #1 \exp_after:wN ;
+ \int_value:w \__int_eval:w #2 ;
<
\exp_stop_f:
}
@@ -5218,10 +5354,10 @@
}
\cs_new:Npn \int_div_truncate:nn #1#2
{
- \__int_value:w \__int_eval:w
+ \int_value:w \__int_eval:w
\exp_after:wN \__int_div_truncate:NwNw
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
+ \int_value:w \__int_eval:w #1 \exp_after:wN ;
+ \int_value:w \__int_eval:w #2 ;
\__int_eval_end:
}
\cs_new:Npn \__int_div_truncate:NwNw #1#2; #3#4;
@@ -5238,7 +5374,7 @@
/ #3#4
}
\cs_new:Npn \int_div_round:nn #1#2
- { \__int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: }
+ { \int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: }
\__kernel_patch_args:nNNpn
{
{ \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_mod:nn }
@@ -5246,9 +5382,9 @@
}
\cs_new:Npn \int_mod:nn #1#2
{
- \__int_value:w \__int_eval:w \exp_after:wN \__int_mod:ww
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
+ \int_value:w \__int_eval:w \exp_after:wN \__int_mod:ww
+ \int_value:w \__int_eval:w #1 \exp_after:wN ;
+ \int_value:w \__int_eval:w #2 ;
\__int_eval_end:
}
\cs_new:Npn \__int_mod:ww #1; #2;
@@ -5255,7 +5391,7 @@
{ #1 - ( \__int_div_truncate:NwNw #1 ; #2 ; ) * #2 }
\cs_new_protected:Npn \int_new:N #1
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\cs:w newcount \cs_end: #1
}
\cs_generate_variant:Nn \int_new:N { c }
@@ -5271,13 +5407,13 @@
\tex_global:D
}
{
- \int_compare:nNnTF {#2} > \c__max_constdef_int
+ \int_compare:nNnTF {#2} > \c__int_max_constdef_int
{
\int_new:N #1
\tex_global:D
}
{
- \__chk_if_free_cs:N #1
+ \__kernel_chk_if_free_cs:N #1
\tex_global:D \__int_constdef:Nw
}
}
@@ -5292,10 +5428,10 @@
\cs_if_exist:NTF \uptex_disablecjktoken:D
{ \cs_new_eq:NN \__int_constdef:Nw \uptex_kchardef:D }
{ \cs_new_eq:NN \__int_constdef:Nw \tex_chardef:D }
- \__int_constdef:Nw \c__max_constdef_int 1114111 ~
+ \__int_constdef:Nw \c__int_max_constdef_int 1114111 ~
\else:
\cs_new_eq:NN \__int_constdef:Nw \tex_mathchardef:D
- \tex_mathchardef:D \c__max_constdef_int 32767 ~
+ \tex_mathchardef:D \c__int_max_constdef_int 32767 ~
\fi:
\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
\cs_new_protected:Npn \int_zero:N #1 { #1 = \c_zero }
@@ -5369,13 +5505,13 @@
\cs_generate_variant:Nn \int_gset:Nn { c }
\cs_new_eq:NN \int_use:N \tex_the:D
\cs_new:Npn \int_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
-\cs_new_protected:Npn \__prg_compare_error:
+\cs_new_protected:Npn \__int_compare_error:
{
\if_int_compare:w \c_zero \c_zero \fi:
=
- \__prg_compare_error:
+ \__int_compare_error:
}
-\cs_new:Npn \__prg_compare_error:Nw
+\cs_new:Npn \__int_compare_error:Nw
#1#2 \q_stop
{
{ }
@@ -5387,11 +5523,11 @@
\prg_new_conditional:Npnn \int_compare:n #1 { p , T , F , TF }
{
\exp_after:wN \__int_compare:w
- \__int_value:w \__int_eval:w #1 \__prg_compare_error:
+ \int_value:w \__int_eval:w #1 \__int_compare_error:
}
-\cs_new:Npn \__int_compare:w #1 \__prg_compare_error:
+\cs_new:Npn \__int_compare:w #1 \__int_compare_error:
{
- \exp_after:wN \if_false: \__int_value:w
+ \exp_after:wN \if_false: \int_value:w
\__int_compare:Nw #1 e { = nd_ } \q_stop
}
\cs_new:Npn \__int_compare:Nw #1#2 \q_stop
@@ -5402,7 +5538,7 @@
}
\cs_new:Npn \__int_compare:NNw #1#2#3 \q_mark
{
- \etex_unexpanded:D
+ \__kernel_exp_not:w
\use:c
{
__int_compare_ \token_to_str:N #1
@@ -5409,7 +5545,7 @@
\if_meaning:w = #2 = \fi:
:NNw
}
- \__prg_compare_error:Nw #1
+ \__int_compare_error:Nw #1
}
\cs_new:cpn { __int_compare_end_=:NNw } #1#2#3 e #4 \q_stop
{
@@ -5421,7 +5557,7 @@
{#2} \exp_stop_f:
\prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w
\fi:
- #1 #2 #3 \exp_after:wN \__int_compare:Nw \__int_value:w \__int_eval:w
+ #1 #2 #3 \exp_after:wN \__int_compare:Nw \int_value:w \__int_eval:w
}
\cs_new:cpn { __int_compare_=:NNw } #1#2#3 =
{ \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} = }
@@ -5479,7 +5615,8 @@
{ \__int_case_end:nw {#3} }
{ \__int_case:nw {#1} }
}
-\cs_new_eq:NN \__int_case_end:nw \__prg_case_end:nw
+\cs_new:Npn \__int_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+ { \exp_end: #1 #4 }
\__kernel_patch_conditional_args:nNNpnn
{ { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_odd:n } }
\prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF}
@@ -5558,53 +5695,77 @@
}
\__kernel_patch_args:nNNpn
{
- { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_step_function:nnnN }
- { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_step_function:nnnN }
- { \__kernel_chk_expr:nNnN {#3} \__int_eval:w { } \int_step_function:nnnN }
+ {
+ \__kernel_chk_expr:nNnN {#1} \__int_eval:w { }
+ \int_step_function:nnnN
+ }
+ {
+ \__kernel_chk_expr:nNnN {#2} \__int_eval:w { }
+ \int_step_function:nnnN
+ }
+ {
+ \__kernel_chk_expr:nNnN {#3} \__int_eval:w { }
+ \int_step_function:nnnN
+ }
}
\cs_new:Npn \int_step_function:nnnN #1#2#3
{
\exp_after:wN \__int_step:wwwN
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 \exp_after:wN ;
- \__int_value:w \__int_eval:w #3 ;
+ \int_value:w \__int_eval:w #1 \exp_after:wN ;
+ \int_value:w \__int_eval:w #2 \exp_after:wN ;
+ \int_value:w \__int_eval:w #3 ;
}
\cs_new:Npn \__int_step:wwwN #1; #2; #3; #4
{
\int_compare:nNnTF {#2} > \c_zero
- { \__int_step:NnnnN > }
+ { \__int_step:NwnnN > }
{
\int_compare:nNnTF {#2} = \c_zero
{
- \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4}
- \use_none:nnnn
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { zero-step } {#4}
+ \prg_break:
}
- { \__int_step:NnnnN < }
+ { \__int_step:NwnnN < }
}
- {#1} {#2} {#3} #4
+ #1 ; {#2} {#3} #4
+ \prg_break_point:
}
-\cs_new:Npn \__int_step:NnnnN #1#2#3#4#5
+\cs_new:Npn \__int_step:NwnnN #1#2 ; #3#4#5
{
- \int_compare:nNnF {#2} #1 {#4}
- {
- #5 {#2}
- \exp_args:NNf \__int_step:NnnnN
- #1 { \int_eval:n { #2 + #3 } } {#3} {#4} #5
- }
+ \if_int_compare:w #2 #1 #4 \exp_stop_f:
+ \prg_break:n
+ \fi:
+ #5 {#2}
+ \exp_after:wN \__int_step:NwnnN
+ \exp_after:wN #1
+ \int_value:w \__int_eval:w #2 + #3 ; {#3} {#4} #5
}
+\cs_new:Npn \int_step_function:nN
+ { \int_step_function:nnnN { 1 } { 1 } }
+\cs_new:Npn \int_step_function:nnN #1
+ { \int_step_function:nnnN {#1} { 1 } }
+\cs_new_protected:Npn \int_step_inline:nn
+ { \int_step_inline:nnnn { 1 } { 1 } }
+\cs_new_protected:Npn \int_step_inline:nnn #1
+ { \int_step_inline:nnnn {#1} { 1 } }
\cs_new_protected:Npn \int_step_inline:nnnn
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \__int_step:NNnnnn
\cs_gset_protected:Npn
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { __int_map_ \int_use:N \g__kernel_prg_map_int :w }
}
+\cs_new_protected:Npn \int_step_variable:nNn
+ { \int_step_variable:nnnNn { 1 } { 1 } }
+\cs_new_protected:Npn \int_step_variable:nnNn #1
+ { \int_step_variable:nnnNn {#1} { 1 } }
\cs_new_protected:Npn \int_step_variable:nnnNn #1#2#3#4#5
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\exp_args:NNc \__int_step:NNnnnn
\cs_gset_protected:Npx
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { __int_map_ \int_use:N \g__kernel_prg_map_int :w }
{#1}{#2}{#3}
{
\tl_set:Nn \exp_not:N #4 {##1}
@@ -5615,7 +5776,7 @@
{
#1 #2 ##1 {#6}
\int_step_function:nnnN {#3} {#4} {#5} #2
- \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__kernel_prg_map_int }
}
\cs_new_eq:NN \int_to_arabic:n \int_eval:n
\cs_new:Npn \int_to_symbols:nnn #1#2#3
@@ -5788,7 +5949,7 @@
\or: x
\or: y
\or: z
- \else: \__int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end:
+ \else: \int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end:
\fi:
}
\cs_new:Npn \__int_to_Letter:n #1
@@ -5821,7 +5982,7 @@
\or: X
\or: Y
\or: Z
- \else: \__int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end:
+ \else: \int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end:
\fi:
}
\cs_new:Npn \int_to_bin:n #1
@@ -6018,65 +6179,12 @@
\int_new:N \l_tmpb_int
\int_new:N \g_tmpa_int
\int_new:N \g_tmpb_int
-\cs_gset_eq:NN \c__deprecation_minus_one \m at ne
-\cs_new_eq:NN \c_minus_one \c__deprecation_minus_one
+\cs_gset_eq:NN \c__int_minus_one \m at ne
+\cs_new_eq:NN \c_minus_one \c__int_minus_one
\__kernel_deprecation_code:nn
- { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
- { \tex_let:D \c_minus_one \c__deprecation_minus_one }
-%% File: l3intarray.dtx Copyright (C) 2017 The LaTeX3 Project
-\int_new:N \g__intarray_font_int
-\cs_new_protected:Npn \__intarray_new:Nn #1#2
- {
- \__chk_if_free_cs:N #1
- \int_gincr:N \g__intarray_font_int
- \tex_global:D \tex_font:D #1 = cmr10~at~ \g__intarray_font_int sp \scan_stop:
- \tex_hyphenchar:D #1 = \int_eval:n {#2} \scan_stop:
- \int_compare:nNnT { \tex_hyphenchar:D #1 } > 0
- { \tex_fontdimen:D \tex_hyphenchar:D #1 #1 = 0 sp \scan_stop: }
- \int_step_inline:nnnn { 1 } { 1 } { 8 }
- { \tex_fontdimen:D ##1 #1 = 0 sp \scan_stop: }
- }
-\cs_new:Npn \__intarray_count:N #1 { \tex_the:D \tex_hyphenchar:D #1 }
-\cs_new_protected:Npn \__intarray_gset_fast:Nnn #1#2#3
- { \tex_fontdimen:D \int_eval:n {#2} #1 = \int_eval:n {#3} sp \scan_stop: }
-\cs_new_protected:Npn \__intarray_gset:Nnn #1#2#3
- {
- \exp_args:Nff \__intarray_gset_aux:Nnn #1
- { \int_eval:n {#2} } { \int_eval:n {#3} }
- }
-\cs_new_protected:Npn \__intarray_gset_aux:Nnn #1#2#3
- {
- \int_compare:nTF { 1 <= #2 <= \__intarray_count:N #1 }
- {
- \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim }
- { \__intarray_gset_fast:Nnn #1 {#2} {#3} }
- {
- \__kernel_msg_error:nnxxxx { kernel } { overflow }
- { \token_to_str:N #1 } {#2} {#3}
- { \int_compare:nNnT {#3} < 0 { - } \__int_value:w \c_max_dim }
- \__intarray_gset_fast:Nnn #1 {#2}
- { \int_compare:nNnT {#3} < 0 { - } \c_max_dim }
- }
- }
- {
- \__kernel_msg_error:nnxxx { kernel } { out-of-bounds }
- { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 }
- }
- }
-\cs_new:Npn \__intarray_item_fast:Nn #1#2
- { \__int_value:w \tex_fontdimen:D \int_eval:n {#2} #1 }
-\cs_new:Npn \__intarray_item:Nn #1#2
- { \exp_args:Nf \__intarray_item_aux:Nn #1 { \int_eval:n {#2} } }
-\cs_new:Npn \__intarray_item_aux:Nn #1#2
- {
- \int_compare:nTF { 1 <= #2 <= \__intarray_count:N #1 }
- { \__intarray_item_fast:Nn #1 {#2} }
- {
- \__kernel_msg_expandable_error:nnnnn { kernel } { out-of-bounds }
- { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 }
- 0
- }
- }
+ { \__kernel_deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
+ { \tex_let:D \c_minus_one \c__int_minus_one }
+\cs_new_eq:NN \__int_value:w \int_value:w
%% File: l3flag.dtx Copyright (C) 2011-2018 The LaTeX3 Project
\cs_new_protected:Npn \flag_new:n #1
{
@@ -6091,7 +6199,7 @@
\if_cs_exist:w flag~#2~#1 \cs_end:
\cs_set_eq:cN { flag~#2~#1 } \tex_undefined:D
\exp_after:wN \__flag_clear:wn
- \__int_value:w \__int_eval:w 1 + #1
+ \int_value:w \int_eval:w 1 + #1
\else:
\use_i:nnn
\fi:
@@ -6103,22 +6211,24 @@
\cs_new_protected:Npn \flag_log:n { \__flag_show:Nn \tl_log:n }
\cs_new_protected:Npn \__flag_show:Nn #1#2
{
- \exp_args:Nc \__kernel_check_defined:NT { flag~#2 }
+ \exp_args:Nc \__kernel_chk_defined:NT { flag~#2 }
{
\exp_args:Nx #1
{ \tl_to_str:n { flag~#2~height } = \flag_height:n {#2} }
}
}
-\tex_ifodd:D \l at expl@enable at debug@bool
- \cs_new:Npn \__flag_chk_exist:n #1
- {
- \flag_if_exist:nF {#1}
- {
- \__kernel_msg_expandable_error:nnn
- { kernel } { bad-variable } { flag~#1~ }
- }
- }
-\fi:
+\__kernel_if_debug:TF
+ {
+ \cs_new:Npn \__flag_chk_exist:n #1
+ {
+ \flag_if_exist:nF {#1}
+ {
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { bad-variable } { flag~#1~ }
+ }
+ }
+ }
+ { }
\prg_new_conditional:Npnn \flag_if_exist:n #1 { p , T , F , TF }
{
\cs_if_exist:cTF { flag~#1 }
@@ -6138,7 +6248,7 @@
\cs_new:Npn \__flag_height_loop:wn #1 ; #2
{
\if_cs_exist:w flag~#2~#1 \cs_end:
- \exp_after:wN \__flag_height_loop:wn \__int_value:w \__int_eval:w 1 +
+ \exp_after:wN \__flag_height_loop:wn \int_value:w \int_eval:w 1 +
\else:
\exp_after:wN \__flag_height_end:wn
\fi:
@@ -6148,116 +6258,8 @@
\cs_new:Npn \flag_raise:n #1
{
\cs:w flag~#1 \exp_after:wN \cs_end:
- \__int_value:w \flag_height:n {#1} ;
+ \int_value:w \flag_height:n {#1} ;
}
-%% File: l3quark.dtx Copyright (C) 1990-2018 The LaTeX3 Project
-\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN q #1 } { }
-\cs_new_protected:Npn \quark_new:N #1
- {
- \__chk_if_free_cs:N #1
- \cs_gset_nopar:Npn #1 {#1}
- }
-\quark_new:N \q_nil
-\quark_new:N \q_mark
-\quark_new:N \q_no_value
-\quark_new:N \q_stop
-\quark_new:N \q_recursion_tail
-\quark_new:N \q_recursion_stop
-\cs_new:Npn \quark_if_recursion_tail_stop:N #1
- {
- \if_meaning:w \q_recursion_tail #1
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
- \fi:
- }
-\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1
- {
- \if_meaning:w \q_recursion_tail #1
- \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
- \else:
- \exp_after:wN \use_none:n
- \fi:
- }
-\cs_new:Npn \quark_if_recursion_tail_stop:n #1
- {
- \tl_if_empty:oTF
- { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
- { \use_none_delimit_by_q_recursion_stop:w }
- { }
- }
-\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1
- {
- \tl_if_empty:oTF
- { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
- { \use_i_delimit_by_q_recursion_stop:nw }
- { \use_none:n }
- }
-\cs_new:Npn \__quark_if_recursion_tail:w
- #1 \q_recursion_tail #2 ? #3 ?! { #1 #2 }
-\cs_generate_variant:Nn \quark_if_recursion_tail_stop:n { o }
-\cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn { o }
-\cs_new:Npn \__quark_if_recursion_tail_break:NN #1#2
- {
- \if_meaning:w \q_recursion_tail #1
- \exp_after:wN #2
- \fi:
- }
-\cs_new:Npn \__quark_if_recursion_tail_break:nN #1#2
- {
- \tl_if_empty:oTF
- { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
- {#2}
- { }
- }
-\prg_new_conditional:Npnn \quark_if_nil:N #1 { p, T , F , TF }
- {
- \if_meaning:w \q_nil #1
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-\prg_new_conditional:Npnn \quark_if_no_value:N #1 { p, T , F , TF }
- {
- \if_meaning:w \q_no_value #1
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-\prg_generate_conditional_variant:Nnn \quark_if_no_value:N
- { c } { p , T , F , TF }
-\prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
- {
- \__tl_if_empty_return:o
- { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! }
- }
-\cs_new:Npn \__quark_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 }
-\prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF }
- {
- \__tl_if_empty_return:o
- { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
- }
-\cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
-\prg_generate_conditional_variant:Nnn \quark_if_nil:n
- { V , o } { p , TF , T , F }
-\quark_new:N \q__tl_act_mark
-\quark_new:N \q__tl_act_stop
-\tl_new:N \g__scan_marks_tl
-\cs_new_protected:Npn \__scan_new:N #1
- {
- \tl_if_in:NnTF \g__scan_marks_tl { #1 }
- {
- \__kernel_msg_error:nnx { kernel } { scanmark-already-defined }
- { \token_to_str:N #1 }
- }
- {
- \tl_gput_right:Nn \g__scan_marks_tl {#1}
- \cs_new_eq:NN #1 \scan_stop:
- }
- }
-\__scan_new:N \s__stop
-\cs_new:Npn \__use_none_delimit_by_s__stop:w #1 \s__stop { }
-\__scan_new:N \s__seq
%% File: l3prg.dtx Copyright (C) 2005-2018 The LaTeX3 Project
\cs_new_eq:NN \if_bool:N \tex_ifodd:D
\cs_new_eq:NN \if_predicate:w \tex_ifodd:D
@@ -6312,7 +6314,7 @@
\cs_generate_variant:Nn \bool_log:N { c }
\cs_new_protected:Npn \__bool_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{ \exp_args:Nx #1 { \token_to_str:N #2 = \__bool_to_str:n {#2} } }
}
\bool_new:N \l_tmpa_bool
@@ -6357,10 +6359,10 @@
\cs_new:cpn { __bool_(:Nw } #1#2
{
\exp_after:wN \__bool_choose:NNN \exp_after:wN #1
- \__int_value:w \__bool_get_next:NN \use_i:nnnn
+ \int_value:w \__bool_get_next:NN \use_i:nnnn
}
\cs_new:cpn { __bool_p:Nw } #1
- { \exp_after:wN \__bool_choose:NNN \exp_after:wN #1 \__int_value:w }
+ { \exp_after:wN \__bool_choose:NNN \exp_after:wN #1 \int_value:w }
\cs_new:Npn \__bool_choose:NNN #1#2#3
{
\use:c
@@ -6457,7 +6459,7 @@
{
\exp:w
\exp_after:wN \__prg_replicate_first:N
- \__int_value:w \__int_eval:n {#1}
+ \int_value:w \int_eval:n {#1}
\cs_end:
}
\cs_new:Npn \__prg_replicate:N #1
@@ -6499,7 +6501,8 @@
\cs_new:cpn { __prg_replicate_first_6:n } #1 { \exp_end: #1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_7:n } #1 { \exp_end: #1#1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_8:n } #1 { \exp_end: #1#1#1#1#1#1#1#1 }
-\cs_new:cpn { __prg_replicate_first_9:n } #1 { \exp_end: #1#1#1#1#1#1#1#1#1 }
+\cs_new:cpn { __prg_replicate_first_9:n } #1
+ { \exp_end: #1#1#1#1#1#1#1#1#1 }
\prg_new_conditional:Npnn \mode_if_vertical: { p , T , F , TF }
{ \if_mode_vertical: \prg_return_true: \else: \prg_return_false: \fi: }
\prg_new_conditional:Npnn \mode_if_horizontal: { p , T , F , TF }
@@ -6512,17 +6515,127 @@
{ \if_int_compare:w \if_false: { \fi: `} = \c_zero \fi: }
\cs_new:Npn \group_align_safe_end:
{ \if_int_compare:w `{ = \c_zero } \fi: }
-\int_new:N \g__prg_map_int
+\int_new:N \g__kernel_prg_map_int
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break_point:Nn }
+\cs_new:Npn \__prg_break_point:Nn { \prg_break_point:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break_point: }
+\cs_new:Npn \__prg_break_point: { \prg_break_point: }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_map_break:Nn }
+\cs_new:Npn \__prg_map_break:Nn #1 \__prg_break_point:Nn
+ { \prg_map_break:Nn #1 \prg_break_point:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break: }
+\cs_new:Npn \__prg_break: #1 \__prg_break_point: { }
+\__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break:n }
+\cs_new:Npn \__prg_break:n #1#2 \__prg_break_point: {#1}
+%% File: l3sys.dtx Copyright (C) 2015-2018 The LaTeX3 Project
+\str_const:Nx \c_sys_jobname_str { \tex_jobname:D }
+\int_const:Nn \c_sys_minute_int
+ { \int_mod:nn { \tex_time:D } { 60 } }
+\int_const:Nn \c_sys_hour_int
+ { \int_div_truncate:nn { \tex_time:D } { 60 } }
+\int_const:Nn \c_sys_day_int { \tex_day:D }
+\int_const:Nn \c_sys_month_int { \tex_month:D }
+\int_const:Nn \c_sys_year_int { \tex_year:D }
+\cs_new_protected:Npn \__sys_const:nn #1#2
+ {
+ \bool_if:nTF {#2}
+ {
+ \cs_new_eq:cN { #1 :T } \use:n
+ \cs_new_eq:cN { #1 :F } \use_none:n
+ \cs_new_eq:cN { #1 :TF } \use_i:nn
+ \cs_new_eq:cN { #1 _p: } \c_true_bool
+ }
+ {
+ \cs_new_eq:cN { #1 :T } \use_none:n
+ \cs_new_eq:cN { #1 :F } \use:n
+ \cs_new_eq:cN { #1 :TF } \use_ii:nn
+ \cs_new_eq:cN { #1 _p: } \c_false_bool
+ }
+ }
+\str_const:Nx \c_sys_engine_str
+ {
+ \cs_if_exist:NT \luatex_luatexversion:D { luatex }
+ \cs_if_exist:NT \pdftex_pdftexversion:D { pdftex }
+ \cs_if_exist:NT \ptex_kanjiskip:D
+ {
+ \bool_lazy_and:nnTF
+ { \cs_if_exist_p:N \uptex_disablecjktoken:D }
+ { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
+ { uptex }
+ { ptex }
+ }
+ \cs_if_exist:NT \xetex_XeTeXversion:D { xetex }
+ }
+\tl_map_inline:nn { { luatex } { pdftex } { ptex } { uptex } { xetex } }
+ {
+ \__sys_const:nn { sys_if_engine_ #1 }
+ { \str_if_eq_x_p:nn \c_sys_engine_str {#1} }
+ }
+\str_const:Nx \c_sys_output_str
+ {
+ \int_compare:nNnTF
+ { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
+ { pdf }
+ { dvi }
+ }
+\__sys_const:nn { sys_if_output_dvi }
+ { \str_if_eq_x_p:nn \c_sys_output_str { dvi } }
+\__sys_const:nn { sys_if_output_pdf }
+ { \str_if_eq_x_p:nn \c_sys_output_str { pdf } }
%% File: l3clist.dtx Copyright (C) 2004-2011 Frank Mittelbach,
%% The LaTeX3 project
-%% (C) 2012-2017 The LaTeX3 Project
+%% (C) 2012-2018 The LaTeX3 Project
\cs_new_eq:NN \c_empty_clist \c_empty_tl
\tl_new:N \l__clist_internal_clist
\cs_new_protected:Npn \__clist_tmp:w { }
+\cs_new:Npn \__clist_trim_next:w #1 ,
+ {
+ \tl_if_empty:oTF { \use_none:nn #1 ? }
+ { \__clist_trim_next:w \prg_do_nothing: }
+ { \tl_trim_spaces_apply:oN {#1} \exp_end: }
+ }
+\cs_new:Npn \__clist_sanitize:n #1
+ {
+ \exp_after:wN \__clist_sanitize:Nn \exp_after:wN \c_empty_tl
+ \exp:w \__clist_trim_next:w \prg_do_nothing:
+ #1 , \q_recursion_tail , \q_recursion_stop
+ }
+\cs_new:Npn \__clist_sanitize:Nn #1#2
+ {
+ \quark_if_recursion_tail_stop:n {#2}
+ #1 \__clist_wrap_item:w #2 ,
+ \exp_after:wN \__clist_sanitize:Nn \exp_after:wN ,
+ \exp:w \__clist_trim_next:w \prg_do_nothing:
+ }
+\prg_new_conditional:Npnn \__clist_if_wrap:n #1 { TF }
+ {
+ \tl_if_empty:oTF
+ {
+ \__clist_if_wrap:w
+ \q_mark ? #1 ~ \q_mark ? ~ #1 \q_mark , ~ \q_mark #1 ,
+ }
+ {
+ \tl_if_head_is_group:nTF { #1 { } }
+ {
+ \tl_if_empty:nTF {#1}
+ { \prg_return_true: }
+ {
+ \tl_if_empty:oTF { \use_none:n #1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
+\cs_new:Npn \__clist_if_wrap:w #1 \q_mark ? ~ #2 ~ \q_mark #3 , { }
+\cs_new:Npn \__clist_wrap_item:w #1 ,
+ { \__clist_if_wrap:nTF {#1} { \exp_not:n { {#1} } } { \exp_not:n {#1} } }
\cs_new_eq:NN \clist_new:N \tl_new:N
\cs_new_eq:NN \clist_new:c \tl_new:c
\cs_new_protected:Npn \clist_const:Nn #1#2
- { \tl_const:Nx #1 { \__clist_trim_spaces:n {#2} } }
+ { \tl_const:Nx #1 { \__clist_sanitize:n {#2} } }
\cs_generate_variant:Nn \clist_const:Nn { c , Nx , cx }
\cs_new_eq:NN \clist_clear:N \tl_clear:N
\cs_new_eq:NN \clist_clear:c \tl_clear:c
@@ -6551,19 +6664,18 @@
{
#2 #3
{
- \exp_last_unbraced:Nf \use_none:n
- { \seq_map_function:NN #4 \__clist_wrap_item:n }
+ \exp_after:wN \use_none:n \exp:w \exp_end_continue_f:w
+ \seq_map_function:NN #4 \__clist_set_from_seq:n
}
}
}
-\cs_new:Npn \__clist_wrap_item:n #1
+\cs_new:Npn \__clist_set_from_seq:n #1
{
,
- \tl_if_empty:oTF { \__clist_set_from_seq:w #1 ~ , #1 ~ }
- { \exp_not:n {#1} }
+ \__clist_if_wrap:nTF {#1}
{ \exp_not:n { {#1} } }
+ { \exp_not:n {#1} }
}
-\cs_new:Npn \__clist_set_from_seq:w #1 , #2 ~ { }
\cs_generate_variant:Nn \clist_set_from_seq:NN { Nc }
\cs_generate_variant:Nn \clist_set_from_seq:NN { c , cc }
\cs_generate_variant:Nn \clist_gset_from_seq:NN { Nc }
@@ -6587,37 +6699,10 @@
{ TF , T , F , p }
\prg_new_eq_conditional:NNn \clist_if_exist:c \cs_if_exist:c
{ TF , T , F , p }
-\cs_new:Npn \__clist_trim_spaces_generic:nw #1#2 ,
- {
- \__tl_trim_spaces:nn {#2}
- { \exp_args:No \__clist_trim_spaces_generic:nn } {#1}
- }
-\cs_new:Npn \__clist_trim_spaces_generic:nn #1#2 { #2 {#1} }
-\cs_new:Npn \__clist_trim_spaces:n #1
- {
- \__clist_trim_spaces_generic:nw
- { \__clist_trim_spaces:nn { } }
- \q_mark #1 ,
- \q_recursion_tail, \q_recursion_stop
- }
-\cs_new:Npn \__clist_trim_spaces:nn #1 #2
- {
- \quark_if_recursion_tail_stop:n {#2}
- \tl_if_empty:nTF {#2}
- {
- \__clist_trim_spaces_generic:nw
- { \__clist_trim_spaces:nn {#1} } \q_mark
- }
- {
- #1 \exp_not:n {#2}
- \__clist_trim_spaces_generic:nw
- { \__clist_trim_spaces:nn { , } } \q_mark
- }
- }
\cs_new_protected:Npn \clist_set:Nn #1#2
- { \tl_set:Nx #1 { \__clist_trim_spaces:n {#2} } }
+ { \tl_set:Nx #1 { \__clist_sanitize:n {#2} } }
\cs_new_protected:Npn \clist_gset:Nn #1#2
- { \tl_gset:Nx #1 { \__clist_trim_spaces:n {#2} } }
+ { \tl_gset:Nx #1 { \__clist_sanitize:n {#2} } }
\cs_generate_variant:Nn \clist_set:Nn { NV , No , Nx , c , cV , co , cx }
\cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx }
\cs_new_protected:Npn \clist_put_left:Nn
@@ -6725,6 +6810,7 @@
\cs_new_eq:NN \clist_gpush:co \clist_gput_left:co
\cs_new_eq:NN \clist_gpush:cx \clist_gput_left:cx
\clist_new:N \l__clist_internal_remove_clist
+\seq_new:N \l__clist_internal_remove_seq
\cs_new_protected:Npn \clist_remove_duplicates:N
{ \__clist_remove_duplicates:NN \clist_set_eq:NN }
\cs_new_protected:Npn \clist_gremove_duplicates:N
@@ -6742,29 +6828,37 @@
\cs_generate_variant:Nn \clist_remove_duplicates:N { c }
\cs_generate_variant:Nn \clist_gremove_duplicates:N { c }
\cs_new_protected:Npn \clist_remove_all:Nn
- { \__clist_remove_all:NNn \tl_set:Nx }
+ { \__clist_remove_all:NNNn \clist_set_from_seq:NN \tl_set:Nx }
\cs_new_protected:Npn \clist_gremove_all:Nn
- { \__clist_remove_all:NNn \tl_gset:Nx }
-\cs_new_protected:Npn \__clist_remove_all:NNn #1#2#3
+ { \__clist_remove_all:NNNn \clist_gset_from_seq:NN \tl_gset:Nx }
+\cs_new_protected:Npn \__clist_remove_all:NNNn #1#2#3#4
{
- \cs_set:Npn \__clist_tmp:w ##1 , #3 ,
+ \__clist_if_wrap:nTF {#4}
{
- ##1
- , \q_mark , \use_none_delimit_by_q_stop:w ,
- \__clist_remove_all:
+ \seq_set_from_clist:NN \l__clist_internal_remove_seq #3
+ \seq_remove_all:Nn \l__clist_internal_remove_seq {#4}
+ #1 #3 \l__clist_internal_remove_seq
}
- #1 #2
{
- \exp_after:wN \__clist_remove_all:
- #2 , \q_mark , #3 , \q_stop
- }
- \clist_if_empty:NF #2
- {
- #1 #2
+ \cs_set:Npn \__clist_tmp:w ##1 , #4 ,
{
- \exp_args:No \exp_not:o
- { \exp_after:wN \use_none:n #2 }
+ ##1
+ , \q_mark , \use_none_delimit_by_q_stop:w ,
+ \__clist_remove_all:
}
+ #2 #3
+ {
+ \exp_after:wN \__clist_remove_all:
+ #3 , \q_mark , #4 , \q_stop
+ }
+ \clist_if_empty:NF #3
+ {
+ #2 #3
+ {
+ \exp_args:No \exp_not:o
+ { \exp_after:wN \use_none:n #3 }
+ }
+ }
}
}
\cs_new:Npn \__clist_remove_all:
@@ -6810,19 +6904,36 @@
\cs_new:Npn \__clist_if_empty_n:wNw #1 \q_mark #2#3 \q_stop {#2}
\prg_new_protected_conditional:Npnn \clist_if_in:Nn #1#2 { T , F , TF }
{
- \exp_args:No \__clist_if_in_return:nn #1 {#2}
+ \exp_args:No \__clist_if_in_return:nnN #1 {#2} #1
}
\prg_new_protected_conditional:Npnn \clist_if_in:nn #1#2 { T , F , TF }
{
\clist_set:Nn \l__clist_internal_clist {#1}
- \exp_args:No \__clist_if_in_return:nn \l__clist_internal_clist {#2}
+ \exp_args:No \__clist_if_in_return:nnN \l__clist_internal_clist {#2}
+ \l__clist_internal_clist
}
-\cs_new_protected:Npn \__clist_if_in_return:nn #1#2
+\cs_new_protected:Npn \__clist_if_in_return:nnN #1#2#3
{
- \cs_set:Npn \__clist_tmp:w ##1 ,#2, { }
- \tl_if_empty:oTF
- { \__clist_tmp:w ,#1, {} {} ,#2, }
- { \prg_return_false: } { \prg_return_true: }
+ \__clist_if_wrap:nTF {#2}
+ {
+ \cs_set:Npx \__clist_tmp:w ##1
+ {
+ \exp_not:N \tl_if_eq:nnT {##1}
+ \exp_not:n
+ {
+ {#2}
+ { \clist_map_break:n { \prg_return_true: \use_none:n } }
+ }
+ }
+ \clist_map_function:NN #3 \__clist_tmp:w
+ \prg_return_false:
+ }
+ {
+ \cs_set:Npn \__clist_tmp:w ##1 ,#2, { }
+ \tl_if_empty:oTF
+ { \__clist_tmp:w ,#1, {} {} ,#2, }
+ { \prg_return_false: } { \prg_return_true: }
+ }
}
\prg_generate_conditional_variant:Nnn \clist_if_in:Nn
{ NV , No , c , cV , co } { T , F , TF }
@@ -6834,12 +6945,12 @@
{
\exp_last_unbraced:NNo \__clist_map_function:Nw #2 #1
, \q_recursion_tail ,
- \__prg_break_point:Nn \clist_map_break: { }
+ \prg_break_point:Nn \clist_map_break: { }
}
}
\cs_new:Npn \__clist_map_function:Nw #1#2 ,
{
- \__quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
#1 {#2}
\__clist_map_function:Nw #1
}
@@ -6846,16 +6957,16 @@
\cs_generate_variant:Nn \clist_map_function:NN { c }
\cs_new:Npn \clist_map_function:nN #1#2
{
- \__clist_trim_spaces_generic:nw { \__clist_map_function_n:Nn #2 }
- \q_mark #1, \q_recursion_tail,
- \__prg_break_point:Nn \clist_map_break: { }
+ \exp_after:wN \__clist_map_function_n:Nn \exp_after:wN #2
+ \exp:w \__clist_trim_next:w \prg_do_nothing: #1 , \q_recursion_tail ,
+ \prg_break_point:Nn \clist_map_break: { }
}
\cs_new:Npn \__clist_map_function_n:Nn #1 #2
{
- \__quark_if_recursion_tail_break:nN {#2} \clist_map_break:
- \tl_if_empty:nF {#2} { \__clist_map_unbrace:Nw #1 #2, }
- \__clist_trim_spaces_generic:nw { \__clist_map_function_n:Nn #1 }
- \q_mark
+ \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \__clist_map_unbrace:Nw #1 #2,
+ \exp_after:wN \__clist_map_function_n:Nn \exp_after:wN #1
+ \exp:w \__clist_trim_next:w \prg_do_nothing:
}
\cs_new:Npn \__clist_map_unbrace:Nw #1 #2, { #1 {#2} }
\cs_new_protected:Npn \clist_map_inline:Nn #1#2
@@ -6862,14 +6973,14 @@
{
\clist_if_empty:NF #1
{
- \int_gincr:N \g__prg_map_int
+ \int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:cpn
- { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
+ { __clist_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_last_unbraced:Nco \__clist_map_function:Nw
- { __prg_map_ \int_use:N \g__prg_map_int :w }
+ { __clist_map_ \int_use:N \g__kernel_prg_map_int :w }
#1 , \q_recursion_tail ,
- \__prg_break_point:Nn \clist_map_break:
- { \int_gdecr:N \g__prg_map_int }
+ \prg_break_point:Nn \clist_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
}
}
\cs_new_protected:Npn \clist_map_inline:nn #1
@@ -6886,7 +6997,7 @@
{ \__clist_map_variable:Nnw #2 {#3} }
#1
, \q_recursion_tail , \q_recursion_stop
- \__prg_break_point:Nn \clist_map_break: { }
+ \prg_break_point:Nn \clist_map_break: { }
}
}
\cs_new_protected:Npn \clist_map_variable:nNn #1
@@ -6903,9 +7014,9 @@
}
\cs_generate_variant:Nn \clist_map_variable:NNn { c }
\cs_new:Npn \clist_map_break:
- { \__prg_map_break:Nn \clist_map_break: { } }
+ { \prg_map_break:Nn \clist_map_break: { } }
\cs_new:Npn \clist_map_break:n
- { \__prg_map_break:Nn \clist_map_break: }
+ { \prg_map_break:Nn \clist_map_break: }
\cs_new:Npn \clist_count:N #1
{
\int_eval:n
@@ -7020,10 +7131,8 @@
}
}
\cs_new:Npn \__clist_item_n_end:n #1 #2 \q_stop
- {
- \__tl_trim_spaces:nn { \q_mark #1 }
- { \exp_last_unbraced:No \__clist_item_n_strip:w } ,
- }
+ { \tl_trim_spaces_apply:nN {#1} \__clist_item_n_strip:n }
+\cs_new:Npn \__clist_item_n_strip:n #1 { \__clist_item_n_strip:w #1 , }
\cs_new:Npn \__clist_item_n_strip:w #1 , { \exp_not:n {#1} }
\cs_new_protected:Npn \clist_show:N { \__clist_show:NN \msg_show:nnxxxx }
\cs_generate_variant:Nn \clist_show:N { c }
@@ -7031,7 +7140,7 @@
\cs_generate_variant:Nn \clist_log:N { c }
\cs_new_protected:Npn \__clist_show:NN #1#2
{
- \__kernel_check_defined:NT #2
+ \__kernel_chk_defined:NT #2
{
#1 { LaTeX/kernel } { show-clist }
{ \token_to_str:N #2 }
@@ -7052,9 +7161,9 @@
\clist_new:N \g_tmpb_clist
%% File: l3token.dtx Copyright (C) 2005-2018 The LaTeX3 Project
\cs_new_protected:Npn \char_set_catcode:nn #1#2
- { \tex_catcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_catcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_catcode:n #1
- { \tex_the:D \tex_catcode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_catcode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_catcode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_catcode:n {#1} } }
\cs_new_protected:Npn \char_set_catcode_escape:N #1
@@ -7122,27 +7231,27 @@
\cs_new_protected:Npn \char_set_catcode_invalid:n #1
{ \char_set_catcode:nn {#1} { 15 } }
\cs_new_protected:Npn \char_set_mathcode:nn #1#2
- { \tex_mathcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_mathcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_mathcode:n #1
- { \tex_the:D \tex_mathcode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_mathcode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_mathcode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_mathcode:n {#1} } }
\cs_new_protected:Npn \char_set_lccode:nn #1#2
- { \tex_lccode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_lccode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_lccode:n #1
- { \tex_the:D \tex_lccode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_lccode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_lccode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_lccode:n {#1} } }
\cs_new_protected:Npn \char_set_uccode:nn #1#2
- { \tex_uccode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_uccode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_uccode:n #1
- { \tex_the:D \tex_uccode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_uccode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_uccode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_uccode:n {#1} } }
\cs_new_protected:Npn \char_set_sfcode:nn #1#2
- { \tex_sfcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
+ { \tex_sfcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: }
\cs_new:Npn \char_value_sfcode:n #1
- { \tex_the:D \tex_sfcode:D \__int_eval:n {#1} }
+ { \tex_the:D \tex_sfcode:D \int_eval:n {#1} \exp_stop_f: }
\cs_new_protected:Npn \char_show_value_sfcode:n #1
{ \exp_args:Nf \tl_show:n { \char_value_sfcode:n {#1} } }
\seq_new:N \l_char_special_seq
@@ -7171,47 +7280,37 @@
\cs_generate_variant:Nn \char_gset_active_eq:NN { Nc }
\cs_generate_variant:Nn \char_set_active_eq:nN { nc }
\cs_generate_variant:Nn \char_gset_active_eq:nN { nc }
-\__kernel_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } }
+\cs_new_eq:NN \__char_int_to_roman:w \tex_romannumeral:D
\cs_new:Npn \char_generate:nn #1#2
{
\exp:w \exp_after:wN \__char_generate_aux:w
- \__int_value:w \__int_eval:w #1 \exp_after:wN ;
- \__int_value:w \__int_eval:w #2 ;
+ \int_value:w \int_eval:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n {#2} ;
}
-\cs_new:Npn \__char_generate:nn #1#2
- {
- \exp:w \exp_after:wN
- \__char_generate_aux:nnw \exp_after:wN
- { \__int_value:w \__int_eval:w #1 } {#2} \exp_end:
- }
\cs_new:Npn \__char_generate_aux:w #1 ; #2 ;
{
- \if_int_compare:w #2 = 13 \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel } { char-active }
+ \if_int_compare:w #2 = 10 \exp_stop_f:
+ \if_int_compare:w #1 = 0 \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel } { char-null-space }
+ \else:
+ \__kernel_msg_expandable_error:nn { kernel } { char-space }
+ \fi:
\else:
- \if_int_compare:w #2 = 10 \exp_stop_f:
- \if_int_compare:w #1 = 0 \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel } { char-null-space }
- \else:
- \__kernel_msg_expandable_error:nn { kernel } { char-space }
- \fi:
+ \if_int_odd:w 0
+ \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel }
+ { char-invalid-catcode }
\else:
\if_int_odd:w 0
- \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+ \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
\__kernel_msg_expandable_error:nn { kernel }
- { char-invalid-catcode }
+ { char-out-of-range }
\else:
- \if_int_odd:w 0
- \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
- \if_int_compare:w #1 > \c__char_max_int 1 \fi: \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel }
- { char-out-of-range }
- \else:
- \__char_generate_aux:nnw {#1} {#2}
- \fi:
+ \__char_generate_aux:nnw {#1} {#2}
\fi:
\fi:
\fi:
@@ -7223,16 +7322,15 @@
\cs_set:Npn ^^L { }
\char_set_catcode_other:n { 0 }
\if_int_odd:w 0
- \cs_if_exist:NT \luatex_directlua:D { 1 }
- \cs_if_exist:NT \utex_charcat:D { 1 } \exp_stop_f:
- \int_const:Nn \c__char_max_int { 1114111 }
- \cs_if_exist:NTF \luatex_directlua:D
+ \sys_if_engine_luatex:T { 1 }
+ \sys_if_engine_xetex:T { 1 } \exp_stop_f:
+ \sys_if_engine_luatex:TF
{
\cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
{
#3
- \exp_after:wN \exp_end:
- \luatex_directlua:D { l3kernel.charcat(#1, #2) }
+ \exp_after:wN \exp_after:wN \exp_after:wN \exp_end:
+ \lua_now_x:n { l3kernel.charcat(#1, #2) }
}
}
{
@@ -7240,11 +7338,21 @@
{
#3
\exp_after:wN \exp_end:
- \utex_charcat:D #1 ~ #2 ~
+ \utex_charcat:D #1 \exp_stop_f: #2 \exp_stop_f:
}
+ \cs_new_eq:NN \__char_generate_auxii:nnw \__char_generate_aux:nnw
+ \cs_gset:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
+ {
+ #3
+ \if_int_compare:w #2 = 13 \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel } { char-active }
+ \else:
+ \__char_generate_auxii:nnw {#1} {#2}
+ \fi:
+ \exp_end:
+ }
}
\else:
- \int_const:Nn \c__char_max_int { 255 }
\tl_set:Nn \l__char_tmp_tl { \exp_not:N \or: }
\char_set_catcode_group_begin:n { 0 } % {
\tl_put_right:Nn \l__char_tmp_tl { ^^@ \if_false: } }
@@ -7257,7 +7365,7 @@
\tl_put_right:Nn \l__char_tmp_tl
{
\or:
- \etex_unexpanded:D \exp_after:wN
+ \__kernel_exp_not:w \exp_after:wN
{ \exp_after:wN ^^@ \exp_after:wN }
}
\tl_put_right:Nn \l__char_tmp_tl { \or: }
@@ -7283,16 +7391,16 @@
\exp_args:Nx \tex_lowercase:D
{
\tl_const:Nn
- \exp_not:c { c__char_ \__int_to_roman:w #1 _tl }
+ \exp_not:c { c__char_ \__char_int_to_roman:w #1 _tl }
{ \exp_not:o \l__char_tmp_tl }
}
}
- \int_step_function:nnnN { 0 } { 1 } { 11 } \__char_tmp:n
+ \int_step_function:nnN { 0 } { 11 } \__char_tmp:n
\group_begin:
\tl_replace_once:Nnn \l__char_tmp_tl { ^^@ } { \ERROR }
\__char_tmp:n { 12 }
\group_end:
- \int_step_function:nnnN { 13 } { 1 } { 255 } \__char_tmp:n
+ \int_step_function:nnN { 13 } { 255 } \__char_tmp:n
\cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
{
#3
@@ -7301,7 +7409,7 @@
\exp_after:wN \exp_after:wN
\if_case:w #2
\exp_last_unbraced:Nv \exp_stop_f:
- { c__char_ \__int_to_roman:w #1 _tl }
+ { c__char_ \__char_int_to_roman:w #1 _tl }
\fi:
}
\fi:
@@ -7308,9 +7416,9 @@
\group_end:
\tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\ } { 12 } }
\group_begin:
- \__chk_if_free_cs:N \c_group_begin_token
+ \__kernel_chk_if_free_cs:N \c_group_begin_token
\tex_global:D \tex_let:D \c_group_begin_token {
- \__chk_if_free_cs:N \c_group_end_token
+ \__kernel_chk_if_free_cs:N \c_group_end_token
\tex_global:D \tex_let:D \c_group_end_token }
\char_set_catcode_math_toggle:N \*
\cs_new_eq:NN \c_math_toggle_token *
@@ -7320,7 +7428,7 @@
\cs_new_eq:NN \c_math_superscript_token ^
\char_set_catcode_math_subscript:N \*
\cs_new_eq:NN \c_math_subscript_token *
- \__chk_if_free_cs:N \c_space_token
+ \__kernel_chk_if_free_cs:N \c_space_token
\use:n { \tex_global:D \tex_let:D \c_space_token = ~ } ~
\cs_new_eq:NN \c_catcode_letter_token a
\cs_new_eq:NN \c_catcode_other_token 1
@@ -7416,11 +7524,9 @@
##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \exp_not:N \q_stop
}
{
- \if_int_compare:w \__str_if_eq_x:nn { #2 } { cro } = 0 \exp_stop_f:
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
+ \str_if_eq_x:nnTF { #2 } { cro }
+ { \prg_return_true: }
+ { \prg_return_false: }
}
\prg_new_conditional:Npnn \token_if_cs:N #1 { p , T , F , TF }
{
@@ -7474,7 +7580,7 @@
\exp_not:N \prg_return_false:
\exp_not:N \else:
}
- \exp_not:N \__str_if_eq_x_return:nn
+ \exp_not:N \str_if_eq_x:nnTF
{
\exp_not:N \exp_after:wN
\exp_not:c { __token_delimit_by_ #2 :w }
@@ -7482,6 +7588,8 @@
? \tl_to_str:n {#2} \exp_not:N \q_stop
}
{ \exp_not:n {#3} }
+ { \exp_not:N \prg_return_true: }
+ { \exp_not:N \prg_return_false: }
\cs_if_exist:cT { tex_ #2 :D }
{
\exp_not:N \fi:
@@ -7761,8 +7869,8 @@
}
\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN }
\cs_new_protected:Npn \token_new:Nn #1#2 { \cs_new_eq:NN #1 #2 }
-%% File: l3prop.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\__scan_new:N \s__prop
+%% File: l3prop.dtx Copyright (C) 1990-2018 The LaTeX3 Project
@@ Diff output truncated at 1234567 characters. @@
More information about the tex-live-commits
mailing list