diff options
author | Karl Berry <karl@freefriends.org> | 2018-02-23 21:54:14 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-02-23 21:54:14 +0000 |
commit | 87d871a3d83784d48b71fa3712b9f525bfc710d2 (patch) | |
tree | f12f9ffdc697b5af9ee14c06874ec0e2f72c9f94 /Master/texmf-dist | |
parent | ccc63194ce7813106830c8a8755c54d89de831b4 (diff) |
l3 (22feb18)
git-svn-id: svn://tug.org/texlive/trunk@46720 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
139 files changed, 10107 insertions, 3100 deletions
diff --git a/Master/texmf-dist/doc/latex/l3experimental/README.md b/Master/texmf-dist/doc/latex/l3experimental/README.md index db2488dc367..7de3ca2cfff 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/README.md +++ b/Master/texmf-dist/doc/latex/l3experimental/README.md @@ -1,7 +1,7 @@ Experimental LaTeX3 Concepts ============================ -Release 2017/12/16 +Release 2018/02/21 Overview -------- @@ -21,10 +21,27 @@ updated at the same time. Currently included in the CTAN release of l3experimental are the following bundles: +* `l3color` +* `l3draw` * `l3str` * `xcoffins` * `xgalley` +`l3color` +--------- + +This module provides support for setting colors using a range of color models. +It also allows the construction of 'color expressions', in which multiple colors +are mixed together at the macro level. There is also support for spot colors: +the latter is highly experimental. + +`l3draw` +-------- + +This module provides a code-level interface for constructing drawings. The +interfaces are heavily inspired by the `pgf` layer of the widely-used +TikZ system. + `l3str` ------- @@ -111,6 +128,6 @@ the [LaTeX-L list](#Discussion) should be used. ----- -<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> diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf Binary files differnew file mode 100644 index 00000000000..db0487baf80 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf Binary files differnew file mode 100644 index 00000000000..9f5c3e16e2f --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex new file mode 100644 index 00000000000..e7a097136fb --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex @@ -0,0 +1,63 @@ +\iffalse meta-comment + + File: l3draw-code.tex 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 "l3experimental bundle" (The Work in LPPL) + and all files in that bundle must be distributed together. + + The released version of this bundle is available from CTAN. + + ----------------------------------------------------------------------- + + The development version of the bundle can be found at + + https://github.com/latex3/latex3 + + for those people who are interested. + +\fi + +\documentclass{l3doc} + +\begin{document} + +\makeatletter +\let\DelayPrintIndex\PrintIndex +\let\PrintIndex\@empty +\makeatother + +\DisableImplementation + +\DocInput{l3draw.dtx} + +\ExplSyntaxOn +\clist_gput_right:Nn \g_docinput_clist + { + l3draw-paths.dtx , + l3draw-points.dtx , + l3draw-scopes.dtx , + l3draw-softpath.dtx , + l3draw-state.dtx , + l3draw-transforms.dtx + } +\ExplSyntaxOff + +\part{Implementation} + +\def\maketitle{} +\EnableImplementation +\DisableDocumentation +\DocInputAgain + +\clearpage + +\DelayPrintIndex + +\end{document} diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf Binary files differnew file mode 100644 index 00000000000..3ddbe38b733 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf Binary files differindex 5b589046569..c888ae64af6 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf Binary files differindex 2b0418a00ae..5b168852122 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf Binary files differindex 60ba438fdaa..f82daca5170 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf Binary files differindex b24f545b668..5dfbd0ab757 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf Binary files differindex 56accc4f84b..53a23eaaf27 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md index d8636f7eca1..8b339391277 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/README.md +++ b/Master/texmf-dist/doc/latex/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2017/12/16 +Release 2018/02/21 Overview -------- diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf Binary files differindex d9370e128e6..02c4ad8f71e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf Binary files differindex c88ea3a922c..e00f476b8ea 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex index 0f765bf7231..5683698ca12 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex @@ -52,7 +52,7 @@ {latex-team@latex-project.org}% }% } -\date{Released 2017/12/16} +\date{Released 2018/02/21} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf Binary files differindex e65cf767148..2d99be49c05 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf Binary files differindex 14ab601f775..c8da372639f 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex index cdea1d34965..8808a26c91f 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex @@ -30,7 +30,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2017/12/16} +\date{Released 2018/02/21} \begin{document} diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf Binary files differindex 2bc5eed7acd..2ebae275840 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex index d43bfc555de..108ae480f98 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex @@ -30,7 +30,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2017/12/16} +\date{Released 2018/02/21} \newcommand{\TF}{\textit{(TF)}} diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf Binary files differindex 49002359a4c..1a4bf0dc3df 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex index 2151995ddce..58eaafc0e61 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.tex @@ -51,7 +51,7 @@ {latex-team@latex-project.org}% }% } -\date{Released 2017/12/16} +\date{Released 2018/02/21} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex index 5d44250be03..57c36a4c4fd 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: source3body.tex Copyright (C) 1990-2012,2014-2017 The LaTeX3 Project +%% File: source3body.tex Copyright (C) 1990-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 @@ -430,6 +430,7 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments. l3fp-traps.dtx , l3fp-round.dtx , l3fp-parse.dtx , + l3fp-assign.dtx , l3fp-logic.dtx , l3fp-basics.dtx , l3fp-extended.dtx , @@ -437,7 +438,6 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments. l3fp-trig.dtx , l3fp-convert.dtx , l3fp-random.dtx , - l3fp-assign.dtx , } \ExplSyntaxOff @@ -447,7 +447,7 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments. \DocInput{l3regex.dtx} \DocInput{l3box.dtx} \DocInput{l3coffins.dtx} -\DocInput{l3color.dtx} +\DocInput{l3color-base.dtx} \DocInput{l3sys.dtx} \DocInput{l3deprecation.dtx} \DocInput{l3candidates.dtx} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx new file mode 100644 index 00000000000..f00c047afff --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx @@ -0,0 +1,876 @@ +% \iffalse meta-comment +% +%% File: l3color.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 +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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|package> +\RequirePackage{expl3} +%</driver|package> +%<*driver> +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \textsf{l3color} package\\ Experimental color support^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{documentation} +% +% \section{Color models} +% +% A color \emph{model} is a way to represent sets of colors. Different models +% are particularly suitable for different output methods, \emph{e.g.}~screen +% or print. Parameter-based models can describe a very large number of unique +% colors, and have a varying number of \emph{axes} which define a color +% space. In contrast, various proprietary models are available which define +% \emph{spot} colors. +% +% The models supported here are +% \begin{itemize} +% \item \texttt{gray} Grayscale color, with a single axis running from +% $0$ (fully black) to $1$ (fully white) +% \item \texttt{rgb} Red-green-blue color, with three axes, one for each of +% the components +% \item \texttt{cmyk} Cyan-magenta-yellow-black color, with four axes, one for +% each of the components +% \item \texttt{spot} Spot color, with one value, the name of the color +% (see \url{https://helpx.adobe.com/indesign/using/spot-process-colors.html} +% for details of the use of spot colors in print) +% \end{itemize} +% +% Additional models may be created to allow mixing of spot colors +% with each other or with those from other models. See +% Section~\ref{l3color:sec:spot} for more detail of spot color support. +% +% When color is selected by model, the \meta{values} given are specified as +% a comma-separated list. The length of the list will therefore be determined +% by the detail of the model involved. +% +% Color models (and interconversion) are complex, and more details are given +% in the manual to the \LaTeXe{} \pkg{xcolor} package and in the +% \emph{PostScript Language Reference Manual}, published by Addison--Wesley. +% +% \section{Color expressions} +% +% In addition to allowing specification of color by model and values, +% \pkg{l3color} also supports color expressions. These are created +% by combining one or more color names, with the amount of each specified +% as a percentage. The latter is given between |!| symbols in the expression. +% Thus for example +% \begin{verbatim} +% red!50!green +% \end{verbatim} +% is a mixture of $50\,\%$ red and $50\,\%$ green. A trailing percentage is +% interpreted as implicitly followed by |white|, and so +% \begin{verbatim} +% red!25 +% \end{verbatim} +% specifies $25\,\%$ red mixed with $75\,\%$ white. +% +% Where the models for the mixed colors are different, the model of the first +% color is used. Thus +% \begin{verbatim} +% red!50!cyan +% \end{verbatim} +% will result in a color specification using the |rgb| model, made up of +% $50\,\%$ red and $50\,\%$ of cyan \emph{expressed in \texttt{rgb}}. As color +% model interconversion is not exact. +% +% The one exception to the above is where the first model in an expression is +% |gray|. In this case, the order of mixing is \enquote{swapped} internally, so +% that for example +% \begin{verbatim} +% black!50!red +% \end{verbatim} +% has the same result as +% \begin{verbatim} +% red!50!black +% \end{verbatim} +% (the predefined colors |black| and |white| use the |gray| model). +% +% Where more than two colors are mixed in an expression, evaluation takes place +% in a stepwise fashion. Thus in +% \begin{verbatim} +% cyan!50!magenta!10!yellow +% \end{verbatim} +% the sub-expression +% \begin{verbatim} +% cyan!50!magenta +% \end{verbatim} +% is first evaluated to give an intermediate color specification, before +% the second step +% \begin{verbatim} +% <intermediate>!10!yellow +% \end{verbatim} +% where |<intermediate>| represents this transitory calculated value. +% +% Within a color expression, |.| may be used to represent the color active +% for typesetting (the current color). This allows for example +% \begin{verbatim} +% .!50 +% \end{verbatim} +% to mean a mixture of $50\,\%$ of current color with white. +% +% (Color expressions supported here are a subset of those provided by +% the \LaTeXe{} \pkg{xcolor} package. At present, only such features as are +% clearly useful have been added here.) +% +% \section{Named colors} +% +% Color names are stored in a single namespace, which makes them accessible +% as part of color expressions. Whilst they are not reserved in a technical +% sense, the names |black|, |white|, |red|, |green|, |blue|, |cyan|, |magenta| +% and |yellow| have special meaning and should not be redefined. Color names +% should be made up of letters, numbers and spaces only: other characters are +% reserved for use in color expressions. In particular, |.| represents the +% current color at the start of a color expression. +% +% \begin{function}{\color_set:nn} +% \begin{syntax} +% \cs{color_set:nn} \Arg{name} \Arg{color expression} +% \end{syntax} +% Evaluates the \meta{color expression} and stores the resulting +% color specification as the \meta{name}. +% \end{function} +% +% \begin{function}{\color_set:nnn} +% \begin{syntax} +% \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)} +% \end{syntax} +% Stores the color specification equivalent to the \meta{model} and +% \meta{values} as the \meta{name}. +% \end{function} +% +% \begin{function}{\color_set_eq:nn} +% \begin{syntax} +% \cs{color_set_eq:nn} \Arg{name1} \Arg{name2} +% \end{syntax} +% Copies the color specification in \meta{name2} to \meta{name1}. The +% special name |.| may be used to represent the current color, allowing +% it to be saved to a name. +% \end{function} +% +% \begin{function}{\color_show:n} +% \begin{syntax} +% \cs{color_show:n} \Arg{name} +% \end{syntax} +% Displays the color specification stored in the \meta{name} on the +% terminal +% \end{function} +% +% \section{Selecting colors} +% +% \begin{function}{\color_select:n} +% \begin{syntax} +% \cs{color_select:n} \Arg{color expression} +% \end{syntax} +% Parses the \meta{color expression} and then activates the resulting +% color specification for typeset material. +% \end{function} +% +% \begin{function}{\color_select:nn} +% \begin{syntax} +% \cs{color_select:nn} \Arg{model} \Arg{value(s)} +% \end{syntax} +% Activates the color specification equivalent to the \meta{model} and +% \meta{value(s)} for typeset material. +% \end{function} +% +% \begin{variable}{\l_color_fixed_model_tl} +% When this is set to a non-empty value, colors will be converted to +% the specified model when they are selected. Note that included images +% and similar are not influenced by this setting. +% \end{variable} +% +% \section{Core color representation} +% +% To allow data to be handled internally, \pkg{l3color} uses a simple +% representation of color, based on that used by the \pkg{dvips} program. +% This is a token list made up of the model name followed by one or more +% data entries, each separated by a \emph{space}. The valid forms are thus +% \begin{itemize} +% \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray} +% value running from $0$ (fully black) to $1$ (fully white) +% \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}, +% each of which falls in the range $[0,1]$ +% \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}, +% each of which falls in the range $[0,1]$ +% \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color, +% where the \meta{name} should be a pre-defined string color name and the +% \meta{tint} should be in the range $[0,1]$. +% \end{itemize} +% +% This core representation is produced when parsing color expressions. +% +% \begin{function}{\color_parse:nN} +% \begin{syntax} +% \cs{color_parse:nN} \Arg{color expression} \Arg{tl} +% \end{syntax} +% Parses the \meta{color expression} as described above, and sets the +% \meta{tl} the the equivalent \meta{core color representation}. +% \end{function} +% +% \section{Spot colors} +% \label{l3color:sec:spot} +% +% \end{documentation} +% +% \begin{implementation} +% +% \section{\pkg{l3color} Implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=color> +% \end{macrocode} +% +% \begin{macrocode} +%<*package> +\ProvidesExplPackage{l3color}{2018/02/21}{} + {L3 Experimental color support} +%</package> +% \end{macrocode} +% +% \subsection{Predefined color names} +% +% The ability to predefine colors with a name is a key part of this module and +% means there has to be a method for storing the results. At first sight, it +% seems natural to follow the usual \pkg{expl3} model and create a +% \texttt{color} variable type for the process. That would then allow both +% local and global colors, constant colors and the like. However, these names +% need to be accessible in some form at the user level, for selection of colors +% either simply by name or as part of a more complex expression. This does not +% require that the full name is exposed but does require that they can be +% looked up in a predictable way. As such, it is more useful to expose just the +% color names as part of the interface, with the result that only local color +% names can be created. (This is also seen for example in key creation in +% \pkg{l3keys}.) As a result, color names are declarative (no \texttt{new} +% functions). +% +% Since there is no need to manipulate colors \emph{en masse}, each is stored +% in a separate token list variable, rather than the alternative of using a +% single property list for all names. +% +% \subsection{Setup} +% +% \begin{variable}{\l_@@_tmp_tl} +% \begin{macrocode} +\tl_new:N \l_@@_tmp_tl +% \end{macrocode} +% \end{variable} +% +% \subsection{Utility functions} +% +% \begin{macro}[int, TF, EXP]{\@@_if_defined:n} +% A simple wrapper to avoid needing to have the lookup repeated in too many +% places. +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF } + { + \tl_if_exist:cTF { l_@@_named_ #1 _tl } + \prg_return_true: + \prg_return_false: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_extract:nNN, \@@_extract:VNN} +% \begin{macro}{\@@_extract:NNw} +% Split the model and color from a named color, and store the two. No test +% for the existence of the color: that is assumed to be the case (this +% is internal only). Somewhat \enquote{old-fashioned} but should be quite +% fast. +% \begin{macrocode} +\cs_new_protected:Npn \@@_extract:nNN #1#2#3 + { + \exp_after:wN \exp_after:wN \exp_after:wN + \@@_extract:NNw + \exp_after:wN \exp_after:wN \exp_after:wN #2 + \exp_after:wN \exp_after:wN \exp_after:wN #3 + \cs:w l_@@_named_ #1 _tl \cs_end: \q_stop + } +\cs_generate_variant:Nn \@@_extract:nNN { V } +\cs_new_protected:Npn \@@_extract:NNw #1#2 #3 ~ #4 \q_stop + { + \tl_set:Nn #1 {#3} + \tl_set:Nn #2 {#4} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Model conversion} +% +% \begin{macro}{\@@_convert:nnN, \@@_convert:VVN} +% \begin{macro}{\@@_convert:nnnN} +% \begin{macro}[aux, EXP] +% { +% \@@_convert_gray_rgb:w +% \@@_convert_gray_cmyk:w +% \@@_convert_cmyk_gray:w +% \@@_convert_cmyk_rgb:w +% \@@_convert_rgb_gray:w +% \@@_convert_rgb_cmyk:w +% } +% \begin{macro}[aux, EXP]{\@@_convert_rgb_cmyk:nnnn} +% Model conversion is carried out using standard formulae, as described in +% the manual for \pkg{xcolor} (see also the \emph{PostScript Language +% Reference Manual}). +% \begin{macrocode} +\cs_new_protected:Npn \@@_convert:nnN #1#2#3 + { \@@_convert:nnVN {#1} {#2} #3 #3 } +\cs_generate_variant:Nn \@@_convert:nnN { VV } +\cs_new_protected:Npn \@@_convert:nnnN #1#2#3#4 + { + \str_if_eq_x:nnT {#1} { spot } % TO DO!!! + { } + \tl_set:Nx #4 + { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \q_stop } + } +\cs_generate_variant:Nn \@@_convert:nnnN { nnV } +\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \q_stop + { #1 ~ #1 ~ #1 } +\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \q_stop + { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } } +% \end{macrocode} +% These rather odd values are based on \textsc{ntsc} television: the set are +% used for the |cmyk| conversion. +% \begin{macrocode} +\cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \q_stop + { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } } +% \end{macrocode} +% The conversion from |rgb| to |cmyk| is the most complex: a two-step +% procedure which requires \emph{black generation} and \emph{undercolor +% removal} functions. The PostScript reference describes them as +% device-dependent, but following \pkg{xcolor} we assume they are linear. +% Moreover, as the likelihood of anyone using a non-unitary matrix here is +% tiny, we simplify and treat those two concepts as no-ops. +% \begin{macrocode} +\cs_new:Npn \@@_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop + { + \exp_args:Nf \@@_convert_rgb_cmyk:nnnn + { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3} + } +\cs_new:Npn \@@_convert_rgb_cmyk:nnnn #1#2#3#4 + { + \fp_eval:n { min ( 1 , max ( 0 , 1 - #2 - #1 ) ) } \c_space_tl + \fp_eval:n { min ( 1 , max ( 0 , 1 - #3 - #1 ) ) } \c_space_tl + \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl + #1 + } +\cs_new:Npn \@@_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop + { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } } +\cs_new:Npn \@@_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop + { + \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl + \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl + \fp_eval:n { 1 - min ( 1 , #3 + #4 ) } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Color expressions} +% +% \begin{variable} +% {\l_@@_model_tl, \l_@@_value_tl, \l_@@_next_model_tl, \l_@@_next_value_tl} +% Working space to store the color data whilst doing calculations: keeping +% it on the stack is attractive but gets tricky (return is non-trivial). +% \begin{macrocode} +\tl_new:N \l_@@_model_tl +\tl_new:N \l_@@_value_tl +\tl_new:N \l_@@_next_model_tl +\tl_new:N \l_@@_next_value_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\color_parse:nN} +% \begin{macro}{\@@_parse:nN} +% \begin{macro}{\@@_parse:Nw} +% \begin{macro}{\@@_parse_loop_init:Nnn} +% \begin{macro}{\@@_parse_loop:w} +% \begin{macro}{\@@_parse_loop:nn} +% \begin{macro}{\@@_parse_break:w} +% \begin{macro}{\@@_parse_end:} +% \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn} +% \begin{macro}[aux, EXP]{\@@_parse_mix:nNnn} +% \begin{macro}[aux, EXP] +% { +% \@@_parse_mix_gray:nw , +% \@@_parse_mix_rgb:nw , +% \@@_parse_mix_cmyk:nw +% } +% The main function for parsing color expressions removes actives but +% otherwise expands, then starts working through the expression itself. +% At the end, we apply the payload. +% \begin{macrocode} +\cs_new_protected:Npn \color_parse:nN #1#2 + { + \group_begin: + \seq_map_inline:Nn \l_char_active_seq + { + \tl_set:Nx \l_@@_tmp_tl { \cs_to_str:N ##1 } + \char_set_active_eq:NN ##1 \l_@@_tmp_tl + } + \tl_set:Nx \l_@@_tmp_tl {#1} + \exp_args:NNV \group_end: + \@@_parse:nN \l_@@_tmp_tl #2 + } +% \end{macrocode} +% Before going to all of the effort of parsing an expression, these two +% precursor functions look for a pre-defined name, either on its own or +% with a trailing |!| (which is the same thing). +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse:nN #1#2 + { + \tl_if_exist:cTF { l_@@_named_ #1 _tl } + { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } } + { \@@_parse:Nw #2#1 ! \q_stop } + } +\cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \q_stop + { + \@@_if_defined:nTF {#2} + { + \tl_if_blank:nTF {#3} + { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } } + { \@@_parse_loop_init:Nnn #1 {#2} {#3} } + } + { + \__kernel_msg_error:nnn { color } { unknown-color } {#3} + \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl + } + } +% \end{macrocode} +% Once we establish that a full parse is needed, the next job is to get the +% detail of the first color. That will determine the model we use for the +% calculation: splitting here makes checking that a bit easier. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_loop_init:Nnn #1#2#3 + { + \group_begin: + \@@_extract:nNN {#2} \l_@@_model_tl \l_@@_value_tl + \@@_parse_loop:w #3 ! ! ! ! \q_stop + \tl_set:Nx \l_@@_tmp_tl + { \l_@@_model_tl \c_space_tl \l_@@_value_tl } + \exp_args:NNNV \group_end: + \tl_set:Nn #1 \l_@@_tmp_tl + } +% \end{macrocode} +% This is the loop proper: there can be an open-ended set of colors to parse, +% separated by |!| tokens. There are a few cases to look out for. At the end +% of the expression and with we find a mix of $100$ then we simply skip the +% next color entirely (we can't stop the loop as there might be a further +% valid color to mix in). On the other hand, if we get a mix of $0$ then +% drop everything so far and start again. There is also a trailing +% |white| to \enquote{read in} if the final explicit data is a mix. +% Those conditions are separate from actually looping, which is therefore +% sorted out by checking if we have further data to process: in contrast +% to \pkg{xcolor}, we don't allow |!!| so the test can be simplified. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_loop:w #1 ! #2 ! #3 ! #4 ! #5 \q_stop + { + \bool_lazy_or:nnF + { \tl_if_blank_p:n {#1} } + { \int_compare_p:nNn {#1} = { 100 } } + { + \int_compare:nNnTF {#1} = { 0 } + { + \tl_if_blank:nTF {#2} + { \@@_extract:nNN { white } } + { \@@_extract:nNN {#2} } + \l_@@_model_tl \l_@@_value_tl + } + { + \use:x + { + \@@_parse_loop:nn {#1} + { \tl_if_blank:nTF {#2} { white } {#2} } + } + } + } + \tl_if_blank:nF {#3} + { \@@_parse_loop:w #3 ! #4 ! #5 \q_stop } + \@@_parse_end: + } +% \end{macrocode} +% The \enquote{payload} of calculation in the loop first. If the model for +% the upcoming color is different from that of the existing (partial) color, +% convert the model. For |gray| the two are flipped round so that the outcome +% is something with \enquote{real} color. We are then in a position to do the +% actual calculation itself. The two auxiliaries here give us a way to break +% the loop should an invalid name be found. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_loop:nn #1#2 + { + \@@_if_defined:nTF {#2} + { + \@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl + \tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl + { + \str_if_eq_x:nnT { \l_@@_model_tl } { gray } + { + \use:x + { + \tl_set:Nn \exp_not:N \l_@@_model_tl + { \l_@@_next_model_tl } + \tl_set:Nn \exp_not:N \l_@@_value_tl + { \l_@@_next_value_tl } + \tl_set:Nn \exp_not:N \l_next_@@_model_tl + { \l_@@_model_tl } + \tl_set:Nn \exp_not:N \l_next_@@_value_tl + { \l_@@_value_tl } + } + } + \@@_convert:VVN + \l_@@_next_model_tl + \l_@@_model_tl + \l_@@_next_value_tl + } + \tl_set:Nx \l_@@_value_tl + { + \@@_parse_mix:NVVn + \l_@@_model_tl \l_@@_value_tl \l_@@_next_value_tl {#1} + } + } + { + \__kernel_msg_error:nnn { color } { unknown-color } {#2} + \@@_extract:nNN { black } \l_@@_model_tl \l_@@_value_tl + \@@_parse_break:w + } + } +\cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { } +\cs_new_protected:Npn \@@_parse_end: { } +% \end{macrocode} +% Do the vector arithmetic: mainly a question of shuffling input, along +% with one pre-calculation to keep down the use of division. +% \begin{macrocode} +\cs_new:Npn \@@_parse_mix:Nnnn #1#2#3#4 + { + \exp_args:Nf \@@_parse_mix:nNnn + { \fp_eval:n { #4 / 100 } } + #1 {#2} {#3} + } +\cs_generate_variant:Nn \@@_parse_mix:Nnnn { NVV } +\cs_new:Npn \@@_parse_mix:nNnn #1#2#3#4 + { + \use:c { @@_parse_mix_ #2 :nw } {#1} + #3 \q_mark #4 \q_stop + } +\cs_new:Npn \@@_parse_mix_gray:nw #1#2 \q_mark #3 \q_stop + { \fp_eval:n { #2 * #1 + #3 * ( 1 - #1 ) } } +\cs_new:Npn \@@_parse_mix_rgb:nw + #1#2 ~ #3 ~ #4 \q_mark #5 ~ #6 ~ #7 \q_stop + { + \fp_eval:n { #2 * #1 + #5 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #3 * #1 + #6 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #4 * #1 + #7 * ( 1 - #1 ) } + } +\cs_new:Npn \@@_parse_mix_cmyk:nw + #1#2 ~ #3 ~ #4 ~ #5 \q_mark #6 ~ #7 ~ #8 ~ #9 \q_stop + { + \fp_eval:n { #2 * #1 + #6 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #3 * #1 + #7 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #4 * #1 + #8 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #5 * #1 + #9 * ( 1 - #1 ) } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP] +% {\@@_parse_gray:w, \@@_parse_rgb:w, \@@_parse_cmyk:w, \@@_parse_spot:w} +% \begin{macro}[EXP]{\@@_parse_spot_aux:w} +% Turn the input into internal form. +% \begin{macrocode} +\cs_new:Npn \@@_parse_gray:w #1 , #2 \q_stop {#1} +\cs_new:Npn \@@_parse_rgb:w #1 , #2 , #3 , #4 \q_stop { #1 ~ #2 ~ #3 } +\cs_new:Npn \@@_parse_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop + { #1 ~ #2 ~ #3 ~ #4 } +\cs_new:Npn \@@_parse_spot:w #1 , #2 \q_stop + { \@@_parse_spot_aux:w #1 ! 100 ! \q_stop } +\cs_new:Npn \@@_parse_spot_aux:w #1 ! #2 ! #3 \q_stop + { #1 ~ \fp_eval:n { #2 / 100 } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Selecting colors (and color models)} +% +% \begin{variable}{\l_color_fixed_model_tl} +% For selecting a single fixed model. +% \begin{macrocode} +\tl_new:N \l_color_fixed_model_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_select:} +% \begin{macro}{\@@_finalise:N} +% \begin{macro}{\@@_finalise:w} +% A driver-neutral location for \enquote{last minute} manipulations before +% handing off to the driver code. We set the special |.| syntax here: this +% will therefore always be available. The finalisation is separate from the +% main function so it can also be applied to \emph{e.g.}~page color. +% \begin{macrocode} +\cs_new_protected:Npn \@@_select: + { + \@@_finalise:N \l_@@_current_tl + \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl + \@@_select:V \l_@@_current_tl + } +\cs_new_protected:Npn \@@_finalise:N #1 + { + \tl_if_empty:NF \l_color_fixed_model_tl + { + \exp_after:wN \@@_finalise:w #1 \q_stop + \tl_if_eq:NNF \l_@@_model_tl \l_color_fixed_model_tl + { + \@@_convert:VVN \l_@@_model_tl \l_color_fixed_model_tl + \l_@@_value_tl + } + \tl_set:Nx #1 + { \l_color_fixed_model_tl \c_space_tl \l_@@_value_tl } + } + } +\cs_new_protected:Npn \@@_finalise:w #1 ~ #2 \q_stop + { + \tl_set:Nn \l_@@_model_tl {#1} + \tl_set:Nn \l_@@_value_tl {#2} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\color_select:n} +% \begin{macro}{\color_select:nn} +% Parse the input expressions then get the driver to actually activate +% them. +% \begin{macrocode} +\cs_new_protected:Npn \color_select:n #1 + { + \color_parse:nN {#1} \l_@@_current_tl + \@@_select: + } +\cs_new_protected:Npn \color_select:nn #1#2 + { + \@@_direct:nnN {#1} {#2} \l_@@_current_tl + \@@_select: + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Direct model use} +% +% \begin{macro}{\@@_direct:nnN} +% Directly set a color based on a model/value combination. +% \begin{macrocode} +\cs_new_protected:Npn \@@_direct:nnN #1#2#3 + { + \cs_if_exist:cTF { @@_parse_ #1 :w } + { + \tl_set:Nx #3 + { #1 ~ \use:c { @@_parse_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop } + } + { + \__kernel_msg_error:nnn { color } { invalid-model } {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Defining named colors} +% +% \begin{variable}{\l_@@_named_tl} +% Space to store the detail of the named color. +% \begin{macrocode} +\tl_new:N \l_@@_named_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_store:Nn} +% Store the named color unless it has an invalid name. +% \begin{macrocode} +\cs_new_protected:Npn \@@_store:Nn #1#2 + { + \str_if_eq:nnF {#2} { . } + { + \tl_clear_new:c { l_@@_named_ #2 _tl } + \tl_set_eq:cN { l_@@_named_ #2 _tl } #1 + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\color_set:nn} +% \begin{macro}{\color_set:nnn} +% \begin{macro}{\color_set_eq:nn} +% Defining named colors has to include a step to force creation of the +% underlying token list to avoid errors when checking is enabled. +% \begin{macrocode} +\cs_new_protected:Npn \color_set:nn #1#2 + { + \color_parse:nN {#2} \l_@@_named_tl + \@@_store:Nn \l_@@_named_tl {#1} + } +\cs_new_protected:Npn \color_set:nnn #1#2#3 + { + \@@_direct:nnN {#2} {#3} \l_@@_named_tl + \@@_store:Nn \l_@@_named_tl {#1} + } +\cs_new_protected:Npn \color_set_eq:nn #1#2 + { + \@@_if_defined:nTF {#2} + { + \tl_clear_new:c { l_@@_named_ #1 _tl } + \str_if_eq:nnTF {#2} { . } + { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl } + { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } } + } + { + \__kernel_msg_error:nnn { color } { unknown-color } {#2} + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% A small set of colors are always defined. +% \begin{macrocode} +\color_set:nnn { black } { gray } { 0 } +\color_set:nnn { white } { gray } { 1 } +\color_set:nnn { cyan } { cmyk } { 1 , 0 , 0 , 0 } +\color_set:nnn { magenta } { cmyk } { 0 , 1 , 0 , 0 } +\color_set:nnn { yellow } { cmyk } { 0 , 0 , 1 , 0 } +\color_set:nnn { red } { rgb } { 1 , 0 , 0 } +\color_set:nnn { green } { rgb } { 0 , 1 , 0 } +\color_set:nnn { blue } { rgb } { 0 , 0 , 1 } +% \end{macrocode} +% +% \begin{variable}{\l_@@_named_._tl} +% A special named color: this is always defined though not fixed in +% definition. +% \begin{macrocode} +\tl_new:c { l_@@_named_._tl } +% \end{macrocode} +% \end{variable} +% +% \subsection{Diagnostics} +% +% \begin{macro}{\color_show:n} +% \begin{macro}{\@@_show:w} +% \begin{macro}{\@@_show_gray:w, \@@_show_rgb:w, \@@_show_cmyk:w} +% Extract the information about a color and format for the user: the approach +% is similar to the keys module here. +% \begin{macrocode} +\cs_new_protected:Npn \color_show:n #1 + { + \msg_show:nnxxxx { LaTeX / color } { show } + {#1} + { + \@@_if_defined:nTF {#1} + { \exp_last_unbraced:Nv \@@_show:w { l_@@_named_ #1 _tl } \q_stop } + { } + } + { } + { } + } +\cs_new:Npn \@@_show:w #1 ~ #2 \q_stop + { + \msg_show_item_unbraced:nn { model } {#1} + \exp_args:Nnf \msg_show_item_unbraced:nn { value } + { \use:c { @@_show_ #1 :w } #2 \q_stop } + } +\cs_new:Npn \@@_show_gray:w #1 \q_stop { #1 } +\cs_new:Npn \@@_show_rgb:w #1 ~ #2 ~ #3 \q_stop { #1 ,~ #2 ,~ #3 } +\cs_new:Npn \@@_show_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop { #1 ,~ #2 ,~ #3 ,~ #4 } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Messages} +% +% \begin{macrocode} +\__kernel_msg_new:nnnn { color } { invalid-model } + { Invalid~color~model~'#1'. } + { + LaTeX~has~been~asked~to~use~a~color~model~called~'#1',~ + but~this~model~is~not~set~up. + } +\__kernel_msg_new:nnnn { color } { unknown-color } + { Unknown~color~'#1'. } + { + LaTeX~has~been~asked~to~use~a~color~named~'#1',~ + but~this~has~never~been~defined. + } +% \end{macrocode} +% +% \begin{macrocode} +\__kernel_msg_new:nnn { color } { show } + { + The~color~#1~ + \tl_if_empty:nTF {#2} + { is~undefined. } + { has~the~properties: #2 } + } +% \end{macrocode} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins new file mode 100644 index 00000000000..de23faed546 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins @@ -0,0 +1,56 @@ +\iffalse meta-comment + +File l3color.ins 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 +license or (at your option) any later version. The latest version +of this license is in the file + + http://www.latex-project.org/lppl.txt + +This file is part of the "l3experimental 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. + +----------------------------------------------------------------------- + +Any modification of this file should ensure that the copyright and +license information is placed in the derived files. + +\fi + +\input l3docstrip.tex +\askforoverwritefalse + +\preamble + +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 license or (at your option) any later version. The latest +version of this license is in the file: + + http://www.latex-project.org/lppl.txt + +This file is part of the "l3experimental bundle" (The Work in LPPL) +and all files in that bundle must be distributed together. + +\endpreamble +% stop docstrip adding \endinput +\postamble +\endpostamble + +\keepsilent + +\generate{\file{l3color.sty}{\from{l3color.dtx}{package}}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx new file mode 100644 index 00000000000..2fa882e7f1a --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx @@ -0,0 +1,901 @@ +% \iffalse meta-comment +% +%% File: l3draw-paths.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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> +\RequirePackage{expl3} +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw-paths} package\\ Drawing paths^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{implementation} +% +% \section{\pkg{l3draw-paths} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% This sub-module covers more-or-less the same ideas as +% \texttt{pgfcorepathconstruct.code.tex}, though using the expandable FPU +% means that the implementation often varies. At present, equivalents of the +% following are currently absent: +% \begin{itemize} +% \item \cs{pgfpatharcto}, \cs{pgfpatharctoprecomputed}: These are +% extremely specialised and are very complex in implementation. If the +% functionality is required, it is likely that it will be set up from +% scratch here. +% \item \cs{pgfpathparabola}: Seems to be unused other than defining +% a Ti\emph{k}Z interface, which itself is then not used further. +% \item \cs{pgfpathsine}, \cs{pgfpathcosine}: Need to see exactly how +% these need to work, in particular whether a wider input range is +% needed and what approximation to make. +% \item \cs{pgfpathcurvebetweentime}, \cs{pgfpathcurvebetweentimecontinue}: +% These don't seem to be used at all. +% \end{itemize} +% +% \begin{variable} +% {\l_@@_path_tmp_tl, \l_@@_path_tmpa_fp, \l_@@_path_tmpb_fp} +% Scratch space. +% \begin{macrocode} +\tl_new:N \l_@@_path_tmp_tl +\fp_new:N \l_@@_path_tmpa_fp +\fp_new:N \l_@@_path_tmpb_fp +% \end{macrocode} +% \end{variable} +% +% \subsection{Tracking paths} +% +% \begin{variable}{\g_@@_path_lastx_dim, \g_@@_path_lasty_dim} +% The last point visited on a path. +% \begin{macrocode} +\dim_new:N \g_@@_path_lastx_dim +\dim_new:N \g_@@_path_lasty_dim +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% { +% \g_@@_path_xmax_dim, +% \g_@@_path_xmin_dim, +% \g_@@_path_ymax_dim, +% \g_@@_path_ymin_dim +% } +% The limiting size of a path. +% \begin{macrocode} +\dim_new:N \g_@@_path_xmax_dim +\dim_new:N \g_@@_path_xmin_dim +\dim_new:N \g_@@_path_ymax_dim +\dim_new:N \g_@@_path_ymin_dim +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_path_update_limits:nn} +% \begin{macro}{\@@_path_reset_limits:} +% Track the limits of a path and (perhaps) of the picture as a whole. +% (At present the latter is always true: that will change as more complex +% functionality is added.) +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_update_limits:nn #1#2 + { + \dim_gset:Nn \g_@@_path_xmax_dim + { \dim_max:nn \g_@@_path_xmax_dim {#1} } + \dim_gset:Nn \g_@@_path_xmin_dim + { \dim_min:nn \g_@@_path_xmin_dim {#1} } + \dim_gset:Nn \g_@@_path_ymax_dim + { \dim_max:nn \g_@@_path_ymax_dim {#2} } + \dim_gset:Nn \g_@@_path_ymin_dim + { \dim_min:nn \g_@@_path_ymin_dim {#2} } + \bool_if:NT \l_@@_update_bb_bool + { + \dim_gset:Nn \g_@@_xmax_dim + { \dim_max:nn \g_@@_xmax_dim {#1} } + \dim_gset:Nn \g_@@_xmin_dim + { \dim_min:nn \g_@@_xmin_dim {#1} } + \dim_gset:Nn \g_@@_ymax_dim + { \dim_max:nn \g_@@_ymax_dim {#2} } + \dim_gset:Nn \g_@@_ymin_dim + { \dim_min:nn \g_@@_ymin_dim {#2} } + } + } +\cs_new_protected:Npn \@@_path_reset_limits: + { + \dim_gset:Nn \g_@@_path_xmax_dim { -\c_max_dim } + \dim_gset:Nn \g_@@_path_xmin_dim { \c_max_dim } + \dim_gset:Nn \g_@@_path_ymax_dim { -\c_max_dim } + \dim_gset:Nn \g_@@_path_ymin_dim { \c_max_dim } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_path_update_last:nn} +% A simple auxiliary to avoid repetition. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_update_last:nn #1#2 + { + \dim_gset:Nn \g_@@_path_lastx_dim {#1} + \dim_gset:Nn \g_@@_path_lasty_dim {#2} + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Corner arcs} +% +% At the level of path \emph{construction}, rounded corners are handled +% by inserting a marker into the path: that is then picked up once the +% full path is constructed. Thus we need to set up the appropriate +% data structures here, such that this can be applied every time it is +% relevant. +% +% \begin{variable}{\l_@@_corner_xarc_dim, \l_@@_corner_yarc_dim} +% The two arcs in use. +% \begin{macrocode} +\dim_new:N \l_@@_corner_xarc_dim +\dim_new:N \l_@@_corner_yarc_dim +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_corner_arc_bool} +% A flag to speed up the repeated checks. +% \begin{macrocode} +\bool_new:N \l_@@_corner_arc_bool +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_path_corner_arc:n} +% \begin{macro}{\@@_path_corner_arc:nn} +% Calculate the arcs, check they are non-zero. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_corner_arc:n #1 + { + \@@_point_process:nn { \@@_path_corner_arc:nn } {#1} + } +\cs_new_protected:Npn \@@_path_corner_arc:nn #1#2 + { + \dim_set:Nn \l_@@_corner_xarc_dim {#1} + \dim_set:Nn \l_@@_corner_yarc_dim {#2} + \bool_lazy_and:nnTF + { \dim_compare_p:nNn \l_@@_corner_xarc_dim = { 0pt } } + { \dim_compare_p:nNn \l_@@_corner_yarc_dim = { 0pt } } + { \bool_set_false:N \l_@@_corner_arc_bool } + { \bool_set_true:N \l_@@_corner_arc_bool } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_path_mark_corner:} +% Mark up corners for arc post-processing. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_mark_corner: + { + \bool_if:NT \l_@@_corner_arc_bool + { + \@@_softpath_roundpoint:VV + \l_@@_corner_xarc_dim + \l_@@_corner_yarc_dim + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Basic path constructions} +% +% \begin{macro}{\draw_path_moveto:n, \draw_path_lineto:n} +% \begin{macro}{\@@_path_moveto:nn, \@@_path_lineto:nn} +% \begin{macro}{\draw_path_curveto:nnn} +% \begin{macro}{\@@_path_curveto:nnnnnn} +% At present, stick to purely linear transformation support and skip the +% soft path business: that will likely need to be revisited later. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_moveto:n #1 + { + \@@_point_process:nn + { \@@_path_moveto:nn } + { \draw_point_transform:n {#1} } + } +\cs_new_protected:Npn \@@_path_moveto:nn #1#2 + { + \@@_path_update_limits:nn {#1} {#2} + \@@_softpath_moveto:nn {#1} {#2} + \@@_path_update_last:nn {#1} {#2} + } +\cs_new_protected:Npn \draw_path_lineto:n #1 + { + \@@_point_process:nn + { \@@_path_lineto:nn } + { \draw_point_transform:n {#1} } + } +\cs_new_protected:Npn \@@_path_lineto:nn #1#2 + { + \@@_path_mark_corner: + \@@_path_update_limits:nn {#1} {#2} + \@@_softpath_lineto:nn {#1} {#2} + \@@_path_update_last:nn {#1} {#2} + } +\cs_new_protected:Npn \draw_path_curveto:nnn #1#2#3 + { + \@@_point_process:nnn + { + \@@_point_process:nn + { + \@@_path_mark_corner: + \@@_path_curveto:nnnnnn + } + { \draw_point_transform:n {#1} } + } + { \draw_point_transform:n {#2} } + { \draw_point_transform:n {#3} } + } +\cs_new_protected:Npn \@@_path_curveto:nnnnnn #1#2#3#4#5#6 + { + \@@_path_update_limits:nn {#1} {#2} + \@@_path_update_limits:nn {#3} {#4} + \@@_path_update_limits:nn {#5} {#6} + \@@_softpath_curveto:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \@@_path_update_last:nn {#5} {#6} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_path_close:} +% A simple wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_close: + { + \@@_path_mark_corner: + \@@_softpath_closepath: + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Computed curves} +% +% More complex operations need some calculations. To assist with those, various +% constants are pre-defined. +% +% \begin{macro}{\draw_path_curveto:nn} +% \begin{macro}{\@@_path_curveto:nnnn} +% \begin{variable}{\c_@@_path_curveto_a_fp, \c_@@_path_curveto_b_fp} +% A quadratic curve with one control point $(x_{\mathrm{c}}, +% y_{\mathrm{c}})$. The two required control points are then +% \[ +% x_{1} = \frac{1}{3}x_{\mathrm{s}} + \frac{2}{3}x_{\mathrm{c}} +% \quad +% y_{1} = \frac{1}{3}y_{\mathrm{s}} + \frac{2}{3}y_{\mathrm{c}} +% \] +% and +% \[ +% x_{2} = \frac{1}{3}x_{\mathrm{e}} + \frac{2}{3}x_{\mathrm{c}} +% \quad +% x_{2} = \frac{1}{3}y_{\mathrm{e}} + \frac{2}{3}y_{\mathrm{c}} +% \] +% using the start (last) point $(x_{\mathrm{s}}, y_{\mathrm{s}})$ +% and the end point $(x_{\mathrm{s}}, y_{\mathrm{s}})$. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_curveto:nn #1#2 + { + \@@_point_process:nnn + { \@@_path_curveto:nnnn } + { \draw_point_transform:n {#1} } + { \draw_point_transform:n {#2} } + } +\cs_new_protected:Npn \@@_path_curveto:nnnn #1#2#3#4 + { + \fp_set:Nn \l_@@_path_tmpa_fp { \c_@@_path_curveto_b_fp * #1 } + \fp_set:Nn \l_@@_path_tmpb_fp { \c_@@_path_curveto_b_fp * #2 } + \use:x + { + \@@_path_mark_corner: + \@@_path_curveto:nnnnnn + { + \fp_to_dim:n + { + \c_@@_path_curveto_a_fp * \g_@@_path_lastx_dim + + \l_@@_path_tmpa_fp + } + } + { + \fp_to_dim:n + { + \c_@@_path_curveto_a_fp * \g_@@_path_lasty_dim + + \l_@@_path_tmpb_fp + } + } + { + \fp_to_dim:n + { \c_@@_path_curveto_a_fp * #3 + \l_@@_path_tmpa_fp } + } + { + \fp_to_dim:n + { \c_@@_path_curveto_a_fp * #4 + \l_@@_path_tmpb_fp } + } + {#3} + {#4} + } + } +\fp_const:Nn \c_@@_path_curveto_a_fp { 1 / 3 } +\fp_const:Nn \c_@@_path_curveto_b_fp { 2 / 3 } +% \end{macrocode} +% \end{variable} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_path_arc:nnn} +% \begin{macro}{\draw_path_arc:nnnn} +% \begin{macro}{\@@_path_arc:nnnn} +% \begin{macro}{\@@_path_arc:nnNnn} +% \begin{macro} +% { +% \@@_path_arc_auxi:nnnnNnn, +% \@@_path_arc_auxi:fnnnNnn, +% \@@_path_arc_auxi:fnfnNnn +% } +% \begin{macro}{\@@_path_arc_auxii:nnnNnnnn} +% \begin{macro}{\@@_path_arc_auxiii:nn} +% \begin{macro}{\@@_path_arc_auxiv:nnnn} +% \begin{macro}{\@@_path_arc_auxv:nn, \@@_path_arc_auxvi:nn} +% \begin{macro}{\@@_path_arc_add:nnnn} +% \begin{variable}{\l_@@_path_arc_delta_fp, \l_@@_path_arc_start_fp} +% \begin{variable}{\c_@@_path_arc_90_fp,\c_@@_path_arc_60_fp} +% Drawing an arc means dividing the total curve required into sections: +% using Bézier curves we can cover at most $90^{\circ}$ at once. To allow +% for later manipulations, we aim to have roughly equal last segments to +% the line, with the split set at a final part of $115^{\circ}$. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_arc:nnn #1#2#3 + { \draw_path_arc:nnnn {#1} {#2} {#3} {#3} } +\cs_new_protected:Npn \draw_path_arc:nnnn #1#2#3#4 + { + \use:x + { + \@@_path_arc:nnnn + { \fp_eval:n {#1} } + { \fp_eval:n {#2} } + { \fp_to_dim:n {#3} } + { \fp_to_dim:n {#4} } + } + } +\cs_new_protected:Npn \@@_path_arc:nnnn #1#2#3#4 + { + \fp_compare:nNnTF {#1} > {#2} + { \@@_path_arc:nnNnn {#1} {#2} - {#3} {#4} } + { \@@_path_arc:nnNnn {#1} {#2} + {#3} {#4} } + } +\cs_new_protected:Npn \@@_path_arc:nnNnn #1#2#3#4#5 + { + \fp_set:Nn \l_@@_path_arc_start_fp {#1} + \fp_set:Nn \l_@@_path_arc_delta_fp { abs( #1 - #2 ) } + \fp_while_do:nNnn { \l_@@_path_arc_delta_fp } > { 90 } + { + \fp_compare:nNnTF \l_@@_path_arc_delta_fp > { 115 } + { + \@@_path_arc_auxi:ffnnNnn + { \fp_to_decimal:N \l_@@_path_arc_start_fp } + { \fp_eval:n { \l_@@_path_arc_start_fp #3 90 } } + { 90 } {#2} + #3 {#4} {#5} + } + { + \@@_path_arc_auxi:ffnnNnn + { \fp_to_decimal:N \l_@@_path_arc_start_fp } + { \fp_eval:n { \l_@@_path_arc_start_fp #3 60 } } + { 60 } {#2} + #3 {#4} {#5} + } + } + \@@_path_mark_corner: + \@@_path_arc_auxi:fnfnNnn + { \fp_to_decimal:N \l_@@_path_arc_start_fp } + {#2} + { \fp_eval:n { abs( \l_@@_path_arc_start_fp - #2 ) } } + {#2} + #3 {#4} {#5} + } +% \end{macrocode} +% The auxiliary is responsible for calculating the required points. +% The \enquote{magic} number required to determine the length of the +% control vectors is well-established for a right-angle: +% $\frac{4}{3}(\sqrt{2} - 1) = 0.552\,284\,75$. For other cases, we follow +% the calculation used by \pkg{pgf} but with the second common case of +% $60^{\circ}$ pre-calculated for speed. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_arc_auxi:nnnnNnn #1#2#3#4#5#6#7 + { + \use:x + { + \@@_path_arc_auxii:nnnNnnnn + {#1} {#2} {#4} #5 {#6} {#7} + { + \fp_to_dim:n + { + \cs_if_exist_use:cF + { c_@@_path_arc_ #3 _fp } + { 4/3 * tand( 0.25 * #3 ) } + * #6 + } + } + { + \fp_to_dim:n + { + \cs_if_exist_use:cF + { c_@@_path_arc_ #3 _fp } + { 4/3 * tand( 0.25 * #3 ) } + * #7 + } + } + } + } +\cs_generate_variant:Nn \@@_path_arc_auxi:nnnnNnn { fnf , ff } +% \end{macrocode} +% We can now calculate the required points. As everything here is +% non-expandable, that is best done by using \texttt{x}-type expansion +% to build up the tokens. The three points are calculated out-of-order, +% since finding the second control point needs the position of the end +% point. Once the points are found, fire-off the fundamental path +% operation and update the record of where we are up to. The final +% point has to be +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_arc_auxii:nnnNnnnn #1#2#3#4#5#6#7#8 + { + \tl_clear:N \l_@@_path_tmp_tl + \@@_point_process:nn + { \@@_path_arc_auxiii:nn } + { + \@@_point_transform_noshift:n + { \draw_point_polar:nnn { #1 #4 90 } {#7} {#8} } + } + \@@_point_process:nn + { + \@@_point_process:nn + { \@@_path_arc_auxiv:nnnn } + { + \draw_point_transform:n + { \draw_point_polar:nnn {#1} {#5} {#6} } + } + } + { + \draw_point_transform:n + { \draw_point_polar:nnn {#2} {#5} {#6} } + } + \@@_point_process:nn + { \@@_path_arc_auxv:nn } + { + \@@_point_transform_noshift:n + { \draw_point_polar:nnn { #2 #4 -90 } {#7} {#8} } + } + \exp_after:wN \@@_path_curveto:nnnnnn \l_@@_path_tmp_tl + \fp_set:Nn \l_@@_path_arc_delta_fp { abs ( #2 - #3 ) } + \fp_set:Nn \l_@@_path_arc_start_fp {#2} + } +% \end{macrocode} +% The first control point. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_arc_auxiii:nn #1#2 + { + \@@_path_arc_aux_add:nn + { \g_@@_path_lastx_dim + #1 } + { \g_@@_path_lasty_dim + #2 } + } +% \end{macrocode} +% The end point: simple arithmetic. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_arc_auxiv:nnnn #1#2#3#4 + { + \@@_path_arc_aux_add:nn + { \g_@@_path_lastx_dim - #1 + #3 } + { \g_@@_path_lasty_dim - #2 + #4 } + } +% \end{macrocode} +% The second control point: extract the last point, do some +% rearrangement and record. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_arc_auxv:nn #1#2 + { + \exp_after:wN \@@_path_arc_auxvi:nn + \l_@@_path_tmp_tl {#1} {#2} + } +\cs_new_protected:Npn \@@_path_arc_auxvi:nn #1#2#3#4#5#6 + { + \tl_set:Nn \l_@@_path_tmp_tl { {#1} {#2} } + \@@_path_arc_aux_add:nn + { #5 + #3 } + { #6 + #4 } + \tl_put_right:Nn \l_@@_path_tmp_tl { {#3} {#4} } + } +\cs_new_protected:Npn \@@_path_arc_aux_add:nn #1#2 + { + \tl_put_right:Nx \l_@@_path_tmp_tl + { { \fp_to_dim:n {#1} } { \fp_to_dim:n {#2} } } + } +\fp_new:N \l_@@_path_arc_delta_fp +\fp_new:N \l_@@_path_arc_start_fp +\fp_const:cn { c_@@_path_arc_90_fp } { 4/3 * (sqrt(2) - 1) } +\fp_const:cn { c_@@_path_arc_60_fp } { 4/3 * tand(15) } +% \end{macrocode} +% \end{variable} +% \end{variable} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_path_arc_axes:nnnn} +% A simple wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_arc_axes:nnnn #1#2#3#4 + { + \draw_transform_triangle:nnn { 0cm , 0cm } {#3} {#4} + \draw_path_arc:nnn {#1} {#2} { 1pt } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\draw_path_ellipse:nnn} +% \begin{macro}{\@@_path_ellipse:nnnnnn} +% \begin{macro}[EXP] +% { +% \@@_path_ellipse_arci:nnnnnn , +% \@@_path_ellipse_arcii:nnnnnn , +% \@@_path_ellipse_arciii:nnnnnn , +% \@@_path_ellipse_arciv:nnnnnn +% } +% \begin{variable}{\c_@@_path_ellipse_fp} +% Drawing an ellipse is an optimised version of drawing an arc, in particular +% reusing the same constant. We need to deal with the ellipse in four parts +% and also deal with moving to the right place, closing it and ending up +% back at the center. That is handled on a per-arc basis, each in a +% separate auxiliary for readability. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_ellipse:nnn #1#2#3 + { + \@@_point_process:nnn + { + \@@_point_process:nn + { \@@_path_ellipse:nnnnnn } + { \draw_point_transform:n {#1} } + } + { \@@_point_transform_noshift:n {#2} } + { \@@_point_transform_noshift:n {#3} } + } +\cs_new_protected:Npn \@@_path_ellipse:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \@@_path_moveto:nn + { \fp_to_dim:n { #1 + #3 } } { \fp_to_dim:n { #2 + #4 } } + \@@_path_ellipse_arci:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \@@_path_ellipse_arcii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \@@_path_ellipse_arciii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \@@_path_ellipse_arciv:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + } + \@@_softpath_closepath: + \@@_path_moveto:nn {#1} {#2} + } +\cs_new:Npn \@@_path_ellipse_arci:nnnnnn #1#2#3#4#5#6 + { + \@@_path_curveto:nnnnnn + { \fp_to_dim:n { #1 + #3 + #5 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #2 + #4 + #6 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #1 + #3 * \c_@@_path_ellipse_fp + #5 } } + { \fp_to_dim:n { #2 + #4 * \c_@@_path_ellipse_fp + #6 } } + { \fp_to_dim:n { #1 + #5 } } + { \fp_to_dim:n { #2 + #6 } } + } +\cs_new:Npn \@@_path_ellipse_arcii:nnnnnn #1#2#3#4#5#6 + { + \@@_path_curveto:nnnnnn + { \fp_to_dim:n { #1 - #3 * \c_@@_path_ellipse_fp + #5 } } + { \fp_to_dim:n { #2 - #4 * \c_@@_path_ellipse_fp + #6 } } + { \fp_to_dim:n { #1 - #3 + #5 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #2 - #4 + #6 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #1 - #3 } } + { \fp_to_dim:n { #2 - #4 } } + } +\cs_new:Npn \@@_path_ellipse_arciii:nnnnnn #1#2#3#4#5#6 + { + \@@_path_curveto:nnnnnn + { \fp_to_dim:n { #1 - #3 - #5 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #2 - #4 - #6 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #1 - #3 * \c_@@_path_ellipse_fp - #5 } } + { \fp_to_dim:n { #2 - #4 * \c_@@_path_ellipse_fp - #6 } } + { \fp_to_dim:n { #1 - #5 } } + { \fp_to_dim:n { #2 - #6 } } + } +\cs_new:Npn \@@_path_ellipse_arciv:nnnnnn #1#2#3#4#5#6 + { + \@@_path_curveto:nnnnnn + { \fp_to_dim:n { #1 + #3 * \c_@@_path_ellipse_fp - #5 } } + { \fp_to_dim:n { #2 + #4 * \c_@@_path_ellipse_fp - #6 } } + { \fp_to_dim:n { #1 + #3 - #5 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #2 + #4 - #6 * \c_@@_path_ellipse_fp } } + { \fp_to_dim:n { #1 + #3 } } + { \fp_to_dim:n { #2 + #4 } } + } +\fp_const:Nn \c_@@_path_ellipse_fp { \fp_use:c { c_@@_path_arc_90_fp } } +% \end{macrocode} +% \end{variable} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_path_circle:nn} +% A shortcut. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_circle:nn #1#2 + { \draw_path_ellipse:nnn {#1} { #2 , 0pt } { 0pt , #2 } } +% \end{macrocode} +% \end{macro} +% +% \subsection{Rectangles} +% +% \begin{macro}{\draw_path_rectangle:nn} +% \begin{macro}{\@@_path_rectangle:nnnn, \@@_path_rectangle_rounded:nnnn} +% Building a rectangle can be a single operation, or for rounded versions will +% involve step-by-step construction. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_rectangle:nn #1#2 + { + \@@_point_process:nnn + { + \bool_if:NTF \l_@@_corner_arc_bool + { \@@_path_rectangle_rounded:nnnn } + { \@@_path_rectangle:nnnn } + } + { \draw_point_transform:n {#1} } + {#2} + } +\cs_new_protected:Npn \@@_path_rectangle:nnnn #1#2#3#4 + { + \@@_path_update_limits:nn {#1} {#2} + \@@_path_update_limits:nn { #1 + #3 } { #2 + #4 } + \@@_softpath_rectangle:nnnn {#1} {#2} {#3} {#4} + \@@_path_update_last:nn {#1} {#2} + } +\cs_new_protected:Npn \@@_path_rectangle_rounded:nnnn #1#2#3#4 + { + \draw_path_moveto:n { #1 + #3 , #2 + #4 } + \draw_path_lineto:n { #1 , #2 + #4 } + \draw_path_lineto:n { #1 , #2 } + \draw_path_lineto:n { #1 + #3 , #2 } + \draw_path_close: + \draw_path_moveto:n { #1 , #2 } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_path_rectangle_corners:nn} +% \begin{macro}{\@@_path_rectangle_corners:nnnn} +% Another shortcut wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_rectangle_corners:nn #1#2 + { + \@@_point_process:nnn + { \@@_path_rectangle_corners:nnnnn {#1} } + {#1} {#2} + } +\cs_new_protected:Npn \@@_path_rectangle_corners:nnnnn #1#2#3#4#5 + { \draw_path_rectangle:nn {#1} { #4 - #2 , #5 - #3 } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Grids} +% +% \begin{macro}{\draw_path_grid:nnnn} +% \begin{macro}{\@@_path_grid:nnnnnn} +% A simple set of loops. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_grid:nnnn #1#2#3#4 + { + \@@_point_process:nnn + { \@@_path_grid:nnnnnn {#1} {#2} } + {#3} {#4} + } +\cs_new_protected:Npn \@@_path_grid:nnnnnn #1#2#3#4#5#6 + { + \dim_step_inline:nnnn + {#3} { \dim_compare:nNnF {#3} < {#5} { - } \dim_abs:n {#1} } {#5} + { + \draw_path_moveto:n { ##1 , #4 } + \draw_path_lineto:n { ##1 , #6 } + } + \dim_step_inline:nnnn + {#4} { \dim_compare:nNnF {#4} < {#6} { - } \dim_abs:n {#2} } {#6} + { + \draw_path_moveto:n { #3 , ##1 } + \draw_path_lineto:n { #5 , ##1 } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Using paths} +% +% \begin{variable} +% { +% \l_@@_path_use_clip_bool , +% \l_@@_path_use_fill_bool , +% \l_@@_path_use_stroke_bool +% } +% Actions to pass to the driver. +% \begin{macrocode} +\bool_new:N \l_@@_path_use_clip_bool +\bool_new:N \l_@@_path_use_fill_bool +\bool_new:N \l_@@_path_use_stroke_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_path_use_bb_bool, \l_@@_path_use_clear_bool} +% Actions handled at the macro layer. +% \begin{macrocode} +\bool_new:N \l_@@_path_use_bb_bool +\bool_new:N \l_@@_path_use_clear_bool +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_path_use:n, \draw_path_use_clear:n} +% \begin{macro}{\@@_path_use:n} +% \begin{macro}{\@@_path_use_action_draw:} +% \begin{macro}{\@@_path_use_stroke_bb:} +% \begin{macro}{\@@_path_use_stroke_bb_aux:NnN} +% There are a range of actions which can apply to a path: they are handled +% in a single function which can carry out several of them. The first step +% is to deal with the special case of clearing the path. +% \begin{macrocode} +\cs_new_protected:Npn \draw_path_use:n #1 + { + \tl_if_blank:nF {#1} + { \@@_path_use:n {#1} } + } +\cs_new_protected:Npn \draw_path_use_clear:n #1 + { + \bool_lazy_or:nnTF + { \tl_if_blank_p:n {#1} } + { \str_if_eq_p:nn {#1} { clear } } + { + \@@_softpath_clear: + \@@_path_reset_limits: + } + { \@@_path_use:n { #1 , clear } } + } +% \end{macrocode} +% Map over the actions and set up the data: mainly just booleans, +% but with the possibility to cover more complex cases. The business end +% of the function is a series of checks on the various flags, then +% taking the appropriate action(s). +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_use:n #1 + { + \bool_set_false:N \l_@@_path_use_clip_bool + \bool_set_false:N \l_@@_path_use_fill_bool + \bool_set_false:N \l_@@_path_use_stroke_bool + \clist_map_inline:nn {#1} + { + \cs_if_exist:cTF { l_@@_path_use_ ##1 _ bool } + { \bool_set_true:c { l_@@_path_use_ ##1 _ bool } } + { + \cs_if_exist_use:cF { @@_path_use_action_ ##1 : } + { \ERROR } + } + } + \bool_lazy_and:nnT + { \l_@@_update_bb_bool } + { \l_@@_path_use_stroke_bool } + { \@@_path_use_stroke_bb: } + \bool_if:NTF \l_@@_path_use_clear_bool + { \@@_softpath_use_clear: } + { \@@_softpath_use: } + \bool_if:NT \l_@@_path_use_clip_bool + { \driver_draw_clip: } + \bool_lazy_or:nnT + { \l_@@_path_use_fill_bool } + { \l_@@_path_use_stroke_bool } + { + \use:c + { + driver_draw_ + \bool_if:NT \l_@@_path_use_fill_bool { fill } + \bool_if:NT \l_@@_path_use_stroke_bool { stroke } + : + } + } + } +\cs_new_protected:Npn \@@_path_use_action_draw: + { + \bool_set_true:N \l_@@_path_use_stroke_bool + } +% \end{macrocode} +% Where the path is relevant to size and is stroked, we need to allow for +% the part which overlaps the edge of the bounding box. +% \begin{macrocode} +\cs_new_protected:Npn \@@_path_use_stroke_bb: + { + \@@_path_use_stroke_bb_aux:NnN x { max } + + \@@_path_use_stroke_bb_aux:NnN y { max } + + \@@_path_use_stroke_bb_aux:NnN x { min } - + \@@_path_use_stroke_bb_aux:NnN y { min } - + } +\cs_new_protected:Npn \@@_path_use_stroke_bb_aux:NnN #1#2#3 + { + \dim_compare:nNnF { \dim_use:c { g_@@_ #1#2 _dim } } = { #3 -\c_max_dim } + { + \dim_gset:cn { g_@@_ #1#2 _dim } + { + \use:c { dim_ #2 :nn } + { \dim_use:c { g_@@_ #1#2 _dim } } + { + \dim_use:c { g_@@_path_ #1#2 _dim } + #3 0.5 \g_@@_linewidth_dim + } + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx new file mode 100644 index 00000000000..01497992889 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx @@ -0,0 +1,960 @@ +% \iffalse meta-comment +% +%% File: l3draw-points.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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> +\RequirePackage{expl3} +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw-points} package\\ Calculating points^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{implementation} +% +% \section{\pkg{l3draw-points} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% This sub-module covers more-or-less the same ideas as +% \texttt{pgfcorepoints.code.tex}, though the approach taken to returning +% values is different: point expressions here are processed by expansion +% and return a co-ordinate pair in the form |{|\meta{x}|}{|\meta{y}|}|. +% Equivalents of following \pkg{pgf} functions are deliberately omitted: +% \begin{itemize} +% \item \cs{pgfpointorigin}: Can be given explicitly as |{0pt}{0pt}|. +% \item \cs{pgfextractx}, \cs{pgfextracty}: Available by applying +% \cs{use_i:nn}/\cs{use_ii:nn} or similar to the \texttt{x}-type +% expansion of a point expression. +% \item \cs{pgfgetlastxy}: Unused in the entire \pkg{pgf} core, may be +% emulated by \texttt{x}-type expansion of a point expression, then using +% the result. +% \end{itemize} +% In addition, equivalents of the following \emph{may} be added in future but +% are currently absent: +% \begin{itemize} +% \item \cs{pgfpointcylindrical}, \cs{pgfpointspherical}: The usefulness +% of these commands is not currently clear. +% \item \cs{pgfpointborderrectangle}, \cs{pgfpointborderellipse}: To be +% revisited once the semantics and use cases are clear. +% \item \cs{pgfqpoint}, \cs{pgfqpointscale}, \cs{pgfqpointpolar}, +% \cs{pgfqpointxy}, \cs{pgfqpointxyz}: The expandable approach taken in +% the code here, along with the absolute requirement for \eTeX{}, means +% it is likely many use cases for these commands may be covered in other +% ways. This may be revisited as higher-level structures are constructed. +% \end{itemize} +% +% \subsection{Support functions} +% +% \begin{macro}[EXP]{\@@_point_process:nn} +% \begin{macro}[EXP]{\@@_point_process_auxi:nn, \@@_point_process_auxi:fn} +% \begin{macro}[EXP]{\@@_point_process_auxii:nw} +% \begin{macro}[EXP]{\@@_point_process:nnn} +% \begin{macro}[EXP]{\@@_point_process_auxiii:nnn, \@@_point_process_auxiii:ffn} +% \begin{macro}[EXP]{\@@_point_process_auxiv:nw} +% Execute whatever code is passed to extract the $x$ and $y$ co-ordinates. +% The first argument here should itself absorb two arguments. There is +% also a version to deal with two co-ordinates: common enough to justify a +% separate function. +% \begin{macrocode} +\cs_new:Npn \@@_point_process:nn #1#2 + { + \@@_point_process_auxi:fn + { \@@_point_to_dim:n {#2} } + {#1} + } +\cs_new:Npn \@@_point_process_auxi:nn #1#2 + { \@@_point_process_auxii:nw {#2} #1 \q_stop } +\cs_generate_variant:Nn \@@_point_process_auxi:nn { f } +\cs_new:Npn \@@_point_process_auxii:nw #1 #2 , #3 \q_stop + { #1 {#2} {#3} } +\cs_new:Npn \@@_point_process:nnn #1#2#3 + { + \@@_point_process_auxiii:ffn + { \@@_point_to_dim:n {#2} } + { \@@_point_to_dim:n {#3} } + {#1} + } +\cs_new:Npn \@@_point_process_auxiii:nnn #1#2#3 + { \@@_point_process_auxiv:nw {#3} #1 \q_mark #2 \q_stop } +\cs_generate_variant:Nn \@@_point_process_auxiii:nnn { ff } +\cs_new:Npn \@@_point_process_auxiv:nw #1 #2 , #3 \q_mark #4 , #5 \q_stop + { #1 {#2} {#3} {#4} {#5} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_point_to_dim:n} +% \begin{macro}[EXP]{\@@_point_to_dim_aux:n, \@@_point_to_dim_aux:f} +% \begin{macro}[EXP]{\@@_point_to_dim_aux:w} +% Co-ordinates are always returned as two dimensions. +% \begin{macrocode} +\cs_new:Npn \@@_point_to_dim:n #1 + { \@@_point_to_dim_aux:f { \fp_eval:n {#1} } } +\cs_new:Npn \@@_point_to_dim_aux:n #1 + { \@@_point_to_dim_aux:w #1 } +\cs_generate_variant:Nn \@@_point_to_dim_aux:n { f } +\cs_new:Npn \@@_point_to_dim_aux:w ( #1 , ~ #2 ) { #1pt , #2pt } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Co-ordinates} +% +% The most basic way of giving points is as simple $(x,y)$ co-ordinates. +% +% \begin{macro}[EXP]{\draw_point:nn} +% Simply turn the given values into dimensions. +% \begin{macrocode} +\cs_new:Npn \draw_point:nn #1#2 + { \@@_point_to_dim:n { #1 , #2 } } +% \end{macrocode} +% \end{macro} +% +% \subsection{Polar co-ordinates} +% +% \begin{macro}[EXP]{\draw_point_polar:nn} +% \begin{macro}[EXP]{\draw_point_polar:nnn} +% \begin{macro}[EXP]{\@@_draw_polar:nnn, \@@_draw_polar:fnn} +% Polar co-ordinates may have either one or two lengths, so there is a need +% to do a simple split before the calculation. As the angle gets used twice, +% save on any expression evaluation there and force expansion. +% \begin{macrocode} +\cs_new:Npn \draw_point_polar:nn #1#2 + { \draw_point_polar:nnn {#1} {#2} {#2} } +\cs_new:Npn \draw_point_polar:nnn #1#2#3 + { \@@_draw_polar:fnn { \fp_eval:n {#1} } {#2} {#3} } +\cs_new:Npn \@@_draw_polar:nnn #1#2#3 + { \@@_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } } +\cs_generate_variant:Nn \@@_draw_polar:nnn { f } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Point expression arithmetic} +% +% These functions all take point expressions as arguments. +% +% \begin{macro}[EXP] +% {\draw_point_add:nn, \draw_point_diff:nn, \draw_point_scale:nn} +% Simple mathematics. +% \begin{macrocode} +\cs_new:Npn \draw_point_add:nn #1#2 + { \@@_point_to_dim:n { (#1) + (#2) } } +\cs_new:Npn \draw_point_diff:nn #1#2 + { \@@_point_to_dim:n { (#2) - (#1) } } +\cs_new:Npn \draw_point_scale:nn #1#2 + { \@@_point_to_dim:n { #1 * (#2) } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\draw_point_unit_vector:n} +% \begin{macro}[EXP]{\@@_point_unit_vector:nn} +% Only a single point expression so the expansion is done here. The +% outcome is the normalised vector from $(0,0)$ in the direction of +% the point, \emph{i.e.} +% \[ +% P_{x} = \frac{x}{\sqrt{x^{2} + y^{2}}} \quad +% P_{y} = \frac{y}{\sqrt{x^{2} + y^{2}}} +% \] +% \begin{macrocode} +\cs_new:Npn \draw_point_unit_vector:n #1 + { \@@_point_process:nn { \@@_point_unit_vector:nn } {#1} } +\cs_new:Npn \@@_point_unit_vector:nn #1#2 + { + \@@_point_to_dim:n + { ( #1 , #2 ) / (sqrt(#1 * #1 + #2 * #2)) } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Intersection calculations} +% +% \begin{macro}[EXP]{\draw_point_intersect_lines:nnnn} +% \begin{macro}[EXP]{\@@_point_intersect_lines:nnnnnn} +% \begin{macro}[EXP]{\@@_point_intersect_lines:nnnnnnnn} +% \begin{macro}[EXP] +% {\@@_point_intersect_lines_aux:nnnnnn, \@@_point_intersect_lines_aux:ffffff} +% The intersection point~$P$ between a line joining points $(x_{1}, y_{1})$ +% and $(x_{2}, y_{2})$ with a second line joining points $(x_{3}, y_{3})$ +% and $(x_{4}, y_{4})$ can be calculated using the formulae +% \[ +% P_{x} = +% \frac{(x_{1}y_{2} - y_{1}x_{2})(x_{3} - x_{4}) +% - (x_{3}y_{4} - y_{3}x_{4})(x_{1} - x_{2})} +% {(x_{1} - x_{2})(y_{3} - y_{4}) - (y_{1} - y_{2})(x_{3} - x_{4})} +% \] +% and +% \[ +% P_{y} = +% \frac{(x_{1}y_{2} - y_{1}x_{2})(y_{3} - y_{5}) +% - (x_{3}y_{4} - y_{3}x_{4})(y_{1} - y_{2})} +% {(x_{1} - x_{2})(y_{3} - y_{4}) - (y_{1} - y_{2})(x_{3} - x_{4})} +% \] +% The work therefore comes down to expanding the incoming data, then +% pre-calculating as many parts as possible before the final work to find +% the intersection. (Expansion and argument re-ordering is much less work +% than additional floating point calculations.) +% \begin{macrocode} +\cs_new:Npn \draw_point_intersect_lines:nnnn #1#2#3#4 + { + \@@_point_process:nnn + { + \@@_point_process:nnn + { \@@_point_intersect_lines:nnnnnnnn } {#3} {#4} + } + {#1} {#2} + } +% \end{macrocode} +% At this stage we have all of the information we need, fully expanded: +% \begin{enumerate}[label = \#\arabic*, font = \ttfamily] +% \item $x_{3}$ +% \item $y_{3}$ +% \item $x_{4}$ +% \item $y_{4}$ +% \item $x_{1}$ +% \item $y_{1}$ +% \item $x_{2}$ +% \item $y_{2}$ +% \end{enumerate} +% so now just have to do all of the calculation. +% \begin{macrocode} +\cs_new:Npn \@@_point_intersect_lines:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \@@_point_intersect_lines_aux:ffffff + { \fp_eval:n { #1 * #4 - #2 * #3 } } + { \fp_eval:n { #5 * #8 - #6 * #7 } } + { \fp_eval:n { #1 - #3 } } + { \fp_eval:n { #5 - #7 } } + { \fp_eval:n { #2 - #4 } } + { \fp_eval:n { #6 - #8 } } + } +\cs_new:Npn \@@_point_intersect_lines_aux:nnnnnn #1#2#3#4#5#6 + { + \@@_point_to_dim:n + { + ( #2 * #3 - #1 * #4 , #2 * #5 - #1 * #6 ) + / ( #4 * #5 - #6 * #3 ) + } + } +\cs_generate_variant:Nn \@@_point_intersect_lines_aux:nnnnnn { ffffff } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\draw_point_intersect_circles:nnnnn} +% \begin{macro}[EXP]{\@@_point_intersect_circles_auxi:nnnnnnn} +% \begin{macro}[EXP] +% { +% \@@_point_intersect_circles_auxii:nnnnnnn, +% \@@_point_intersect_circles_auxii:ffnnnnn, +% \@@_point_intersect_circles_auxiii:nnnnnnn, +% \@@_point_intersect_circles_auxiii:ffnnnnn +% } +% \begin{macro}[EXP] +% { +% \@@_point_intersect_circles_auxiv:nnnnnnnn, +% \@@_point_intersect_circles_auxiv:fnnnnnnn +% } +% \begin{macro}[EXP] +% { +% \@@_point_intersect_circles_auxv:nnnnnnnnn, +% \@@_point_intersect_circles_auxv:ffnnnnnnn +% } +% \begin{macro}[EXP] +% { +% \@@_point_intersect_circles_auxvi:nnnnnnnn, +% \@@_point_intersect_circles_auxvi:fnnnnnnn +% } +% \begin{macro}[EXP] +% { +% \@@_point_intersect_circles_auxvii:nnnnnnn, +% \@@_point_intersect_circles_auxvii:fffnnnn +% } +% Another long expansion chain to get the values in the right places. +% We have two circles, the first with center $(a, b)$ and radius~$r$, +% the second with center $(c, d)$ and radius~$s$. We use the intermediate +% values +% \begin{align*} +% e &= c - a \\ +% f &= d - b \\ +% p &= \sqrt{e^{2} + f^{2}} \\ +% k &= \frac{p^{2} + r^{2} - s^{2}}{2p} +% \end{align*} +% in either +% \begin{align*} +% P_{x} &= a + \frac{ek}{p} + \frac{f}{p}\sqrt{r^{2} - k^{2}} \\ +% P_{y} &= b + \frac{fk}{p} - \frac{e}{p}\sqrt{r^{2} - k^{2}} +% \end{align*} +% or +% \begin{align*} +% P_{x} &= a + \frac{ek}{p} - \frac{f}{p}\sqrt{r^{2} - k^{2}} \\ +% P_{y} &= b + \frac{fk}{p} + \frac{e}{p}\sqrt{r^{2} - k^{2}} +% \end{align*} +% depending on which solution is required. The rest of the work is simply +% forcing the appropriate expansion and shuffling arguments. +% \begin{macrocode} +\cs_new:Npn \draw_point_intersect_circles:nnnnn #1#2#3#4#5 + { + \@@_point_process:nnn + { \@@_point_intersect_circles_auxi:nnnnnnn {#2} {#4} {#5} } + {#1} {#3} + } +\cs_new:Npn \@@_point_intersect_circles_auxi:nnnnnnn #1#2#3#4#5#6#7 + { + \@@_point_intersect_circles_auxii:ffnnnnn + { \fp_eval:n {#1} } { \fp_eval:n {#2} } {#4} {#5} {#6} {#7} {#3} + } +% \end{macrocode} +% At this stage we have all of the information we need, fully expanded: +% \begin{enumerate}[label = \#\arabic*, font = \ttfamily] +% \item $r$ +% \item $s$ +% \item $a$ +% \item $b$ +% \item $c$ +% \item $d$ +% \item $n$ +% \end{enumerate} +% Once we evaluate $e$ and $f$, the co-ordinate $(c,d)$ is no longer +% required: handy as we will need various intermediate values in the +% following. +% \begin{macrocode} +\cs_new:Npn \@@_point_intersect_circles_auxii:nnnnnnn #1#2#3#4#5#6#7 + { + \@@_point_intersect_circles_auxiii:ffnnnnn + { \fp_eval:n { #5 - #3 } } + { \fp_eval:n { #6 - #4 } } + {#1} {#2} {#3} {#4} {#7} + } +\cs_generate_variant:Nn \@@_point_intersect_circles_auxii:nnnnnnn { ff } +\cs_new:Npn \@@_point_intersect_circles_auxiii:nnnnnnn #1#2#3#4#5#6#7 + { + \@@_point_intersect_circles_auxiv:fnnnnnnn + { \fp_eval:n { sqrt( #1 * #1 + #2 * #2 ) } } + {#1} {#2} {#3} {#4} {#5} {#6} {#7} + } +\cs_generate_variant:Nn \@@_point_intersect_circles_auxiii:nnnnnnn { ff } +% \end{macrocode} +% We now have $p$: we pre-calculate $1/p$ as it is needed a few times and +% is relatively expensive. We also need $r^{2}$ twice so deal with that +% here too. +% \begin{macrocode} +\cs_new:Npn \@@_point_intersect_circles_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \@@_point_intersect_circles_auxv:ffnnnnnnn + { \fp_eval:n { 1 / #1 } } + { \fp_eval:n { #4 * #4 } } + {#1} {#2} {#3} {#5} {#6} {#7} {#8} + } +\cs_generate_variant:Nn \@@_point_intersect_circles_auxiv:nnnnnnnn { f } +\cs_new:Npn \@@_point_intersect_circles_auxv:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \@@_point_intersect_circles_auxvi:fnnnnnnn + { \fp_eval:n { 0.5 * #1 * ( #2 + #3 * #3 - #6 * #6 ) } } + {#1} {#2} {#4} {#5} {#7} {#8} {#9} + } +\cs_generate_variant:Nn \@@_point_intersect_circles_auxv:nnnnnnnnn { ff } +% \end{macrocode} +% We now have all of the intermediate values we require, with one division +% carried out up-front to avoid doing this expensive step twice: +% \begin{enumerate}[label = \#\arabic*, font = \ttfamily] +% \item $k$ +% \item $1/p$ +% \item $r^{2}$ +% \item $e$ +% \item $f$ +% \item $a$ +% \item $b$ +% \item $n$ +% \end{enumerate} +% There are some final pre-calculations, $k/p$, +% $\frac{\sqrt{r^{2} - k^{2}}}{p}$ and the usage of $n$, then we +% can yield a result. +% \begin{macrocode} +\cs_new:Npn \@@_point_intersect_circles_auxvi:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \@@_point_intersect_circles_auxvii:fffnnnn + { \fp_eval:n { #1 * #2 } } + { \int_if_odd:nTF {#8} { 1 } { -1 } } + { \fp_eval:n { sqrt ( #3 - #1 * #1 ) * #2 } } + {#4} {#5} {#6} {#7} + } +\cs_generate_variant:Nn \@@_point_intersect_circles_auxvi:nnnnnnnn { f } +\cs_new:Npn \@@_point_intersect_circles_auxvii:nnnnnnn #1#2#3#4#5#6#7 + { + \@@_point_to_dim:n + { #6 + #4 * #1 + #2 * #3 * #5 , #7 + #5 * #1 + -1 * #2 * #3 * #4 } + } +\cs_generate_variant:Nn \@@_point_intersect_circles_auxvii:nnnnnnn { fff } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Interpolation on a line (vector) or arc} +% +% \begin{macro}[EXP]{\draw_point_interpolate_line:nnn} +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_line_aux:nnnnn, +% \@@_point_interpolate_line_aux:fnnnn, +% } +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_line_aux:nnnnnn, +% \@@_point_interpolate_line_aux:fnnnnn, +% } +% Simple maths after expansion. +% \begin{macrocode} +\cs_new:Npn \draw_point_interpolate_line:nnn #1#2#3 + { + \@@_point_process:nnn + { \@@_point_interpolate_line_aux:fnnnn { \fp_eval:n {#1} } } + {#2} {#3} + } +\cs_new:Npn \@@_point_interpolate_line_aux:nnnnn #1#2#3#4#5 + { + \@@_point_interpolate_line_aux:fnnnnn { \fp_eval:n { 1 - #1 } } + {#1} {#2} {#3} {#4} {#5} + } +\cs_generate_variant:Nn \@@_point_interpolate_line_aux:nnnnn { f } +\cs_new:Npn \@@_point_interpolate_line_aux:nnnnnn #1#2#3#4#5#6 + { \@@_point_to_dim:n { #2 * #3 + #1 * #5 , #2 * #4 + #1 * #6 } } +\cs_generate_variant:Nn \@@_point_interpolate_line_aux:nnnnnn { f } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\draw_point_interpolate_distance:nnn} +% \begin{macro}[EXP]{\@@_point_interpolate_distance:nnnnn} +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_distance_aux:nnnnnnn, +% \@@_point_interpolate_distance_aux:nnnnnnn, +% } +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_distance_aux:nnnnnn, +% \@@_point_interpolate_distance_aux:fnnnnn, +% } +% Same idea but using the normalised length to obtain the scale factor. +% \begin{macrocode} +\cs_new:Npn \draw_point_interpolate_distance:nnn #1#2#3 + { + \@@_point_process:nnn + { \@@_point_interpolate_distance:nnnnn {#1} } + {#2} {#3} + } +\cs_new:Npn \@@_point_interpolate_distance:nnnnn #1#2#3#4#5 + { + \@@_point_interpolate_distance_aux:nnnnnnn + { \fp_eval:n { #4 - #2 } } + { \fp_eval:n { #5 - #3 } } + {#2} {#3} {#4} {#5} {#1} + } +\cs_new:Npn \@@_point_interpolate_distance_aux:nnnnnnn #1#2#3#4#5#6#7 + { + \@@_point_interpolate_distance_aux:fnnnn + { \fp_eval:n { (#7) / (sqrt ( #1 * #1 + #2 * #2 )) } } + {#3} {#4} {#5} {#6} + } +\cs_generate_variant:Nn \@@_point_interpolate_distance_aux:nnnnnnn { ff } +\cs_new:Npn \@@_point_interpolate_distance_aux:nnnnn #1#2#3#4#5 + { \@@_point_to_dim:n { #2 + #1 * #4 , #3 + #1 * #5 } } +\cs_generate_variant:Nn \@@_point_interpolate_distance_aux:nnnnn { f } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\draw_point_interpolate_arcaxes:nnnnnn} +% \begin{macro}[EXP]{\@@_point_interpolate_arcaxes_auxi:nnnnnnnnn} +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_arcaxes_auxii:nnnnnnnnn, +% \@@_point_interpolate_arcaxes_auxii:fnnnnnnnn +% } +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_arcaxes_auxiii:nnnnnnn, +% \@@_point_interpolate_arcaxes_auxiii:fnnnnnn +% } +% \begin{macro}[EXP] +% { +% \@@_point_interpolate_arcaxes_auxiv:nnnnnnnn, +% \@@_point_interpolate_arcaxes_auxiv:ffnnnnnn +% } +% Finding a point on an ellipse arc is relatively easy: find the correct +% angle between the two given, use the sine and cosine of that angle, +% apply to the axes. We just have to work a bit with the co-ordinate +% expansion. +% \begin{macrocode} +\cs_new:Npn \draw_point_interpolate_arcaxes:nnnnnn #1#2#3#4#5#6 + { + \@@_point_process:nnn + { + \@@_point_process:nn + { \@@_point_interpolate_arcaxes_auxi:nnnnnnnnn {#1} {#5} {#6} } + {#4} + } + {#2} {#3} + } +\cs_new:Npn \@@_point_interpolate_arcaxes_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \@@_point_interpolate_arcaxes_auxii:fnnnnnnnn + { \fp_eval:n {#1} } {#2} {#3} {#6} {#7} {#8} {#9} {#4} {#5} + } +% \end{macrocode} +% At this stage, the three co-ordinate pairs are fully expanded but somewhat +% re-ordered: +% \begin{enumerate}[label = \#\arabic*, font = \ttfamily] +% \item $p$ +% \item $\theta_{1}$ +% \item $\theta_{2}$ +% \item $x_{c}$ +% \item $y_{c}$ +% \item $x_{a1}$ +% \item $y_{a1}$ +% \item $x_{a2}$ +% \item $y_{a2}$ +% \end{enumerate} +% We are now in a position to find the target angle, and from that +% the sine and cosine required. +% \begin{macrocode} +\cs_new:Npn \@@_point_interpolate_arcaxes_auxii:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \@@_point_interpolate_arcaxes_auxiii:fnnnnnn + { \fp_eval:n { #1 * (#3) + ( 1 - #1 ) * (#2) } } + {#4} {#5} {#6} {#7} {#8} {#9} + } +\cs_generate_variant:Nn \@@_point_interpolate_arcaxes_auxii:nnnnnnnnn { f } +\cs_new:Npn \@@_point_interpolate_arcaxes_auxiii:nnnnnnn #1#2#3#4#5#6#7 + { + \@@_point_interpolate_arcaxes_auxiv:ffnnnnnn + { \fp_eval:n { cosd (#1) } } + { \fp_eval:n { sind (#1) } } + {#2} {#3} {#4} {#5} {#6} {#7} + } +\cs_generate_variant:Nn \@@_point_interpolate_arcaxes_auxiii:nnnnnnn { f } +\cs_new:Npn \@@_point_interpolate_arcaxes_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \@@_point_to_dim:n + { #3 + #1 * #5 + #2 * #7 , #4 + #1 * #6 + #2 * #8 } + } +\cs_generate_variant:Nn \@@_point_interpolate_arcaxes_auxiv:nnnnnnnn { ff } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\draw_point_interpolate_curve:nnnnn} +% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxi:nnnnnnnnn} +% \begin{macro}[EXP] +% { +% \draw_point_interpolate_curve_auxii:nnnnnnnnn, +% \draw_point_interpolate_curve_auxii:fnnnnnnnn, +% } +% \begin{macro}[EXP] +% { +% \draw_point_interpolate_curve_auxiii:nnnnnn, +% \draw_point_interpolate_curve_auxiii:fnnnnn, +% } +% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxiv:nnnnnn} +% \begin{macro}[EXP] +% { +% \draw_point_interpolate_curve_auxv:nnw, +% \draw_point_interpolate_curve_auxv:ffw, +% } +% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxvi:n} +% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxvii:nnnnnnnn} +% \begin{macro}[EXP] +% { +% \draw_point_interpolate_curve_auxviii:nnnnnn, +% \draw_point_interpolate_curve_auxviii:ffnnnn, +% } +% Here we start with a proportion of the curve ($p$) and four points +% \begin{enumerate} +% \item The initial point $(x_{1},y_{1})$ +% \item The first control point $(x_{2},y_{2})$ +% \item The second control point $(x_{3},y_{3})$ +% \item The final point $(x_{4},y_{4})$ +% \end{enumerate} +% The first phase is to expand out all of these values. +% \begin{macrocode} +\cs_new:Npn \draw_point_interpolate_curve:nnnnnn #1#2#3#4#5 + { + \@@_point_process:nnn + { + \@@_point_process:nnn + { \@@_point_interpolate_curve_auxi:nnnnnnnnn {#1} } + {#4} {#5} + } + {#2} {#3} + } +\cs_new:Npn \@@_point_interpolate_curve_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \@@_point_interpolate_curve_auxii:fnnnnnnnn + { \fp_eval:n {#1} } + {#6} {#7} {#8} {#9} {#2} {#3} {#4} {#5} + } +% \end{macrocode} +% At this stage, everything is fully expanded and back in the input order. +% The approach to finding the required point is iterative. We carry out +% three phases. In phase one, we need all of the input co-ordinates +% \begin{align*} +% x_{1}' &= (1 - p)x_{1} + px_{2} \\ +% y_{1}' &= (1 - p)y_{1} + py_{2} \\ +% x_{2}' &= (1 - p)x_{2} + px_{3} \\ +% y_{2}' &= (1 - p)y_{2} + py_{3} \\ +% x_{3}' &= (1 - p)x_{3} + px_{4} \\ +% y_{3}' &= (1 - p)y_{3} + py_{4} +% \end{align*} +% In the second stage, we can drop the final point +% \begin{align*} +% x_{1}'' &= (1 - p)x_{1}' + px_{2}' \\ +% y_{1}'' &= (1 - p)y_{1}' + py_{2}' \\ +% x_{2}'' &= (1 - p)x_{2}' + px_{3}' \\ +% y_{2}'' &= (1 - p)y_{2}' + py_{3}' +% \end{align*} +% and for the final stage only need one set of calculations +% \begin{align*} +% P_{x} &= (1 - p)x_{1}'' + px_{2}'' \\ +% P_{y} &= (1 - p)y_{1}'' + py_{2}'' +% \end{align*} +% Of course, this does mean a lot of calculations and expansion! +% \begin{macrocode} +\cs_new:Npn \@@_point_interpolate_curve_auxii:nnnnnnnnn + #1#2#3#4#5#6#7#8#9 + { + \@@_point_interpolate_curve_auxiii:fnnnnn + { \fp_eval:n { 1 - #1 } } + {#1} + { {#2} {#3} } { {#4} {#5} } { {#6} {#7} } { {#8} {#9} } + } +\cs_generate_variant:Nn \@@_point_interpolate_curve_auxii:nnnnnnnnn { f } +% \begin{macrocode} +% We need to do the first cycle, but haven't got enough arguments to keep +% everything in play at once. So her ewe use a but of argument re-ordering +% and a single auxiliary to get the job done. +% \begin{macrocode} +\cs_new:Npn \@@_point_interpolate_curve_auxiii:nnnnnn #1#2#3#4#5#6 + { + \@@_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #3 #4 + \@@_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #4 #5 + \@@_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #5 #6 + \prg_do_nothing: + \@@_point_interpolate_curve_auxvi:n { {#1} {#2} } + } +\cs_generate_variant:Nn \@@_point_interpolate_curve_auxiii:nnnnnn { f } +\cs_new:Npn \@@_point_interpolate_curve_auxiv:nnnnnn #1#2#3#4#5#6 + { + \@@_point_interpolate_curve_auxv:ffw + { \fp_eval:n { #1 * #3 + #2 * #5 } } + { \fp_eval:n { #1 * #4 + #2 * #6 } } + } +\cs_new:Npn \@@_point_interpolate_curve_auxv:nnw + #1#2#3 \prg_do_nothing: #4#5 + { + #3 + \prg_do_nothing: + #4 { #5 {#1} {#2} } + } +\cs_generate_variant:Nn \@@_point_interpolate_curve_auxv:nnw { ff } +% \begin{macrocode} +% Get the arguments back into the right places and to the second and +% third cycles directly. +% \begin{macrocode} +\cs_new:Npn \@@_point_interpolate_curve_auxvi:n #1 + { \@@_point_interpolate_curve_auxvii:nnnnnnnn #1 } +\cs_new:Npn \@@_point_interpolate_curve_auxvii:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \@@_point_interpolate_curve_auxviii:ffffnn + { \fp_eval:n { #1 * #5 + #2 * #3 } } + { \fp_eval:n { #1 * #6 + #2 * #4 } } + { \fp_eval:n { #1 * #7 + #2 * #5 } } + { \fp_eval:n { #1 * #8 + #2 * #6 } } + {#1} {#2} + } +\cs_new:Npn \@@_point_interpolate_curve_auxviii:nnnnnn #1#2#3#4#5#6 + { + \@@_point_to_dim:n + { #5 * #3 + #6 * #1 , #5 * #4 + #6 * #2 } + } +\cs_generate_variant:Nn \@@_point_interpolate_curve_auxviii:nnnnnn { ffff } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Vector support} +% +% As well as co-ordinates relative to the drawing +% +% \begin{variable} +% { +% \l_@@_xvec_x_dim, +% \l_@@_xvec_y_dim, +% \l_@@_yvec_x_dim, +% \l_@@_yvec_y_dim, +% \l_@@_zvec_x_dim, +% \l_@@_zvec_y_dim +% } +% Base vectors to map to the underlying two-dimensional drawing space. +% \begin{macrocode} +\dim_new:N \l_@@_xvec_x_dim +\dim_new:N \l_@@_xvec_y_dim +\dim_new:N \l_@@_yvec_x_dim +\dim_new:N \l_@@_yvec_y_dim +\dim_new:N \l_@@_zvec_x_dim +\dim_new:N \l_@@_zvec_y_dim +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_xvec:n, \draw_yvec:n, \draw_zvec:n} +% \begin{macro}{\@@_vec:nn} +% \begin{macro}{\@@_vec:nnn} +% Calculate the underlying position and store it. +% \begin{macrocode} +\cs_new_protected:Npn \draw_xvec:n #1 + { \@@_vec:nn { x } {#1} } +\cs_new_protected:Npn \draw_yvec:n #1 + { \@@_vec:nn { y } {#1} } +\cs_new_protected:Npn \draw_zvec:n #1 + { \@@_vec:nn { z } {#1} } +\cs_new_protected:Npn \@@_vec:nn #1#2 + { + \@@_point_process:nn { \@@_vec:nnn {#1} } {#2} + } +\cs_new_protected:Npn \@@_vec:nnn #1#2#3 + { + \dim_set:cn { l_@@_ #1 vec_x_dim } {#2} + \dim_set:cn { l_@@_ #1 vec_y_dim } {#3} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Initialise the vectors. +% \begin{macrocode} +\draw_xvec:n { 1cm , 0cm } +\draw_yvec:n { 0cm , 1cm } +\draw_zvec:n { -0.385cm , -0.385cm } +% \end{macrocode} +% +% \begin{macro}[EXP]{\draw_point_vec:nn} +% \begin{macro}[EXP]{\@@_point_vec:nn, \@@_point_vec:ff} +% \begin{macro}[EXP]{\draw_point_vec:nnn} +% \begin{macro}[EXP]{\@@_point_vec:nnn, \@@_point_vec:fff} +% Force a single evaluation of each factor, then use these to work out the +% underlying point. +% \begin{macrocode} +\cs_new:Npn \draw_point_vec:nn #1#2 + { \@@_point_vec:ff { \fp_eval:n {#1} } { \fp_eval:n {#2} } } +\cs_new:Npn \@@_point_vec:nn #1#2 + { + \@@_point_to_dim:n + { + #1 * \l_@@_xvec_x_dim + #2 * \l_@@_yvec_x_dim , + #1 * \l_@@_xvec_y_dim + #2 * \l_@@_yvec_y_dim + } + } +\cs_generate_variant:Nn \@@_point_vec:nn { ff } +\cs_new:Npn \draw_point_vec:nnn #1#2#3 + { + \@@_point_vec:fff + { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_eval:n {#3} } + } +\cs_new:Npn \@@_point_vec:nnn #1#2#3 + { + \@@_point_to_dim:n + { + #1 * \l_@@_xvec_x_dim + + #2 * \l_@@_yvec_x_dim + + #3 * \l_@@_zvec_x_dim + , + #1 * \l_@@_xvec_y_dim + + #2 * \l_@@_yvec_y_dim + + #3 * \l_@@_zvec_y_dim + } + } +\cs_generate_variant:Nn \@@_point_vec:nnn { fff } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\draw_point_vec_polar:nn} +% \begin{macro}[EXP]{\draw_point_vec_polar:nnn} +% \begin{macro}[EXP]{\@@_point_vec_polar:nnn, \@@_point_vec_polar:fnn} +% Much the same as the core polar approach. +% \begin{macrocode} +\cs_new:Npn \draw_point_vec_polar:nn #1#2 + { \draw_point_vec_polar:nnn {#1} {#2} {#2} } +\cs_new:Npn \draw_point_vec_polar:nnn #1#2#3 + { \@@_draw_vec_polar:fnn { \fp_eval:n {#1} } {#2} {#3} } +\cs_new:Npn \@@_draw_vec_polar:nnn #1#2#3 + { + \@@_point_to_dim:n + { + cosd(#1) * (#2) * \l_@@_xvec_x_dim , + sind(#1) * (#3) * \l_@@_yvec_y_dim + } + } +\cs_generate_variant:Nn \@@_draw_vec_polar:nnn { f } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Transformations} +% +% \begin{macro}[EXP]{\draw_point_transform:n} +% \begin{macro}[EXP]{\@@_point_transform:nn} +% Applies a transformation matrix to a point: see \texttt{l3draw-transforms} +% for the business end. Where possible, we avoid the relatively expensive +% multiplication step. +% \begin{macrocode} +\cs_new:Npn \draw_point_transform:n #1 + { + \@@_point_process:nn + { \@@_point_transform:nn } {#1} + } +\cs_new:Npn \@@_point_transform:nn #1#2 + { + \bool_if:NTF \l_@@_transformcm_active_bool + { + \@@_point_to_dim:n + { + ( + \l_@@_transformcm_aa_fp * #1 + + \l_@@_transformcm_ba_fp * #2 + + \l_@@_transformcm_xshift_dim + ) + , + ( + \l_@@_transformcm_ab_fp * #1 + + \l_@@_transformcm_bb_fp * #2 + + \l_@@_transformcm_yshift_dim + ) + } + } + { + \@@_point_to_dim:n + { + (#1, #2) + + ( \l_@@_transformcm_xshift_dim , + \l_@@_transformcm_yshift_dim ) + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_point_transform_noshift:n} +% \begin{macro}[EXP]{\@@_point_transform_noshift:nn} +% A version with no shift: used for internal purposes. +% \begin{macrocode} +\cs_new:Npn \@@_point_transform_noshift:n #1 + { + \@@_point_process:nn + { \@@_point_transform_noshift:nn } {#1} + } +\cs_new:Npn \@@_point_transform_noshift:nn #1#2 + { + \bool_if:NTF \l_@@_transformcm_active_bool + { + \@@_point_to_dim:n + { + ( + \l_@@_transformcm_aa_fp * #1 + + \l_@@_transformcm_ba_fp * #2 + ) + , + ( + \l_@@_transformcm_ab_fp * #1 + + \l_@@_transformcm_bb_fp * #2 + ) + } + } + { \@@_point_to_dim:n { (#1, #2) } } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx new file mode 100644 index 00000000000..b87a6a152b7 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx @@ -0,0 +1,141 @@ +% \iffalse meta-comment +% +%% File: l3draw-scopes.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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> +\RequirePackage{expl3} +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw} package\\ Drawing scopes^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{implementation} +% +% \section{\pkg{l3draw-scopes} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% \subsection{Drawing environment} +% +% \begin{variable} +% {\g_@@_xmax_dim, \g_@@_xmin_dim, \g_@@_ymax_dim, \g_@@_ymin_dim} +% Used to track the overall (official) size of the image created: may +% not actually be the natural size of the content. +% \begin{macrocode} +\dim_new:N \g_@@_xmax_dim +\dim_new:N \g_@@_xmin_dim +\dim_new:N \g_@@_ymax_dim +\dim_new:N \g_@@_ymin_dim +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_update_bb_bool} +% Flag to indicate that a path (or similar) should update the bounding box +% of the drawing. +% \begin{macrocode} +\bool_new:N \l_@@_update_bb_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_main_box} +% Box for setting the drawing. +% \begin{macrocode} +\box_new:N \l_@@_main_box +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_begin:, \draw_end:} +% Drawings are created by setting them into a box, then adjusting the box +% before inserting into the surroundings. At present the content is simply +% collected then dumped: work will be required to manipulate the size as +% this data becomes more defined. It may be that a coffin construct is +% better here in the longer term: that may become clearer as the code is +% completed. Another obvious question is whether/where vertical mode should +% be ended (\emph{i.e.}~should this behave like a raw |\vbox| or like +% a coffin). In contrast to \pkg{pgf}, we use a vertical box here: material +% between explicit instructions should not be present anyway. (Consider +% adding an |\everypar| hook as done for the \LaTeXe{} preamble.) +% \begin{macrocode} +\cs_new_protected:Npn \draw_begin: + { + \vbox_set:Nw \l_@@_main_box + \driver_draw_begin: + \dim_gset:Nn \g_@@_xmax_dim { -\c_max_dim } + \dim_gset:Nn \g_@@_xmin_dim { \c_max_dim } + \dim_gset:Nn \g_@@_ymax_dim { -\c_max_dim } + \dim_gset:Nn \g_@@_ymin_dim { \c_max_dim } + \bool_set_true:N \l_@@_update_bb_bool + \draw_transform_reset: + \draw_linewidth:n { \l_draw_default_linewidth_dim } + } +\cs_new_protected:Npn \draw_end: + { + \driver_draw_end: + \vbox_set_end: + \hbox_set:Nn \l_@@_main_box + { + \skip_horizontal:n { -\g_@@_xmin_dim } + \box_move_down:nn { \g_@@_ymin_dim } + { \box_use_drop:N \l_@@_main_box } + } + \box_set_ht:Nn \l_@@_main_box + { \g_@@_ymax_dim - \g_@@_ymin_dim } + \box_set_dp:Nn \l_@@_main_box { 0pt } + \box_set_wd:Nn \l_@@_main_box + { \g_@@_xmax_dim - \g_@@_xmin_dim } + \mode_leave_vertical: + \box_use_drop:N \l_@@_main_box + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx new file mode 100644 index 00000000000..f10d7928082 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx @@ -0,0 +1,323 @@ +% \iffalse meta-comment +% +%% File: l3draw-softpath.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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> +\RequirePackage{expl3} +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw-softpath} package\\ Soft paths^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{implementation} +% +% \section{\pkg{l3draw-softpath} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% There are two linked aims in the code here. The most significant is to +% provide a way to modify paths, for example to shorten the ends or round +% the corners. This means that the path cannot be written piecemeal as +% specials, but rather needs to be held in macros. The second aspect that +% follows from this is performance: simply adding to a single macro a piece +% at a time will have poor performance as the list gets long. Paths need to +% be global (as specials are), so we cannot use \pkg{l3tl-build} or a similar +% approach. Instead, we use the same idea as \pkg{pgf}: use a series of buffer +% macros such that in most cases we don't add tokens to the main list. This +% will get slow only for \emph{enormous} paths. +% +% Each marker (operation) token takes two arguments, which makes processing +% more straight-forward. As such, some operations have dummy arguments, whilst +% others have to be split over several tokens. As the code here is at a low +% level, all dimension arguments are assumed to be explicit and fully-expanded. +% +% \begin{variable} +% { +% \g_@@_softpath_main_tl , +% \g_@@_softpath_buffer_a_tl , +% \g_@@_softpath_buffer_b_tl +% } +% The soft path itself. +% \begin{macrocode} +\tl_new:N \g_@@_softpath_main_tl +\tl_new:N \g_@@_softpath_buffer_a_tl +\tl_new:N \g_@@_softpath_buffer_b_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% { +% \g_@@_softpath_buffer_a_int , +% \g_@@_softpath_buffer_b_int +% } +% Tracking data. +% \begin{macrocode} +\int_new:N \g_@@_softpath_buffer_a_int +\int_new:N \g_@@_softpath_buffer_b_int +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_softpath_add:n, \@@_softpath_add:x} +% \begin{macro}{\@@_softpath_concat:n} +% \begin{macro}{\@@_softpath_reset_buffers:} +% The softpath itself is quite simple. We use three token lists to hold the +% data: two buffers of limited length, and the main list of arbitrary size. +% Most of the time this will mean that we don't add to the full list, so +% performance will be acceptable. +% \begin{macrocode} +\cs_new_protected:Npn \@@_softpath_add:n #1 + { + \int_compare:nNnTF \g_@@_softpath_buffer_a_int < { 40 } + { + \int_gincr:N \g_@@_softpath_buffer_a_int + \tl_gput_right:Nn \g_@@_softpath_buffer_a_tl {#1} + } + { + \int_compare:nNnTF \g_@@_softpath_buffer_b_int < { 40 } + { + \int_gincr:N \g_@@_softpath_buffer_b_int + \tl_gset:Nx \g_@@_softpath_buffer_b_tl + { + \exp_not:V \g_@@_softpath_buffer_b_tl + \exp_not:V \g_@@_softpath_buffer_a_tl + \exp_not:n {#1} + } + \int_gzero:N \g_@@_softpath_buffer_a_int + \tl_gclear:N \g_@@_softpath_buffer_a_tl + } + { \@@_softpath_concat:n {#1} } + } + } +\cs_generate_variant:Nn \@@_softpath_add:n { x } +\cs_new_protected:Npn \@@_softpath_concat:n #1 + { + \tl_gset:Nx \g_@@_softpath_main_tl + { + \exp_not:V \g_@@_softpath_main_tl + \exp_not:V \g_@@_softpath_buffer_b_tl + \exp_not:V \g_@@_softpath_buffer_a_tl + \exp_not:n {#1} + } + \@@_softpath_reset_buffers: + } +\cs_new_protected:Npn \@@_softpath_reset_buffers: + { + \int_gzero:N \g_@@_softpath_buffer_a_int + \tl_gclear:N \g_@@_softpath_buffer_a_tl + \int_gzero:N \g_@@_softpath_buffer_b_int + \tl_gclear:N \g_@@_softpath_buffer_b_tl + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_softpath_get:N, \@@_softpath_set_eq:N} +% Save and restore functions. +% \begin{macrocode} +\cs_new_protected:Npn \@@_softpath_get:N #1 + { + \@@_softpath_concat:n { } + \tl_set_eq:NN #1 \g_@@_softpath_main_tl + } +\cs_new_protected:Npn \@@_softpath_set_eq:N #1 + { + \tl_gset_eq:NN \g_@@_softpath_main_tl #1 + \@@_softpath_reset_buffers: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% {\@@_softpath_use:, \@@_softpath_clear:, \@@_softpath_use_clear:} +% Using and clearing is trivial. +% \begin{macrocode} +\cs_new_protected:Npn \@@_softpath_use: + { + \g_@@_softpath_main_tl + \g_@@_softpath_buffer_b_tl + \g_@@_softpath_buffer_a_tl + } +\cs_new_protected:Npn \@@_softpath_clear: + { + \tl_gclear:N \g_@@_softpath_main_tl + \tl_gclear:N \g_@@_softpath_buffer_a_tl + \tl_gclear:N \g_@@_softpath_buffer_b_tl + } +\cs_new_protected:Npn \@@_softpath_use_clear: + { + \@@_softpath_use: + \@@_softpath_clear: + } +% \end{macrocode} +% \end{macro} +% +% \begin{variable}{\g_@@_softpath_lastx_dim, \g_@@_softpath_lasty_dim} +% For tracking the end of the path (to close it). +% \begin{macrocode} +\dim_new:N \g_@@_softpath_lastx_dim +\dim_new:N \g_@@_softpath_lasty_dim +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_softpath_move_bool} +% Track if moving a point should update the close position. +% \begin{macrocode} +\bool_new:N \g_@@_softpath_move_bool +\bool_gset_true:N \g_@@_softpath_move_bool +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_softpath_curveto:nnnnnn} +% \begin{macro} +% { +% \@@_softpath_lineto:nn, +% \@@_softpath_moveto:nn +% } +% \begin{macro}{\@@_softpath_rectangle:nnnn} +% \begin{macro}{\@@_softpath_roundpoint:nn, \@@_softpath_roundpoint:VV} +% The various parts of a path expressed as the appropriate soft path +% functions. +% \begin{macrocode} +\cs_new_protected:Npn \@@_softpath_closepath: + { + \@@_softpath_add:x + { + \@@_softpath_close_op:nn + { \dim_use:N \g_@@_softpath_lastx_dim } + { \dim_use:N \g_@@_softpath_lasty_dim } + } + } +\cs_new_protected:Npn \@@_softpath_curveto:nnnnnn #1#2#3#4#5#6 + { + \@@_softpath_add:n + { + \@@_softpath_curveto_opi:nn {#1} {#2} + \@@_softpath_curveto_opii:nn {#3} {#4} + \@@_softpath_curveto_opiii:nn {#5} {#6} + } + } +\cs_new_protected:Npn \@@_softpath_lineto:nn #1#2 + { + \@@_softpath_add:n + { \@@_softpath_lineto_op:nn {#1} {#2} } + } +\cs_new_protected:Npn \@@_softpath_moveto:nn #1#2 + { + \@@_softpath_add:n + { \@@_softpath_moveto_op:nn {#1} {#2} } + \bool_if:NT \g_@@_softpath_move_bool + { + \dim_gset:Nn \g_@@_softpath_lastx_dim {#1} + \dim_gset:Nn \g_@@_softpath_lasty_dim {#2} + } + } +\cs_new_protected:Npn \@@_softpath_rectangle:nnnn #1#2#3#4 + { + \@@_softpath_add:n + { + \@@_softpath_rectangle_opi:nn {#1} {#2} + \@@_softpath_rectangle_opii:nn {#3} {#4} + } + } +\cs_new_protected:Npn \@@_softpath_roundpoint:nn #1#2 + { + \@@_softpath_add:n + { \@@_softpath_roundpoint_op:nn {#1} {#2} } + } +\cs_generate_variant:Nn \@@_softpath_roundpoint:nn { VV } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro} +% { +% \@@_softpath_close_op:nn , +% \@@_softpath_curveto_opi:nn , +% \@@_softpath_curveto_opii:nn , +% \@@_softpath_curveto_opiii:nn , +% \@@_softpath_lineto_op:nn , +% \@@_softpath_moveto_op:nn , +% \@@_softpath_roundpoint_op:nn , +% \@@_softpath_rectangle_opi:nn , +% \@@_softpath_rectangle_opii:nn +% } +% \begin{macro}{\@@_softpath_curveto_opi:nnNnnNnn} +% \begin{macro}{\@@_softpath_rectangle_opi:nnNnn} +% The markers for operations: all the top-level ones take two arguments. +% \begin{macrocode} +\cs_new_protected:Npn \@@_softpath_close_op:nn #1#2 + { \driver_draw_closepath: } +\cs_new_protected:Npn \@@_softpath_curveto_opi:nn #1#2 + { \@@_softpath_curveto_opi:nnNnnNnn {#1} {#2} } +\cs_new_protected:Npn \@@_softpath_curveto_opi:nnNnnNnn #1#2#3#4#5#6#7#8 + { \driver_draw_curveto:nnnnnn {#1} {#2} {#4} {#5} {#7} {#8} } +\cs_new_protected:Npn \@@_softpath_curveto_opii:nn #1#2 { } +\cs_new_protected:Npn \@@_softpath_curveto_opiii:nn #1#2 { } +\cs_new_protected:Npn \@@_softpath_lineto_op:nn #1#2 + { \driver_draw_lineto:nn {#1} {#2} } +\cs_new_protected:Npn \@@_softpath_moveto_op:nn #1#2 + { \driver_draw_moveto:nn {#1} {#2} } +\cs_new_protected:Npn \@@_softpath_roundpoint_op:nn #1#2 { } +\cs_new_protected:Npn \@@_softpath_rectangle_opi:nn #1#2 + { \@@_softpath_rectangle_opi:nnNnn {#1} {#2} } +\cs_new_protected:Npn \@@_softpath_rectangle_opi:nnNnn #1#2#3#4#5 + { \driver_draw_rectangle:nnnn {#1} {#2} {#4} {#5} } + \cs_new_protected:Npn \@@_softpath_rectangle_opii:nn #1#2 { } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx new file mode 100644 index 00000000000..5e6eb424d05 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx @@ -0,0 +1,193 @@ +% \iffalse meta-comment +% +%% File: l3draw-state.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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> +\RequirePackage{expl3} +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw-state} package\\ Drawing graphics state^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{implementation} +% +% \section{\pkg{l3draw-state} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% \begin{variable}{\g_@@_linewidth_dim, \g_@@_inner_linewidth_dim} +% Linewidth for strokes: global as the scope for this relies on the graphics +% state. The inner line width is used for places where two lines are used. +% \begin{macrocode} +\dim_new:N \g_@@_linewidth_dim +\dim_new:N \g_@@_inner_linewidth_dim +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_draw_default_linewidth_dim} +% A default: this is used at the start of every drawing. +% \begin{macrocode} +\dim_new:N \l_draw_default_linewidth_dim +\dim_set:Nn \l_draw_default_linewidth_dim { 0.4pt } +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_linewidth:n, \draw_inner_linewidth:n} +% Set the linewidth: we need a wrapper as this has to pass to the driver +% layer. The inner version is handled at the macro layer but is given a +% consistent interface here. +% \begin{macrocode} +\cs_new_protected:Npn \draw_linewidth:n #1 + { + \dim_gset:Nn \g_@@_linewidth_dim { \fp_to_dim:n {#1} } + \driver_draw_linewidth:n \g_@@_linewidth_dim + } +\cs_new_protected:Npn \draw_inner_linewidth:n #1 + { \dim_gset:Nn \g_@@_inner_linewidth_dim { \fp_to_dim:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\draw_miterlimit:n} +% Pass through to the driver layer. +% \begin{macrocode} +\cs_new_protected:Npn \draw_miterlimit:n #1 + { \driver_draw_miterlimit:n { \fp_to_dim:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \draw_cap_butt:, \draw_cap_rectangle:, \draw_cap_round:, +% \draw_evenodd_rule:, \draw_nonzero_rule:, +% \draw_join_bevel:, \draw_join_miter:, \draw_join_round: +% } +% All straight wrappers. +% \begin{macrocode} +\cs_new_protected:Npn \draw_cap_butt: { \driver_draw_cap_butt: } +\cs_new_protected:Npn \draw_cap_rectangle: { \driver_draw_cap_rectangle: } +\cs_new_protected:Npn \draw_cap_round: { \driver_draw_cap_round: } +\cs_new_protected:Npn \draw_evenodd_rule: { \driver_draw_evenodd_rule: } +\cs_new_protected:Npn \draw_nonzero_rule: { \driver_draw_nonzero_rule: } +\cs_new_protected:Npn \draw_join_bevel: { \driver_draw_join_bevel: } +\cs_new_protected:Npn \draw_join_miter: { \driver_draw_join_miter: } +\cs_new_protected:Npn \draw_join_round: { \driver_draw_join_round: } +% \end{macrocode} +% \end{macro} +% +% \begin{variable}{\l_@@_color_tmp_tl} +% Scratch space. +% \begin{macrocode} +\tl_new:N \l_@@_color_tmp_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_fill_color_tl, \g_@@_stroke_color_tl} +% For tracking. +% \begin{macrocode} +\tl_new:N \g_@@_fill_color_tl +\tl_new:N \g_@@_stroke_color_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_color:n, \draw_color_fill:n, \draw_color_stroke:n} +% \begin{macro}{\@@_color:nn} +% \begin{macro}{\@@_color_aux:nn, \@@_color_aux:Vn} +% \begin{macro}{\@@_color:nw} +% \begin{macro} +% { +% \@@_select_cmyk:nw, \@@_select_gray:nw, +% \@@_select_rgb:nw, \@@_split_select:nw +% } +% Much the same as for core color support but calling the relevant +% driver-level function. +% \begin{macrocode} +\cs_new_protected:Npn \draw_color:n #1 + { \@@_color:nn { } {#1} } +\cs_new_protected:Npn \draw_color_fill:n #1 + { \@@_color:nn { fill } {#1} } +\cs_new_protected:Npn \draw_color_stroke:n #1 + { \@@_color:nn { stroke } {#1} } +\cs_new_protected:Npn \@@_color:nn #1#2 + { + \color_parse:nN {#2} \l_@@_color_tmp_tl + \tl_if_blank:nTF {#1} + { + \tl_gset_eq:NN \g_@@_fill_color_tl \l_@@_color_tmp_tl + \tl_gset_eq:NN \g_@@_stroke_color_tl \l_@@_color_tmp_tl + \@@_color_aux:Vn \l_@@_color_tmp_tl { color } + } + { + \tl_gset_eq:cN { g_@@_ #1 _color_tl } \l_@@_color_tmp_tl + \@@_color_aux:Vn \l_@@_color_tmp_tl { #1 } + } + } +\cs_new_protected:Npn \@@_color_aux:nn #1#2 + { \@@_color:nw {#2} #1 \q_stop } +\cs_generate_variant:Nn \@@_color_aux:nn { V } +\cs_new_protected:Npn \@@_color:nw #1#2 ~ #3 \q_stop + { \use:c { @@_color_ #2 :nw } {#1} #3 \q_stop } +\cs_new_protected:Npn \@@_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop + { \use:c { driver_draw_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} } +\cs_new_protected:Npn \@@_color_gray:nw #1#2 \q_stop + { \use:c { driver_draw_ #1 _gray:n } {#2} } +\cs_new_protected:Npn \@@_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop + { \use:c { driver_draw_ #1 _rgb:nnn } {#2} {#3} {#4} } +\cs_new_protected:Npn \@@_color_spot:nw #1#2 ~ #3 \q_stop + { \use:c { driver_draw_ #1 _spot:nn } {#2} {#3} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx new file mode 100644 index 00000000000..4f325f01092 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx @@ -0,0 +1,286 @@ +% \iffalse meta-comment +% +%% File: l3draw-transforms.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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> +\RequirePackage{expl3} +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw-transforms} package\\ Transformations^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{implementation} +% +% \section{\pkg{l3draw-transforms} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% \begin{variable}{\l_@@_transformcm_active_bool} +% An internal flag to avoid redundant calculations. +% \begin{macrocode} +\bool_new:N \l_@@_transformcm_active_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% { +% \l_@@_transformcm_aa_fp, \l_@@_transformcm_ab_fp, +% \l_@@_transformcm_ba_fp, \l_@@_transformcm_aa_fp, +% \l_@@_transformcm_xshift_dim, +% \l_@@_transformcm_yshift_dim +% } +% The active matrix itself. +% \begin{macrocode} +\fp_new:N \l_@@_transformcm_aa_fp +\fp_new:N \l_@@_transformcm_ab_fp +\fp_new:N \l_@@_transformcm_ba_fp +\fp_new:N \l_@@_transformcm_bb_fp +\dim_new:N \l_@@_transformcm_xshift_dim +\dim_new:N \l_@@_transformcm_yshift_dim +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\draw_transform_reset:} +% Fast resetting. +% \begin{macrocode} +\cs_new_protected:Npn \draw_transform_reset: + { + \fp_set:Nn \l_@@_transformcm_aa_fp { 1} + \fp_zero:N \l_@@_transformcm_ab_fp + \fp_zero:N \l_@@_transformcm_ba_fp + \fp_set:Nn \l_@@_transformcm_bb_fp { 1 } + \dim_zero:N \l_@@_transformcm_xshift_dim + \dim_zero:N \l_@@_transformcm_yshift_dim + } +\draw_transform_reset: +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\draw_transform:nnnnn} +% \begin{macro}{\@@_transform:nnnnnnn} +% Setting the transform matrix is straight-forward, with just a bit +% of expansion to sort out. With the mechanism active, the identity +% matrix is set. +% \begin{macrocode} +\cs_new_protected:Npn \draw_transform:nnnnn #1#2#3#4#5 + { + \@@_point_process:nn + { \@@_transform:nnnnnnn {#1} {#2} {#3} {#4} } + {#5} + } +\cs_new_protected:Npn \@@_transform:nnnnnnn #1#2#3#4#5#6 + { + \fp_set:Nn \l_@@_transformcm_aa_fp {#1} + \fp_set:Nn \l_@@_transformcm_ab_fp {#2} + \fp_set:Nn \l_@@_transformcm_ba_fp {#3} + \fp_set:Nn \l_@@_transformcm_bb_fp {#4} + \dim_set:Nn \l_@@_transformcm_xshift_dim {#5} + \dim_set:Nn \l_@@_transformcm_yshift_dim {#6} + \bool_lazy_all:nTF + { + { \fp_compare_p:nNn \l_@@_transformcm_aa_fp = \c_one_fp } + { \fp_compare_p:nNn \l_@@_transformcm_ab_fp = \c_zero_fp } + { \fp_compare_p:nNn \l_@@_transformcm_ba_fp = \c_zero_fp } + { \fp_compare_p:nNn \l_@@_transformcm_bb_fp = \c_one_fp } + } + { \bool_set_false:N \l_@@_transformcm_active_bool } + { \bool_set_true:N \l_@@_transformcm_active_bool } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_transform_concat:nnnnn} +% \begin{macro}{\@@_transform_concat:nnnnnn} +% \begin{macro}{\@@_transform_concat_aux:nnnnnn} +% Much the same story for adding to an existing matrix. The part that is more +% complex is the calculations required: everything gets passed back to +% \cs{@@_transform_set:nnnnnn}, with pre-expansion just in case there are +% \emph{e.g}~random values. The final step is \texttt{x}-type expanded as +% otherwise later values affect earlier ones. +% \begin{macrocode} +\cs_new_protected:Npn \draw_transform_concat:nnnnn #1#2#3#4#5 + { + \@@_point_process:nn + { \@@_transform_concat:nnnnnn {#1} {#2} {#3} {#4} } + {#5} + } +\cs_new_protected:Npn \@@_transform_concat:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \@@_transform_concat_aux:nnnnnn + { \fp_eval:n {#1} } + { \fp_eval:n {#2} } + { \fp_eval:n {#3} } + { \fp_eval:n {#4} } + {#5} + {#6} + } + } +\cs_new_protected:Npn \@@_transform_concat_aux:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \@@_transform:nnnnnnn + { #1 * \l_@@_transformcm_aa_fp + #2 * \l_@@_transformcm_ba_fp } + { #1 * \l_@@_transformcm_ab_fp + #2 * \l_@@_transformcm_bb_fp } + { #3 * \l_@@_transformcm_aa_fp + #4 * \l_@@_transformcm_ba_fp } + { #3 * \l_@@_transformcm_ab_fp + #4 * \l_@@_transformcm_bb_fp } + { + \fp_to_dim:n + { + \l_@@_transformcm_xshift_dim + + \l_@@_transformcm_aa_fp * #5 + + \l_@@_transformcm_ba_fp * #6 + } + } + { + \fp_to_dim:n + { + \l_@@_transformcm_yshift_dim + + \l_@@_transformcm_ab_fp * #5 + + \l_@@_transformcm_bb_fp * #6 + } + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_transform_invert:} +% \begin{macro}{\@@_transform_invert:n, \@@_transform_invert:f} +% Standard mathematics: calculate the inverse matrix and use that, then +% undo the shifts. +% \begin{macrocode} +\cs_new_protected:Npn \draw_transform_invert: + { + \bool_if:NT \l_@@_transformcm_active_bool + { + \@@_transform_invert:f + { + \fp_eval:n + { + 1 / + ( + \l_@@_transformcm_aa_fp * \l_@@_transformcm_bb_fp + - \l_@@_transformcm_ab_fp * \l_@@_transformcm_ba_fp + ) + } + } + } + \dim_set:Nn \l_@@_transformcm_xshift_dim + { + \fp_to_dim:n + { + -\l_@@_transformcm_xshift_dim * \l_@@_transformcm_aa_fp + -\l_@@_transformcm_yshift_dim * \l_@@_transformcm_ba_fp + } + } + \dim_set:Nn \l_@@_transformcm_yshift_dim + { + \fp_to_dim:n + { + -\l_@@_transformcm_xshift_dim * \l_@@_transformcm_ab_fp + -\l_@@_transformcm_yshift_dim * \l_@@_transformcm_bb_fp + } + } + } +\cs_new_protected:Npn \@@_transform_invert:n #1 + { + \fp_set:Nn \l_@@_transformcm_aa_fp + { \l_@@_transformcm_bb_fp * #1 } + \fp_set:Nn \l_@@_transformcm_ab_fp + { -\l_@@_transformcm_ab_fp * #1 } + \fp_set:Nn \l_@@_transformcm_ba_fp + { -\l_@@_transformcm_ba_fp * #1 } + \fp_set:Nn \l_@@_transformcm_bb_fp + { \l_@@_transformcm_aa_fp * #1 } + } +\cs_generate_variant:Nn \@@_transform_invert:n { f } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\draw_transform_triangle:nnn} +% Simple maths to move the canvas origin to |#1| and the two axes to +% |#2| and |#3|. +% \begin{macrocode} +\cs_new_protected:Npn \draw_transform_triangle:nnn #1#2#3 + { + \@@_point_process:nnn + { + \@@_point_process:nn + { \@@_tranform_triangle:nnnnnn } + {#1} + } + {#2} {#3} + } +\cs_new_protected:Npn \@@_tranform_triangle:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \@@_transform:nnnnnnn + { #3 - #1 } + { #4 - #2 } + { #5 - #1 } + { #6 - #2 } + {#1} + {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx new file mode 100644 index 00000000000..9b7c04d5e54 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx @@ -0,0 +1,575 @@ +% \iffalse meta-comment +% +%% File: l3draw.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 +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3experimental 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|package> +\RequirePackage{expl3} +%</driver|package> +%<*driver> +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3draw} package\\ Core drawing support^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2018/02/21} +% +% \maketitle +% +% \begin{documentation} +% +% \section{\pkg{l3draw} documentation} +% +% The \pkg{l3draw} package provides a set of tools for creating (vector) +% drawings in \pkg{expl3}. It is heavily inspired by the \pkg{pgf} layer of +% the Ti\textit{k}Z system, with many of the interfaces having the same form. +% However, the code provided here is build entirely on core \pkg{expl3} ideas +% and uses the \LaTeX3 FPU for numerical support. +% +% Numerical expressions in \pkg{l3draw} are handled as floating point +% expressions, unless otherwise noted. This means that they may contain or +% omit explicit units. Where units are omitted, they will automatically be +% taken as given in (\TeX{}) points. +% +% The code here is \emph{highly} experimental. +% +% \subsection{Drawings} +% +% \begin{function}{\draw_begin:, \draw_end:} +% \begin{syntax} +% \cs{draw_begin:} +% ... +% \cs{draw_end:} +% \end{syntax} +% Each drawing should be created within a \cs{draw_begin:}/\cs{draw_end:} +% function pair. The \texttt{begin} function sets up a number of key +% data structures for the rest of the functions here: unless otherwise +% specified, use of |\draw_...| functions outside of this +% \enquote{environment} is \emph{not supported}. +% +% The drawing created within the environment will be inserted into +% the typesetting stream by the \cs{draw_end:} function, which will +% switch out of vertical mode if required. +% \end{function} +% +% \subsection{Graphics state} +% +% Within the drawing environment, a number of functions control how drawings +% will appear. Note that these all apply \emph{globally}, though some are +% rest at the start of each drawing (\cs{draw_begin:}). +% +% \begin{function}{\g_draw_linewidth_default_dim} +% The default value of the linewidth for stokes, set at the start +% of every drawing (\cs{draw_begin:}). +% \end{function} +% +% \begin{function}{\draw_linewidth:n, \draw_inner_linewidth:n} +% \begin{syntax} +% \cs{draw_linewidth:n} \Arg{width} +% \end{syntax} +% Sets the width to be used for stroking to the \meta{width} (an +% \meta{fp expr}). +% \end{function} +% +% \begin{function}{\draw_nonzero_rule:, \draw_evenodd_rule:} +% \begin{syntax} +% \cs{draw_nonzero_rule:} +% \end{syntax} +% Active either the non-zero winding number or the even-odd rule, +% respectively, for determining what is inside a fill or clip area. +% For technical reasons, these command are not influenced by scoping +% and apply on an ongoing basis. +% \end{function} +% +% \begin{function} +% { +% \draw_cap_butt: , +% \draw_cap_rectangle: , +% \draw_cap_round: +% } +% \begin{syntax} +% \cs{draw_cap_butt:} +% \end{syntax} +% Sets the style of terminal stroke position to one of butt, rectangle or +% round. +% \end{function} +% +% \begin{function} +% { +% \draw_join_bevel: , +% \draw_join_miter: , +% \draw_join_round: +% } +% \begin{syntax} +% \cs{draw_cap_butt:} +% \end{syntax} +% Sets the style of stroke joins to one of bevel, miter or round. +% \end{function} +% +% \begin{function}{\draw_miterlimit:n} +% \begin{syntax} +% \cs{draw_miterlimit:n} \Arg{limit} +% \end{syntax} +% Sets the miter \meta{limit} of lines joined as a miter, as described in the +% PDF and PostScript manuals. The \meta{limit} is an \meta{fp expr}. +% \end{function} +% +% \subsection{Points} +% +% Functions supporting the calculation of points (co-ordinates) are expandable +% and may be used outside of the drawing environment. When used in this +% way, they all yield a co-ordinate tuple, for example +% \begin{verbatim} +% \tl_set:Nx \l_tmpa_tl { \draw_point:nn { 1 } { 2 } } +% \tl_show:N \l_tmpa_tl +% \end{verbatim} +% gives +% \begin{verbatim} +% > \l_tmpa_tl=1pt,2pt. +% <recently read> } +% \end{verbatim} +% +% This output form is then suitable as \emph{input} for subsequent point +% calculations, \emph{i.e.}~where a \meta{point} is required it may be +% given as a tuple. This \emph{may} include units and surrounding +% parentheses, for example +% \begin{verbatim} +% 1,2 +% (1,2) +% 1cm,3pt +% (1pt,2cm) +% 2 * sind(30), 2^4in +% \end{verbatim} +% are all valid input forms. Notice that each part of the tuple may itself +% be a float point expression. +% +% Point co-ordinates are relative to the canvas axes, but can be transformed +% by \cs{draw_point_transform:n}. These manipulation is applied by many +% higher-level functions, for example path construction, and allows parts of +% a drawing to be rotated, scaled or skewed. This occurs before writing any +% data to the driver, and so such manipulations are tracked by the drawing +% mechanisms. See \cs{driver_draw_transformcm:nnnnnn} for driver-level +% manipulation of the canvas axes themselves. +% +% Notice that in contrast to \pkg{pgf} it is possible to give the positions +% of points \emph{directly}. +% +% \subsubsection{Basic point functions} +% +% \begin{function}[EXP]{\draw_point:nn} +% \begin{syntax} +% \cs{draw_point:nn} \Arg{x} \Arg{y} +% \end{syntax} +% Gives the co-ordinates of the point at \meta{x} and \meta{y}, both of +% which are \meta{fp expr}. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_polar:nn, \draw_point_polar:nnn} +% \begin{syntax} +% \cs{draw_point_polar:nn} \Arg{angle} \Arg{radius} +% \cs{draw_point_polar:nnn} \Arg{angle} \Arg{radius-a} \Arg{radius-b} +% \end{syntax} +% Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in +% \emph{degrees}) and \meta{radius}. The three-argument version accepts +% two radii of different lengths. +% +% Note the interface here is somewhat different from that in \pkg{pgf}: +% the one- and two-radii versions in \pkg{l3draw} use separate functions, +% whilst in \pkg{pgf} they use the same function and a keyword. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_add:nn} +% \begin{syntax} +% \cs{draw_point_add:nn} \Arg{point1} \Arg{point2} +% \end{syntax} +% Adds \meta{point1} to \meta{point2}. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_diff:nn} +% \begin{syntax} +% \cs{draw_point_diff:nn} \Arg{point1} \Arg{point2} +% \end{syntax} +% Subtracts \meta{point1} from \meta{point2}. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_scale:nn} +% \begin{syntax} +% \cs{draw_point_scale:nn} \Arg{scale} \Arg{point} +% \end{syntax} +% Scales the \meta{point} by the \meta{scale} (an \meta{fp expr}). +% \end{function} +% +% \begin{function}[EXP]{\draw_point_unit_vector:n} +% \begin{syntax} +% \cs{draw_point_unit_vector:n} \Arg{point} +% \end{syntax} +% Expands to the co-ordinates of a unit vector joining the \meta{point} +% with the origin. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_transform:n} +% \begin{syntax} +% \cs{draw_point_transform:n} \Arg{point} +% \end{syntax} +% Evaluates the position of the \meta{point} subject to the current +% transformation matrix. This operation is applied automatically by +% most higher-level functions (\emph{e.g.}~path manipulations). +% \end{function} +% +% \subsubsection{Points on a vector basis} +% +% As well as giving explicit values, it is possible to describe points +% in terms of underlying direction vectors. The latter are initially +% co-incident with the standard Cartesian axes, but may be altered by +% the user. +% +% \begin{function}{\draw_xvec_set:n, \draw_yvec_set:n, \draw_zvec_set:n} +% \begin{syntax} +% \cs{draw_xvec_set:n} \Arg{point} +% \end{syntax} +% Defines the appropriate base vector to point toward the \meta{point} +% on the canvas. The standard settings for the $x$- and $y$-vectors are +% $1\,\mathrm{cm}$ along the relevant canvas axis, whilst for the +% $z$-vector an appropriate direction is taken. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_vec:nn, \draw_point_vec:nnn} +% \begin{syntax} +% \cs{draw_point_vec:nn} \Arg{xscale} \Arg{yscale} +% \cs{draw_point_vec:nnn} \Arg{xscale} \Arg{yscale} \Arg{zscale} +% \end{syntax} +% Expands to the co-ordinate of the point at \meta{xscale} times the +% $x$-vector and \meta{yscale} times the $y$-vector. The three-argument +% version extends this to include the $z$-vector. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_vec_polar:nn, \draw_point_vec_polar:nnn} +% \begin{syntax} +% \cs{draw_point_vec_polar:nn} \Arg{angle} \Arg{radius} +% \cs{draw_point_vec_polar:nnn} \Arg{angle} \Arg{radius-a} \Arg{radius-b} +% \end{syntax} +% Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in +% \emph{degrees}) and \meta{radius}, relative to the prevailing +% $x$- and $y$-vectors. The three-argument version accepts two radii of +% different lengths. +% +% Note the interface here is somewhat different from that in \pkg{pgf}: +% the one- and two-radii versions in \pkg{l3draw} use separate functions, +% whilst in \pkg{pgf} they use the same function and a keyword. +% \end{function} +% +% \subsubsection{Intersections} +% +% \begin{function}[EXP]{\draw_point_intersect_lines:nnnn} +% \begin{syntax} +% \cs{draw_point_intersect_lines:nnnn} \Arg{point1} \Arg{point2} \Arg{point3} \Arg{point4} +% \end{syntax} +% Evaluates the point at the intersection of one line, joining +% \meta{point1} and \meta{point2}, and a second line joining \meta{point3} +% and \meta{point4}. If the lines do not intersect, or are coincident, and +% error will occur. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_intersect_circles:nnnn} +% \begin{syntax} +% \cs{draw_point_intersect_circles:nnnnn} +% \Arg{center1} \Arg{radius1} \Arg{center2} \Arg{radius2} \Arg{root} +% \end{syntax} +% Evaluates the point at the intersection of one circle with +% \meta{center1} and \meta{radius1}, and a second circle with \meta{center2} +% and \meta{radius2}. If the circles do not intersect, or are coincident, and +% error will occur. +% +% Note the interface here has a different argument ordering from that in +% \pkg{pgf}, which has the two centers then the two radii. +% \end{function} +% +% \subsubsection{Interpolations} +% +% \begin{function}[EXP]{\draw_point_interpolate_line:nnn} +% \begin{syntax} +% \cs{draw_point_interpolate_line:nnn} \Arg{part} \Arg{point1} \Arg{point2} +% \end{syntax} +% Expands to the point which is \meta{part} way along the line joining +% \meta{point1} and \meta{point2}. The \meta{part} may be an interpolation or +% an extrapolation, and is a floating point value expressing a percentage +% along the line, \emph{e.g.}~a value of \texttt{0.5} would be half-way +% between the two points. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_interpolate_distance:nnn} +% \begin{syntax} +% \cs{draw_point_interpolate_distance:nnn} \Arg{distance} \Arg{point expr1} \Arg{point expr2} +% \end{syntax} +% Expands to the point which is \meta{distance} way along the line joining +% \meta{point1} and \meta{point2}. The \meta{distance} may be an interpolation +% or an extrapolation. +% \end{function} +% +% \begin{function}[EXP]{\draw_point_interpolate_curve:nnnnnn} +% \begin{syntax} +% \cs{draw_point_interpolate_curve:nnnnnn} \Arg{part} +% \Arg{start} \Arg{control1} \Arg{control2} \Arg{end} +% \end{syntax} +% Expands to the point which is \meta{part} way along the curve between +% \meta{start} and \meta{end} and defined by \meta{control1} and +% \meta{control2}. The \meta{part} may be an interpolation or +% an extrapolation, and is a floating point value expressing a percentage +% along the curve, \emph{e.g.}~a value of \texttt{0.5} would be half-way +% along the curve. +% \end{function} +% +% \subsection{Paths} +% +% Paths are constructed by combining one or more operations before applying +% one or more actions. Thus until a path is \enquote{used}, it may be +% manipulated or indeed discarded entirely. Only one path is active at +% any one time, and the path is \emph{not} affected by \TeX{} grouping. +% +% \begin{function}{\draw_path_corner_arc:n} +% \begin{syntax} +% \cs{draw_path_corner_arc:n} \Arg{length} +% \end{syntax} +% Sets the degree of rounding applied to corners in a path: if the +% \meta{length} is \texttt{0pt} then no rounding applies. The value of the +% \meta{length} is local to the current \TeX{} group. \emph{At present, +% corner arcs are not activated in the code.} +% \end{function} +% +% \begin{function}{\draw_path_moveto:n} +% \begin{syntax} +% \cs{draw_path_moveto:n} \Arg{point} +% \end{syntax} +% Moves the reference point of the path to the \meta{point}, but will +% not join this to any previous point. +% \end{function} +% +% \begin{function}{\draw_path_lineto:n} +% \begin{syntax} +% \cs{draw_path_lineto:n} \Arg{point} +% \end{syntax} +% Joins the current path to the \meta{point} with a straight line. +% \end{function} +% +% \begin{function}{\draw_path_curveto:nnn} +% \begin{syntax} +% \cs{draw_path_curveto:nnn} \Arg{control1} \Arg{control2} \Arg{end} +% \end{syntax} +% Joins the current path to the \meta{end} with a curved line defined by +% cubic Bézier points \meta{control1} and \meta{control2}. +% \end{function} +% +% \begin{function}{\draw_path_curveto:nn} +% \begin{syntax} +% \cs{draw_path_curveto:nn} \Arg{control} \Arg{end} +% \end{syntax} +% Joins the current path to the \meta{end} with a curved line defined by +% quadratic Bézier point \meta{control}. +% \end{function} +% +% \begin{function}{\draw_path_arc:nnn, \draw_path_arc:nnnn} +% \begin{syntax} +% \cs{draw_path_arc:nnn} \Arg{angle1} \Arg{angle2} \Arg{radius} +% \cs{draw_path_arc:nnnn} \Arg{angle1} \Arg{angle2} \Arg{radius-a} \Arg{radius-b} +% \end{syntax} +% Joins the current path with an arc between \meta{angle1} and \meta{angle2} +% and of \meta{radius}. The four-argument version accepts two radii of +% different lengths. +% +% Note the interface here has a different argument ordering from that in +% \pkg{pgf}, which has the two centers then the two radii. +% \end{function} +% +% \begin{function}{\draw_path_arc_axes:nnnn} +% \begin{syntax} +% \cs{draw_path_arc_axes:nnn} \Arg{angle1} \Arg{angle2} \Arg{vector1} \Arg{vector2} +% \end{syntax} +% Appends the portion of an ellipse from \meta{angle1} to \meta{angle2} of an +% ellipse with axes along \meta{vector1} and \meta{vector2} to the current path. +% \end{function} +% +% \begin{function}{\draw_path_ellipse:nnnn} +% \begin{syntax} +% \cs{draw_path_ellipse:nnn} \Arg{center} \Arg{vector1} \Arg{vector2} +% \end{syntax} +% Appends an ellipse at \meta{center} with axes along \meta{vector1} and +% \meta{vector2} to the current path. +% \end{function} +% +% \begin{function}{\draw_path_circle:nn} +% \begin{syntax} +% \cs{draw_path_circle:nn} \Arg{center} \Arg{radius} +% \end{syntax} +% Appends a circle of \meta{radius} at \meta{center} to the current path. +% \end{function} +% +% \begin{function}{\draw_path_rectangle:nn, \draw_path_rectangle_corners:nn} +% \begin{syntax} +% \cs{draw_path_rectangle:nn} \Arg{lower-left} \Arg{displacement} +% \cs{draw_path_rectangle_corners:nn} \Arg{lower-left} \Arg{top-right} +% \end{syntax} +% Appends a rectangle starting at \meta{lower-left} to the current path, +% with the size of the rectangle determined either by a \meta{displacement} +% or the position of the \meta{top-right}. +% \end{function} +% +% \begin{function}{\draw_path_grid:nnnn} +% \begin{syntax} +% \cs{draw_path_grid:nnnn} \Arg{xspace} \Arg{yspace} \Arg{lower-left} \Arg{upper-right} +% \end{syntax} +% Constructs a grid of \meta{xspace} and \meta{yspace} from the +% \meta{lower-left} to the \meta{upper-right}, and appends this to the +% current path. +% \end{function} +% +% \begin{function}{\draw_path_close:} +% \begin{syntax} +% \cs{draw_path_close:} +% \end{syntax} +% Closes the current part of the path by appending a straight line from +% the current point to the starting point of the path. +% \end{function} +% +% \begin{function}{\draw_path_use:n, \draw_path_use_clear:n} +% \begin{syntax} +% \cs{draw_path_use:n} \Arg{action(s)} +% \end{syntax} +% Inserts the current path, carrying out one ore more possible \meta{actions} +% (a comma list): +% \begin{itemize} +% \item \texttt{clear} Resets the path to empty +% \item \texttt{clip} Clips any content outside of the path +% \item \texttt{draw} +% \item \texttt{fill} Fills the interior of the path with the current +% file color +% \item \texttt{stroke} Draws a line along the current path +% \end{itemize} +% \end{function} +% +% \subsection{Color} +% +% \begin{function}{\draw_color:n, \draw_fill:n, \draw_stroke:n} +% \begin{syntax} +% \cs{draw_color:n} \Arg{color expression} +% \end{syntax} +% Evaluates the \meta{color expression} as described for \pkg{l3color}. +% \end{function} +% +% \subsection{Transformations} +% +% Points are normally used unchanged relative to the canvas axes. This can +% be modified by applying a transformation matrix. The canvas axes themselves +% may be adjusted using \cs{driver_draw_transformcm:nnnnnn}: note that this +% is transparent to the drawing code so is not tracked. +% +% \begin{function}{\draw_transform_reset:} +% \begin{syntax} +% \cs{draw_transform_reset:} +% \end{syntax} +% Resets the matrix to the identity. +% \end{function} +% +% \begin{function}{\draw_transform_concat:nnnnn} +% \begin{syntax} +% \cs{draw_transform_concat:nnnnn} +% \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{vector} +% \end{syntax} +% Appends the given transformation to the currently-active one. The +% transformation is made up of a matrix \meta{a}, \meta{b}, \meta{c} and +% \meta{d}, and a shift by the \meta{vector}. +% \end{function} +% +% \begin{function}{\draw_transform:nnnnn} +% \begin{syntax} +% \cs{draw_transform:nnnnn} +% \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{vector} +% \end{syntax} +% Applies the transformation matrix specified, over-writing any existing +% matrix. The transformation is made up of a matrix \meta{a}, \meta{b}, +% \meta{c} and \meta{d}, and a shift by the \meta{vector}. +% \end{function} +% +% \begin{function}{\draw_transform_triangle:nnn} +% \begin{syntax} +% \cs{draw_transform_triangle:nnn} +% \Arg{origin} \Arg{point1} \Arg{point2} +% \end{syntax} +% Applies a transformation such that the co-ordinates $(0, 0)$, $(1, 0)$ +% and $(0, 1)$ are given by the \meta{origin}, \meta{point1} and +% \meta{point2}, respectively. +% \end{function} +% +% \begin{function}{\draw_transform_invert:} +% \begin{syntax} +% \cs{draw_transform_invert:} +% \end{syntax} +% Inverts the current transformation matrix and reverses the current +% shift vector. +% \end{function} +% +% \end{documentation} +% +% \begin{implementation} +% +% \section{\pkg{l3draw} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=draw> +% \end{macrocode} +% +% \begin{macrocode} +%<*package> +\ProvidesExplPackage{l3draw}{2018/02/21}{} + {L3 Experimental core drawing support} +%</package> +% \end{macrocode} +% +% \begin{macrocode} +\RequirePackage { l3color } +% \end{macrocode} +% +% Everything else is in the sub-files! +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins new file mode 100644 index 00000000000..d7c3616c607 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins @@ -0,0 +1,66 @@ +\iffalse meta-comment + +File l3draw.ins 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 + + http://www.latex-project.org/lppl.txt + +This file is part of the "l3experimental 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. + +----------------------------------------------------------------------- + +Any modification of this file should ensure that the copyright and +license information is placed in the derived files. + +\fi + +\input l3docstrip.tex +\askforoverwritefalse + +\preamble + +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: + + http://www.latex-project.org/lppl.txt + +This file is part of the "l3experimental bundle" (The Work in LPPL) +and all files in that bundle must be distributed together. + +\endpreamble +% stop docstrip adding \endinput +\postamble +\endpostamble + +\keepsilent + +\generate{\file{l3draw.sty} + { + \from{l3draw.dtx} {package} + \from{l3draw-paths.dtx} {package} + \from{l3draw-points.dtx} {package} + \from{l3draw-scopes.dtx} {package} + \from{l3draw-softpath.dtx} {package} + \from{l3draw-state.dtx} {package} + \from{l3draw-transforms.dtx} {package} + } +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx index ed2ae18ad5d..5691eb65ec9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -252,7 +252,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3str-convert}{2017/12/16}{} +\ProvidesExplPackage{l3str-convert}{2018/02/21}{} {L3 Experimental string encoding conversions} % \end{macrocode} % @@ -617,7 +617,7 @@ \cs_new_protected:Npn \@@_if_flag_error:nnx #1 { \flag_if_raised:nTF {#1} - { \__msg_kernel_error:nnx { str } } + { \__kernel_msg_error:nnx { str } } { \use_none:nn } } \cs_new_protected:Npn \@@_if_flag_no_error:nnx #1#2#3 @@ -761,7 +761,7 @@ { \if_meaning:w #1 #5 \tl_if_empty:nF {#3} - { \__msg_kernel_error:nnx { str } { native-escaping } {#3} } + { \__kernel_msg_error:nnx { str } { native-escaping } {#3} } #1 \else: #4 #2 #1 @@ -833,7 +833,7 @@ } { \tl_clear:N \l_@@_internal_tl - \__msg_kernel_error:nnxx { str } { unknown-#2 } {#4} {#1} + \__kernel_msg_error:nnxx { str } { unknown-#2 } {#4} {#1} } } \cs_if_exist:cF { @@_convert_#3_#1: } @@ -1073,7 +1073,7 @@ \@@_output_byte:n {#1} \fi: } - \__msg_kernel_new:nnnn { str } { pdfTeX-native-overflow } + \__kernel_msg_new:nnnn { str } { pdfTeX-native-overflow } { Character~code~too~large~for~pdfTeX. } { The~pdfTeX~engine~only~supports~8-bit~characters:~ @@ -1303,18 +1303,18 @@ % General messages, and messages for the encodings and escapings loaded % by default (\enquote{native}, and \enquote{bytes}). % \begin{macrocode} -\__msg_kernel_new:nnn { str } { unknown-esc } +\__kernel_msg_new:nnn { str } { unknown-esc } { Escaping~scheme~'#1'~(filtered:~'#2')~unknown. } -\__msg_kernel_new:nnn { str } { unknown-enc } +\__kernel_msg_new:nnn { str } { unknown-enc } { Encoding~scheme~'#1'~(filtered:~'#2')~unknown. } -\__msg_kernel_new:nnnn { str } { native-escaping } +\__kernel_msg_new:nnnn { str } { native-escaping } { The~'native'~encoding~scheme~does~not~support~any~escaping. } { Since~native~strings~do~not~consist~in~bytes,~ none~of~the~escaping~methods~make~sense.~ The~specified~escaping,~'#1',~will be ignored. } -\__msg_kernel_new:nnn { str } { file-not-found } +\__kernel_msg_new:nnn { str } { file-not-found } { File~'l3str-#1.def'~not~found. } % \end{macrocode} % @@ -1330,7 +1330,7 @@ \sys_if_engine_xetex_p: } { - \__msg_kernel_new:nnnn { str } { non-byte } + \__kernel_msg_new:nnnn { str } { non-byte } { String~invalid~in~escaping~'#1':~it~may~only~contain~bytes. } { Some~characters~in~the~string~you~asked~to~convert~are~not~ @@ -1348,13 +1348,13 @@ % % Those messages are used when converting to and from 8-bit encodings. % \begin{macrocode} -\__msg_kernel_new:nnnn { str } { decode-8-bit } +\__kernel_msg_new:nnnn { str } { decode-8-bit } { Invalid~string~in~encoding~'#1'. } { LaTeX~came~across~a~byte~which~is~not~defined~to~represent~ any~character~in~the~encoding~'#1'. } -\__msg_kernel_new:nnnn { str } { encode-8-bit } +\__kernel_msg_new:nnnn { str } { encode-8-bit } { Unicode~string~cannot~be~converted~to~encoding~'#1'. } { The~encoding~'#1'~only~contains~a~subset~of~all~Unicode~characters.~ @@ -1435,7 +1435,7 @@ \@@_unescape_hex_auxii:N } } -\__msg_kernel_new:nnnn { str } { unescape-hex } +\__kernel_msg_new:nnnn { str } { unescape-hex } { String~invalid~in~escaping~'hex':~only~hexadecimal~digits~allowed. } { Some~characters~in~the~string~you~asked~to~convert~are~not~ @@ -1512,7 +1512,7 @@ \@@_output_end: \use_i:nnn #3 ##2##3 } - \__msg_kernel_new:nnnn { str } { unescape-#2 } + \__kernel_msg_new:nnnn { str } { unescape-#2 } { String~invalid~in~escaping~'#2'. } { LaTeX~came~across~the~escape~character~'#1'~not~followed~by~ @@ -1641,7 +1641,7 @@ \if_charcode:w ^^J #2 \else: ^^J \fi: \@@_unescape_string_newlines:wN #2 } - \__msg_kernel_new:nnnn { str } { unescape-string } + \__kernel_msg_new:nnnn { str } { unescape-string } { String~invalid~in~escaping~'string'. } { LaTeX~came~across~an~escape~character~'\c_backslash_str'~ @@ -1920,7 +1920,7 @@ \flag_clear_new:n { str_extra } \flag_clear_new:n { str_overlong } \flag_clear_new:n { str_overflow } -\__msg_kernel_new:nnnn { str } { utf8-decode } +\__kernel_msg_new:nnnn { str } { utf8-decode } { Invalid~UTF-8~string: \exp_last_unbraced:Nf \use_none:n \@@_if_flag_times:nT { str_missing } { ,~missing~continuation~byte } @@ -2237,14 +2237,14 @@ \flag_clear_new:n { str_missing } \flag_clear_new:n { str_extra } \flag_clear_new:n { str_end } - \__msg_kernel_new:nnnn { str } { utf16-encode } + \__kernel_msg_new:nnnn { str } { utf16-encode } { Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. } { Surrogate~code~points~(in~the~range~[U+D800,~U+DFFF])~ can~be~expressed~in~the~UTF-8~and~UTF-32~encodings,~ but~not~in~the~UTF-16~encoding. } - \__msg_kernel_new:nnnn { str } { utf16-decode } + \__kernel_msg_new:nnnn { str } { utf16-decode } { Invalid~UTF-16~string: \exp_last_unbraced:Nf \use_none:n \@@_if_flag_times:nT { str_missing } { ,~missing~trail~surrogate } @@ -2536,7 +2536,7 @@ % \begin{macrocode} \flag_clear_new:n { str_overflow } \flag_clear_new:n { str_end } - \__msg_kernel_new:nnnn { str } { utf32-decode } + \__kernel_msg_new:nnnn { str } { utf32-decode } { Invalid~UTF-32~string: \exp_last_unbraced:Nf \use_none:n \@@_if_flag_times:nT { str_overflow } { ,~code~point~too~large } diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx index 75413e2def3..14f6874216c 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -163,7 +163,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3str-format}{2017/12/16}{} +\ProvidesExplPackage{l3str-format}{2018/02/21}{} {L3 Experimental string formatting} %</package> % \end{macrocode} @@ -304,7 +304,7 @@ \cs_new:Npn \@@_parse_end:nwn #1 #2 \s__stop \s__stop #3 { \tl_if_empty:nF {#2} - { \__msg_kernel_expandable_error:nnn { str } { invalid-format } {#3} } + { \__kernel_msg_expandable_error:nnn { str } { invalid-format } {#3} } #1 } % \end{macrocode} @@ -464,7 +464,7 @@ { \token_if_eq_charcode:NNTF #2 = { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-align-format } {#2} {tl} \@@_put:nw { #1 < } } @@ -475,7 +475,7 @@ } \token_if_eq_charcode:NNF #3 ? { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-sign-format } {#3} {tl} } \@@_put:nw { {#4} } @@ -486,7 +486,7 @@ { \token_if_eq_charcode:NNF #6 ? { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-style-format } {#6} {tl} } } @@ -640,7 +640,7 @@ \@@_put:nw { {#4} } \tl_if_empty:nF {#5} { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-precision-format } {#5} {int} } \str_case:nnF {#6} @@ -652,7 +652,7 @@ { X } { \@@_int:NwnnNNn \int_to_Hex:n } } { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-style-format } {#6} { int } \@@_int:NwnnNNn \use:n } @@ -762,7 +762,7 @@ { ? } { \@@_fp:wnnnNNw \@@_fp_g:wn } } { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-style-format } {#6} { fp } \@@_fp:wnnnNNw \@@_fp_g:wn } @@ -927,15 +927,15 @@ % All of the messages are produced expandably, so there is no need for % an extra-text. % \begin{macrocode} -\__msg_kernel_new:nnn { str } { invalid-format } +\__kernel_msg_new:nnn { str } { invalid-format } { Invalid~format~'#1'. } -\__msg_kernel_new:nnn { str } { invalid-align-format } +\__kernel_msg_new:nnn { str } { invalid-align-format } { Invalid~alignment~'#1'~for~type~'#2'. } -\__msg_kernel_new:nnn { str } { invalid-sign-format } +\__kernel_msg_new:nnn { str } { invalid-sign-format } { Invalid~sign~'#1'~for~type~'#2'. } -\__msg_kernel_new:nnn { str } { invalid-precision-format } +\__kernel_msg_new:nnn { str } { invalid-precision-format } { Invalid~precision~'#1'~for~type~'#2'. } -\__msg_kernel_new:nnn { str } { invalid-style-format } +\__kernel_msg_new:nnn { str } { invalid-style-format } { Invalid~style~'#1'~for~type~'#2'. } % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx index 9e1e0141cc5..dd801e51ae0 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx @@ -54,7 +54,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -673,7 +673,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xcoffins}{2017/12/16}{} +\ProvidesExplPackage{xcoffins}{2018/02/21}{} {L3 Experimental design level coffins} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index b114d9f7f8d..7533b90e087 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -24,8 +24,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}[2017/12/16] -%<package>\@ifpackagelater{expl3}{2017/12/16} +\RequirePackage{expl3}[2018/02/21] +%<package>\@ifpackagelater{expl3}{2018/02/21} %<package> {} %<package> {% %<package> \PackageError{l3galley}{Support package l3kernel too old} @@ -59,7 +59,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -685,7 +685,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3galley}{2017/12/16}{} +\ProvidesExplPackage{l3galley}{2018/02/21}{} {L3 Experimental galley code} %</package> % \end{macrocode} @@ -2157,7 +2157,7 @@ \cs_new_protected:Npn \galley_break_line:Nn #1#2 { \mode_if_vertical:TF - { \__msg_kernel_error:nn { galley } { no-line-to-end } } + { \__kernel_msg_error:nn { galley } { no-line-to-end } } { \tex_unskip:D \bool_if:NF #1 @@ -2490,7 +2490,7 @@ % \subsection{Messages} % % \begin{macrocode} -\__msg_kernel_new:nnn { galley } { no-line-to-end } +\__kernel_msg_new:nnn { galley } { no-line-to-end } { There's~no~line~here~to~end. } % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx index 5e6ff4615ea..d0e62a385c5 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx @@ -45,7 +45,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -732,7 +732,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xgalley}{2017/12/16}{} +\ProvidesExplPackage{xgalley}{2018/02/21}{} {L3 Experimental galley} \RequirePackage{xparse,xtemplate,l3galley} % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 21436da3cfb..67af1e5da46 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -21,7 +21,7 @@ % for those people who are interested. % %<*driver|generic|package> -\def\ExplFileDate{2017/12/16}% +\def\ExplFileDate{2018/02/21}% %</driver|generic|package> %<*driver> \documentclass[full]{l3doc} @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1297,7 +1297,7 @@ % foo}). The checks on driver choice are set up here, so when actually % the driver it's a straight forward operation. % \begin{macrocode} -\__msg_kernel_new:nnnn { expl } { wrong-driver } +\__kernel_msg_new:nnnn { expl } { wrong-driver } { Driver~request~inconsistent~with~engine:~using~'#2'~driver. } { You~have~requested~driver~'#1',~but~this~is~not~suitable~for~use~with~the~ @@ -1331,14 +1331,14 @@ \tl_set:Nn \l__expl_driver_tl { dvipdfmx } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvipdfmx } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:T { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvipdfmx } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } @@ -1349,14 +1349,14 @@ \tl_set:Nn \l__expl_driver_tl { dvips } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:T { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } @@ -1367,14 +1367,14 @@ \tl_set:Nn \l__expl_driver_tl { dvisvgm } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:T { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } @@ -1387,14 +1387,14 @@ \tl_set:Nn \l__expl_driver_tl { pdfmode } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { pdfmode } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:F { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { pdfmode } { dvips } \tl_set:Nn \l__expl_driver_tl { dvips } } @@ -1407,12 +1407,12 @@ { \sys_if_output_pdf:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { xdvipdfmx } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { xdvipdfmx } { dvips } \tl_set:Nn \l__expl_driver_tl { dvips } } @@ -1454,7 +1454,7 @@ \str_if_eq:VnTF \l__expl_driver_tl { latex2e } { \tl_gput_left:Nn \@begindocumenthook { \RequirePackage { graphics } } - \__msg_kernel_new:nnnn { box } { clipping-not-available } + \__kernel_msg_new:nnnn { box } { clipping-not-available } { Box~clipping~not~available. } { The~\box_clip:N~function~is~only~available~when~loading~expl3~ @@ -1463,7 +1463,7 @@ \cs_set_protected:Npn \box_clip:N #1 { \hbox_set:Nn #1 { \box_use:N #1 } - \__msg_kernel_error:nn { box } { clipping-not-available } + \__kernel_msg_error:nn { box } { clipping-not-available } } \cs_set_protected:Npn \box_rotate:Nn #1#2 { \hbox_set:Nn #1 { \rotatebox {#2} { \box_use:N #1 } } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins index 29f65550cee..e2db89df344 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3.ins +++ b/Master/texmf-dist/source/latex/l3kernel/l3.ins @@ -1,6 +1,6 @@ \iffalse meta-comment -File l3.ins Copyright (C) 2011,2012,2014-2017 The LaTeX3 Project +File l3.ins Copyright (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 @@ -33,7 +33,7 @@ license information is placed in the derived files. \preamble -Copyright (C) 1990-2017 The LaTeX3 Project +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 @@ -83,6 +83,7 @@ and all files in that bundle must be distributed together. \from{l3fp-traps.dtx} {package} \from{l3fp-round.dtx} {package} \from{l3fp-parse.dtx} {package} + \from{l3fp-assign.dtx} {package} \from{l3fp-logic.dtx} {package} \from{l3fp-basics.dtx} {package} \from{l3fp-extended.dtx}{package} @@ -90,14 +91,13 @@ and all files in that bundle must be distributed together. \from{l3fp-trig.dtx} {package} \from{l3fp-convert.dtx} {package} \from{l3fp-random.dtx} {package} - \from{l3fp-assign.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{l3coffins.dtx} {package} - \from{l3color.dtx} {package} + \from{l3color-base.dtx} {package} \from{l3sys.dtx} {package} \from{l3deprecation.dtx}{package} \from{l3candidates.dtx} {package} @@ -131,7 +131,6 @@ and all files in that bundle must be distributed together. \generate{\file{l3candidates.sty} {\from{l3oldmodules.dtx} {l3candidates,oldmodules}}} \generate{\file{l3clist.sty} {\from{l3oldmodules.dtx} {l3clist,oldmodules}}} \generate{\file{l3coffins.sty} {\from{l3oldmodules.dtx} {l3coffins,oldmodules}}} -\generate{\file{l3color.sty} {\from{l3oldmodules.dtx} {l3color,oldmodules}}} \generate{\file{l3expan.sty} {\from{l3oldmodules.dtx} {l3expan,oldmodules}}} \generate{\file{l3file.sty} {\from{l3oldmodules.dtx} {l3file,oldmodules}}} \generate{\file{l3fp.sty} {\from{l3oldmodules.dtx} {l3fp,oldmodules}}} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index 6079cba8274..3edc736eeb9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -175,7 +175,7 @@ \int_use:c { g_@@_ #1 _int } } } - { \__msg_kernel_fatal:nnx { kernel } { out-of-registers } {#1} } + { \__kernel_msg_fatal:nnx { kernel } { out-of-registers } {#1} } } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index cff05458c4d..7b2b8bb3948 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3basics.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3basics.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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -737,6 +737,7 @@ % \cs{cs_if_exist_use:NTF} \meta{control sequence} \Arg{true code} \Arg{false code} % \end{syntax} % Tests whether the \meta{control sequence} is currently defined +% according to the conditional \cs{cs_if_exist:NTF} % (whether as a function or another control sequence type), and if it % is inserts the \meta{control sequence} into the input stream followed % by the \meta{true code}. Otherwise the \meta{false code} is used. @@ -1051,8 +1052,8 @@ % \end{syntax} % Tests whether the \meta{control sequence} is currently defined % (whether as a function or another control sequence type). Any -% valid definition of \meta{control sequence} evaluates as -% \texttt{true}. +% definition of \meta{control sequence} other than \tn{relax} +% evaluates as \texttt{true}. % \end{function} % % \begin{function}[EXP,pTF]{\cs_if_free:N, \cs_if_free:c} @@ -1212,9 +1213,9 @@ % normally (spaces, characters with category other). % \end{function} % -% \begin{function}{\__debug:TF} +% \begin{function}{\__kernel_debug:TF} % \begin{syntax} -% \cs{__debug:TF} \Arg{true code} \Arg{false code} +% \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 @@ -1224,18 +1225,18 @@ % conditional. % \end{function} % -% \begin{function}{\__debug_chk_cs_exist:N, \__debug_chk_cs_exist:c} +% \begin{function}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c} % \begin{syntax} -% \cs{__debug_chk_cs_exist:N} \meta{cs} +% \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}{\__debug_chk_expr:nNnN} +% \begin{function}{\__kernel_chk_expr:nNnN} % \begin{syntax} -% \cs{__debug_chk_expr:nNnN} \Arg{expr} \meta{eval} \Arg{convert} \meta{caller} +% \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 @@ -1250,18 +1251,18 @@ % purposes. % \end{function} % -% \begin{function}{\__debug_chk_var_exist:N} +% \begin{function}{\__kernel_chk_var_exist:N} % \begin{syntax} -% \cs{__debug_chk_var_exist:N} \meta{var} +% \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}{\__debug_chk_var_scope:NN} +% \begin{function}{\__kernel_chk_var_scope:NN} % \begin{syntax} -% \cs{__debug_chk_var_scope:NN} \meta{scope} \meta{var} +% \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 @@ -1276,19 +1277,19 @@ % different scopes a kernel error will result. % \end{function} % -% \begin{function}{\__debug_chk_var_local:N, \__debug_chk_var_global:N} +% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N} % \begin{syntax} -% \cs{__debug_chk_var_local:N} \meta{var} -% \cs{__debug_chk_var_global:N} \meta{var} +% \cs{__kernel_chk_var_local:N} \meta{var} +% \cs{__kernel_chk_var_global:N} \meta{var} % \end{syntax} -% Applies \cs{__debug_chk_var_exist:N} \meta{var}, then -% \cs{__debug_chk_var_scope:NN} \meta{scope} \meta{var}, where +% 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}{\__debug_log:x} +% \begin{function}{\__kernel_debug_log:x} % \begin{syntax} -% \cs{__debug_log:x} \Arg{message text} +% \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}. @@ -1296,9 +1297,9 @@ % This function is only created if debugging is enabled. % \end{function} % -% \begin{function}{\__debug_patch:nnNNpn} +% \begin{function}{\__kernel_patch:nnNNpn} % \begin{syntax} -% \cs{__debug_patch:nnNNpn} \Arg{before} \Arg{after} +% \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} @@ -1311,24 +1312,24 @@ % needed. % \end{function} % -% \begin{function}{\__debug_patch_conditional:nNNpnn} +% \begin{function}{\__kernel_patch_conditional:nNNpnn} % \begin{syntax} -% \cs{__debug_patch_conditional:nNNpnn} \Arg{before} +% \cs{__kernel_patch_conditional:nNNpnn} \Arg{before} % \meta{definition} \meta{conditional} \meta{parameters} \Arg{type} \Arg{code} % \end{syntax} -% Similar to \cs{__debug_patch:nnNNpn} for conditionals, namely +% 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} -% {\__debug_patch_args:nNNpn, \__debug_patch_conditional_args:nNNpnn} +% {\__kernel_patch_args:nNNpn, \__kernel_patch_conditional_args:nNNpnn} % \begin{syntax} -% \cs{__debug_patch_args:nNNpn} \Arg{arguments} +% \cs{__kernel_patch_args:nNNpn} \Arg{arguments} % \meta{definition} \meta{function} \meta{parameters} \Arg{code} % \end{syntax} -% Like \cs{__debug_patch:nnNNpn}, this tweaks the following +% 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 @@ -1338,25 +1339,25 @@ % front of the \meta{arguments} is used instead of the \meta{code} % when defining the actual function. For instance, % \begin{quote} -% \cs{__debug_patch_args:nNNpn} |{ { (#1) } }| \\ +% \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{__debug_patch_conditional_args:nNNpnn} function is for use +% 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} -% {\__debug_patch_args:nnnNNpn, \__debug_patch_conditional_args:nnnNNpnn} +% {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn} % \begin{syntax} -% \cs{__debug_patch_args:nnnNNpn} \Arg{before} \Arg{after} \Arg{arguments} +% \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{__debug_patch:nnNNpn} and -% \cs{__debug_patch_args:nNNpn}. +% A combination of \cs{__kernel_patch:nnNNpn} and +% \cs{__kernel_patch_args:nNNpn}. % \end{function} % % \begin{function}{\__kernel_check_defined:NT} @@ -1781,7 +1782,7 @@ %<@@=debug> % \end{macrocode} % -% \begin{macro}{\@@:TF} +% \begin{macro}{\__kernel_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 @@ -1789,10 +1790,10 @@ % options \texttt{enable-debug}, \texttt{log-functions} or % \texttt{check-declarations} was given. % \begin{macrocode} -\cs_set_protected:Npn \@@:TF #1#2 {#2} +\cs_set_protected:Npn \__kernel_debug:TF #1#2 {#2} %<*package> \tex_ifodd:D \l@expl@enable@debug@bool - \cs_set_protected:Npn \@@:TF #1#2 {#1} + \cs_set_protected:Npn \__kernel_debug:TF #1#2 {#1} \fi: %</package> % \end{macrocode} @@ -1801,34 +1802,34 @@ % \begin{macro}{\debug_on:n, \debug_off:n} % % \begin{macrocode} -\@@:TF +\__kernel_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 { @@_##1_on: } - { \__msg_kernel_error:nnn { kernel } { debug } {##1} } + \cs_if_exist_use:cF { __debug_##1_on: } + { \__kernel_msg_error:nnn { kernel } { debug } {##1} } } } \cs_set_protected:Npn \debug_off:n #1 { \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} } { - \cs_if_exist_use:cF { @@_##1_off: } - { \__msg_kernel_error:nnn { kernel } { debug } {##1} } + \cs_if_exist_use:cF { __debug_##1_off: } + { \__kernel_msg_error:nnn { kernel } { debug } {##1} } } } } { \cs_set_protected:Npn \debug_on:n #1 { - \__msg_kernel_error:nnx { kernel } { enable-debug } + \__kernel_msg_error:nnx { kernel } { enable-debug } { \tl_to_str:n { \debug_on:n {#1} } } } \cs_set_protected:Npn \debug_off:n #1 { - \__msg_kernel_error:nnx { kernel } { enable-debug } + \__kernel_msg_error:nnx { kernel } { enable-debug } { \tl_to_str:n { \debug_off:n {#1} } } } } @@ -1836,32 +1837,32 @@ % \end{macro} % % \begin{macro}{\debug_suspend:, \debug_resume:} -% \begin{macro}{\@@_suspended:T} -% \begin{macro}{\l_@@_suspended_tl} +% \begin{macro}{\__debug_suspended:T} +% \begin{macro}{\l__debug_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{@@_suspended:T}. +% \enquote{non-suspended} version of \cs{__debug_suspended:T}. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \cs_set_nopar:Npn \l_@@_suspended_tl { } + \cs_set_nopar:Npn \l__debug_suspended_tl { } \cs_set_protected:Npn \debug_suspend: { - \tl_put_right:Nn \l_@@_suspended_tl { . } - \cs_set_eq:NN \@@_suspended:T \use:n + \tl_put_right:Nn \l__debug_suspended_tl { . } + \cs_set_eq:NN \__debug_suspended:T \use:n } \cs_set_protected:Npn \debug_resume: { - \tl_set:Nx \l_@@_suspended_tl - { \tl_tail:N \l_@@_suspended_tl } - \tl_if_empty:NT \l_@@_suspended_tl + \tl_set:Nx \l__debug_suspended_tl + { \tl_tail:N \l__debug_suspended_tl } + \tl_if_empty:NT \l__debug_suspended_tl { - \cs_set_eq:NN \@@_suspended:T \use_none:n + \cs_set_eq:NN \__debug_suspended:T \use_none:n } } - \cs_set:Npn \@@_suspended:T #1 { } + \cs_set:Npn \__debug_suspended:T #1 { } } { \cs_set_protected:Npn \debug_suspend: { } @@ -1873,76 +1874,76 @@ % \end{macro} % % \begin{macro} -% {\@@_check-declarations_on:, \@@_check-declarations_off:} -% \begin{macro}{\@@_chk_var_exist:N} -% \begin{macro}{\@@_chk_cs_exist:N, \@@_chk_cs_exist:c} -% \begin{macro}{\@@_chk_var_local:N, \@@_chk_var_global:N} -% \begin{macro}{\@@_chk_var_scope:NN} +% {\__debug_check-declarations_on:, \__debug_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} +% \begin{macro}{\__kernel_chk_var_scope:NN} % When debugging is enabled these two functions set up functions that % test their argument (when \texttt{check-declarations} is active) % \begin{itemize} -% \item \cs{@@_chk_var_exist:N} and \cs{@@_chk_cs_exist:N}, two +% \item \cs{__kernel_chk_var_exist:N} and \cs{__kernel_chk_cs_exist:N}, two % functions that test that their argument is defined; -% \item \cs{@@_chk_var_scope:NN} that checks that its argument |#2| +% \item \cs{__kernel_chk_var_scope:NN} that checks that its argument |#2| % has scope |#1|. -% \item \cs{@@_chk_var_local:N} and \cs{@@_chk_var_global:N} that +% \item \cs{__kernel_chk_var_local:N} and \cs{__kernel_chk_var_global:N} that % perform both checks. % \end{itemize} % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \exp_args:Nc \cs_set_protected:Npn { @@_check-declarations_on: } + \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: } { - \cs_set_protected:Npn \@@_chk_var_exist:N ##1 + \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { - \@@_suspended:T \use_none:nnn + \__debug_suspended:T \use_none:nnn \cs_if_exist:NF ##1 { - \__msg_kernel_error:nnx { kernel } { non-declared-variable } + \__kernel_msg_error:nnx { kernel } { non-declared-variable } { \token_to_str:N ##1 } } } - \cs_set_protected:Npn \@@_chk_cs_exist:N ##1 + \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { - \@@_suspended:T \use_none:nnn + \__debug_suspended:T \use_none:nnn \cs_if_exist:NF ##1 { - \__msg_kernel_error:nnx { kernel } { command-not-defined } + \__kernel_msg_error:nnx { kernel } { command-not-defined } { \token_to_str:N ##1 } } } - \cs_set_protected:Npn \@@_chk_var_scope:NN + \cs_set_protected:Npn \__kernel_chk_var_scope:NN { - \@@_suspended:T \use_none:nnn - \@@_chk_var_scope_aux:NN + \__debug_suspended:T \use_none:nnn + \__debug_chk_var_scope_aux:NN } - \cs_set_protected:Npn \@@_chk_var_local:N ##1 + \cs_set_protected:Npn \__kernel_chk_var_local:N ##1 { - \@@_suspended:T \use_none:nnnnn - \@@_chk_var_exist:N ##1 - \@@_chk_var_scope_aux:NN l ##1 + \__debug_suspended:T \use_none:nnnnn + \__kernel_chk_var_exist:N ##1 + \__debug_chk_var_scope_aux:NN l ##1 } - \cs_set_protected:Npn \@@_chk_var_global:N ##1 + \cs_set_protected:Npn \__kernel_chk_var_global:N ##1 { - \@@_suspended:T \use_none:nnnnn - \@@_chk_var_exist:N ##1 - \@@_chk_var_scope_aux:NN g ##1 + \__debug_suspended:T \use_none:nnnnn + \__kernel_chk_var_exist:N ##1 + \__debug_chk_var_scope_aux:NN g ##1 } } - \exp_args:Nc \cs_set_protected:Npn { @@_check-declarations_off: } + \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: } { - \cs_set_protected:Npn \@@_chk_var_exist:N ##1 { } - \cs_set_protected:Npn \@@_chk_cs_exist:N ##1 { } - \cs_set_protected:Npn \@@_chk_var_local:N ##1 { } - \cs_set_protected:Npn \@@_chk_var_global:N ##1 { } - \cs_set_protected:Npn \@@_chk_var_scope:NN ##1##2 { } + \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_var_local:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_var_global:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_var_scope:NN ##1##2 { } } - \cs_set_protected:Npn \@@_chk_cs_exist:c - { \exp_args:Nc \@@_chk_cs_exist:N } + \cs_set_protected:Npn \__kernel_chk_cs_exist:c + { \exp_args:Nc \__kernel_chk_cs_exist:N } \tex_ifodd:D \l@expl@check@declarations@bool - \use:c { @@_check-declarations_on: } + \use:c { __debug_check-declarations_on: } \else: - \use:c { @@_check-declarations_off: } + \use:c { __debug_check-declarations_off: } \fi: } { } @@ -1953,13 +1954,13 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\@@_chk_var_scope_aux:NN} -% \begin{macro}{\@@_chk_var_scope_aux:Nn} -% \begin{macro}{\@@_chk_var_scope_aux:NNn} +% \begin{macro}{\__debug_chk_var_scope_aux:NN} +% \begin{macro}{\__debug_chk_var_scope_aux:Nn} +% \begin{macro}{\__debug_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{@@_chk_var_scope_aux:NNn}. That function compares the two +% \cs{__debug_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 @@ -1969,30 +1970,30 @@ % letter \meta{scope} according to what the first assignment to the % given variable was. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \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 + \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 { \if:w _ \use_i:nn \use_i_delimit_by_q_stop:nw #2 ? ? \q_stop - \exp_after:wN \@@_chk_var_scope_aux:NNn + \exp_after:wN \__debug_chk_var_scope_aux:NNn \use_i_delimit_by_q_stop:nw #2 ? \q_stop #1 {#2} \else: - \exp_args:Nc \@@_chk_var_scope_aux:NNn - { @@_chk_/ #2 } + \exp_args:Nc \__debug_chk_var_scope_aux:NNn + { __debug_chk_/ #2 } #1 {#2} \fi: } - \cs_set_protected:Npn \@@_chk_var_scope_aux:NNn #1#2#3 + \cs_set_protected:Npn \__debug_chk_var_scope_aux:NNn #1#2#3 { \if:w #1 #2 \else: \if:w #1 \scan_stop: \cs_gset_nopar:Npn #1 {#2} \else: - \__msg_kernel_error:nnxxx { kernel } { local-global } + \__kernel_msg_error:nnxxx { kernel } { local-global } {#1} {#2} { \iow_char:N \\ #3 } \fi: \fi: @@ -2005,11 +2006,11 @@ % \end{macro} % % \begin{macro} -% {\@@_check-expressions_on:, \@@_check-expressions_off:} -% \begin{macro}{\@@_chk_expr:nNnN} -% \begin{macro}{\@@_chk_expr_aux:nNnN} +% {\__debug_check-expressions_on:, \__debug_check-expressions_off:} +% \begin{macro}{\__kernel_chk_expr:nNnN} +% \begin{macro}{\__debug_chk_expr_aux:nNnN} % When debugging is enabled these two functions set -% \cs{@@_chk_expr:nNnN} to test or not whether the given +% \cs{__kernel_chk_expr:nNnN} to test or not whether the given % expression is valid. The idea is to evaluate the expression within % a brace group (to catch trailing \cs{use_none:nn} or similar), then % test that the result is what we expect. This is done by turning it @@ -2027,22 +2028,22 @@ % |1+2\relax+3| would incorrectly be accepted as a valid integer % expression. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \exp_args:Nc \cs_set_protected:Npn { @@_check-expressions_on: } + \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: } { - \cs_set:Npn \@@_chk_expr:nNnN ##1##2 + \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2 { - \@@_suspended:T { ##1 \use_none:nnnnnnn } - \exp_after:wN \@@_chk_expr_aux:nNnN + \__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 } ##2 } } - \exp_args:Nc \cs_set_protected:Npn { @@_check-expressions_off: } - { \cs_set:Npn \@@_chk_expr:nNnN ##1##2##3##4 {##1} } - \use:c { @@_check-expressions_off: } - \cs_set:Npn \@@_chk_expr_aux:nNnN #1#2#3#4 + \exp_args:Nc \cs_set_protected:Npn { __debug_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 { \tl_if_empty:oF { @@ -2051,7 +2052,7 @@ \__int_value:w #3 #2 #1 \tex_relax:D } { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { expr } {#4} {#1} } #1 @@ -2063,29 +2064,29 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\@@_log-functions_on:, \@@_log-functions_off:} -% \begin{macro}{\@@_log:x} +% \begin{macro}{\__debug_log-functions_on:, \__debug_log-functions_off:} +% \begin{macro}{\__kernel_debug_log:x} % These two functions (corresponding to the \pkg{expl3} option -% \texttt{log-functions}) control whether \cs{@@_log:x} writes to the +% \texttt{log-functions}) control whether \cs{__kernel_debug_log:x} writes to the % log file or not. Since \cs{iow_log:x} does not yet have its final % definition we do not use \cs{cs_set_eq:NN} (not defined yet anyway). % Once everything is defined, turn logging on or off depending on what % option was given. When debugging is not enabled, simply produce an % error. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \exp_args:Nc \cs_set_protected:Npn { @@_log-functions_on: } + \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: } { - \cs_set_protected:Npn \@@_log:x - { \@@_suspended:T \use_none:nn \iow_log:x } + \cs_set_protected:Npn \__kernel_debug_log:x + { \__debug_suspended:T \use_none:nn \iow_log:x } } - \exp_args:Nc \cs_set_protected:Npn { @@_log-functions_off: } - { \cs_set_protected:Npn \@@_log:x { \use_none:n } } + \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: } + { \cs_set_protected:Npn \__kernel_debug_log:x { \use_none:n } } \tex_ifodd:D \l@expl@log@functions@bool - \use:c { @@_log-functions_on: } + \use:c { __debug_log-functions_on: } \else: - \use:c { @@_log-functions_off: } + \use:c { __debug_log-functions_off: } \fi: } { } @@ -2093,33 +2094,42 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\@@_deprecation_on:, \@@_deprecation_off:} -% \begin{variable}{\g_@@_deprecation_on_tl, \g_@@_deprecation_off_tl} +% \begin{macro}{\__debug_deprecation_on:, \__debug_deprecation_off:} +% \begin{macro}{\__kernel_deprecation_code:nn} +% \begin{variable}{\g__debug_deprecation_on_tl, \g__debug_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{@@_deprecation:nnNNpn} in each module. +% \cs{__kernel_patch_deprecation:nnNNpn} in each module. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \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 \__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 \__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} + } + } + { + \cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2 { } } - { } % \end{macrocode} % \end{variable} % \end{macro} +% \end{macro} % -% \begin{macro}{\@@_deprecation:nnNNpn} -% \begin{macro}{\@@_deprecation_aux:nnNnn} +% \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_@@_deprecation_on_tl} some code that makes the +% Add to \cs{g__debug_deprecation_on_tl} some code that makes the % defined macro |#3| outer (and defines it as an error). Add to -% \cs{g_@@_deprecation_off_tl} the definition itself. In both +% \cs{g__debug_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 @@ -2127,35 +2137,35 @@ % 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. -% If debugging is disabled, \cs{@@_deprecation:nnNNpn} lets the +% If debugging is disabled, \cs{__kernel_patch_deprecation:nnNNpn} lets the % definition happen. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \cs_set_protected:Npn \@@_deprecation:nnNNpn #1#2#3#4#5# + \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5# { \if_meaning:w \cs_new_protected:Npn #3 \else: - \__msg_kernel_error:nnx { kernel } { debug-unpatchable } + \__kernel_msg_error:nnx { kernel } { debug-unpatchable } { \token_to_str:N #3 ~(for~deprecation) } \fi: - \@@_deprecation_aux:nnNnn {#1} {#2} #4 {#5} + \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5} } - \cs_set_protected:Npn \@@_deprecation_aux:nnNnn #1#2#3#4#5 + \cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5 { - \tl_gput_right:Nn \g_@@_deprecation_on_tl + \tl_gput_right:Nn \g__debug_deprecation_on_tl { \tex_let:D #3 \scan_stop: \__deprecation_error:Nnn #3 {#2} {#1} } - \tl_gput_right:Nn \g_@@_deprecation_off_tl + \tl_gput_right:Nn \g__debug_deprecation_off_tl { \tex_let:D #3 \scan_stop: \cs_set_protected:Npn #3 #4 {#5} } \cs_new_protected:Npx #3 { - \exp_not:N \__msg_kernel_warning:nnxxx + \exp_not:N \__kernel_msg_warning:nnxxx { kernel } { deprecated-command } {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} } \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} } @@ -2163,87 +2173,87 @@ } } } - { \cs_set_protected:Npn \@@_deprecation:nnNNpn #1#2 { } } + { \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2 { } } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro} -% {\@@_patch:nnNNpn, \@@_patch_conditional:nNNpnn} +% {\__kernel_patch:nnNNpn, \__kernel_patch_conditional:nNNpnn} % \begin{macro} -% {\@@_patch_aux:nnnn, \@@_patch_auxii:nnnn} -% When debugging is not enabled, \cs{@@_patch:nnNNpn} and -% \cs{@@_patch_conditional:nNNpnn} throw the patch away. +% {\__debug_patch_aux:nnnn, \__debug_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 % \cs{prg_new_conditional:Npnn} (or similar), respectively. In each % case, grab the name of the function to be defined and its parameters % then insert tokens before and/or after the definition. % \begin{macrocode} -\@@:TF +\__kernel_debug:TF { - \cs_set_protected:Npn \@@_patch:nnNNpn #1#2#3#4#5# - { \@@_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } } - \cs_set_protected:Npn \@@_patch_conditional:nNNpnn #1#2#3#4# - { \@@_patch_auxii:nnnn {#1} { #2 #3 #4 } } - \cs_set_protected:Npn \@@_patch_aux:nnnn #1#2#3#4 + \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2#3#4#5# + { \__debug_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 { #3 { #1 #4 #2 } } - \cs_set_protected:Npn \@@_patch_auxii:nnnn #1#2#3#4 + \cs_set_protected:Npn \__debug_patch_auxii:nnnn #1#2#3#4 { #2 {#3} { #1 #4 } } } { - \cs_set_protected:Npn \@@_patch:nnNNpn #1#2 { } - \cs_set_protected:Npn \@@_patch_conditional:nNNpnn #1 { } + \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2 { } + \cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1 { } } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro} -% {\@@_patch_args:nNNpn, \@@_patch_conditional_args:nNNpnn} +% {\__kernel_patch_args:nNNpn, \__kernel_patch_conditional_args:nNNpnn} % \begin{macro} -% {\@@_patch_args:nnnNNpn, \@@_patch_conditional_args:nnnNNpnn} +% {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn} % \begin{macro} % { -% \@@_tmp:w, -% \@@_patch_args_aux:nnnNNnn, -% \@@_patch_args_aux:nnnNNnnn, -% \@@_patch_args_aux:nnnn +% \__debug_tmp:w, +% \__debug_patch_args_aux:nnnNNnn, +% \__debug_patch_args_aux:nnnNNnnn, +% \__debug_patch_args_aux:nnnn % } -% See \cs{@@_patch:nnNNpn}. The first argument is something like +% See \cs{__kernel_patch:nnNNpn}. The first argument is something like % |{#1}{(#2)}|. Define a temporary macro using the \meta{parameters} % and \meta{code} of the definition that follows, then expand that % temporary macro in front of the first argument to obtain new % \meta{code}. Then perform the definition as if that new \meta{code} % was directly typed in the file. % \begin{macrocode} -\cs_set_protected:Npn \@@_patch_args:nNNpn - { \@@_patch_args:nnnNNpn { } { } } -\cs_set_protected:Npn \@@_patch_conditional_args:nNNpnn - { \@@_patch_conditional_args:nnnNNpnn { } { } } -\@@:TF +\cs_set_protected:Npn \__kernel_patch_args:nNNpn + { \__kernel_patch_args:nnnNNpn { } { } } +\cs_set_protected:Npn \__kernel_patch_conditional_args:nNNpnn + { \__kernel_patch_conditional_args:nnnNNpnn { } { } } +\__kernel_debug:TF { - \cs_set_protected:Npn \@@_patch_args:nnnNNpn #1#2#3#4#5#6# - { \@@_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} } - \cs_set_protected:Npn \@@_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_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 { - \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: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_protected:Npn \@@_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8 + \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8 { - \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: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_protected:Npn \@@_patch_args_aux:nnnn #1#2#3#4 + \cs_set_protected:Npn \__debug_patch_args_aux:nnnn #1#2#3#4 { #2 { #3 #1 #4 } } } { - \cs_set_protected:Npn \@@_patch_args:nnnNNpn #1#2#3 { } - \cs_set_protected:Npn \@@_patch_conditional_args:nnnNNpnn #1#2#3 { } + \cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3 { } + \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3 { } } % \end{macrocode} % \end{macro} @@ -2376,7 +2386,7 @@ { \@@_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} } { \tl_count:n {#2} } { - \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments } + \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments } { \token_to_str:c { #1 : #2 } } { \tl_count:n {#2} } \use_none:nn @@ -2405,7 +2415,7 @@ \cs_set_protected:Npn \@@_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none:nn \fi: @@ -2434,7 +2444,7 @@ \use:c { @@_generate_ #7 _form:wnnnnnn } \tl_if_empty:nF {#7} { - \__msg_kernel_error:nnxx + \__kernel_msg_error:nnxx { kernel } { conditional-form-unknown } {#7} { \token_to_str:c { #3 : #4 } } } @@ -2476,7 +2486,7 @@ { #7 \exp_end: \c_true_bool \c_false_bool } } { - \__msg_kernel_error:nnx { kernel } { protected-predicate } + \__kernel_msg_error:nnx { kernel } { protected-predicate } { \token_to_str:c { #4 _p: #5 } } } } @@ -2556,12 +2566,12 @@ \cs_set_protected:Npn \@@_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \if_meaning:w \c_false_bool #6 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#4} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: @@ -2575,7 +2585,7 @@ \use:c { @@_set_eq_conditional_ #6 _form:wNnnnn } \tl_if_empty:nF {#6} { - \__msg_kernel_error:nnxx + \__kernel_msg_error:nnxx { kernel } { conditional-form-unknown } {#6} { \token_to_str:c { #1 : #2 } } } @@ -2584,20 +2594,20 @@ #5 {#1} {#2} {#3} {#4} \@@_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5 } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 _p : #6 } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 _p : #6 } } { } \cs_set:Npn \@@_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 _p : #4 } { #5 _p : #6 } } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 : #6 TF } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 : #6 TF } } { } \cs_set:Npn \@@_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 TF } { #5 : #6 TF } } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 : #6 T } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 : #6 T } } { } \cs_set:Npn \@@_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 T } { #5 : #6 T } } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 : #6 F } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 : #6 F } } { } \cs_set:Npn \@@_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 F } { #5 : #6 F } } % \end{macrocode} @@ -2880,14 +2890,14 @@ % only temporary, they will be redefined later on. % % \begin{macro} -% {\__msg_kernel_error:nnxx, \__msg_kernel_error:nnx, \__msg_kernel_error:nn} +% {\__kernel_msg_error:nnxx, \__kernel_msg_error:nnx, \__kernel_msg_error:nn} % If an internal error occurs before \LaTeX3 has loaded \pkg{l3msg} then % the code should issue a usable if terse error message and halt. This % can only happen if a coding error is made by the team, so this is % a reasonable response. Setting the \tn{newlinechar} is needed, to % turn |^^J| into a proper line break in plain \TeX{}. % \begin{macrocode} -\cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4 +\cs_set_protected:Npn \__kernel_msg_error:nnxx #1#2#3#4 { \tex_newlinechar:D = `\^^J \tex_relax:D \tex_errmessage:D @@ -2900,10 +2910,10 @@ } \tex_end:D } -\cs_set_protected:Npn \__msg_kernel_error:nnx #1#2#3 - { \__msg_kernel_error:nnxx {#1} {#2} {#3} { } } -\cs_set_protected:Npn \__msg_kernel_error:nn #1#2 - { \__msg_kernel_error:nnxx {#1} {#2} { } { } } +\cs_set_protected:Npn \__kernel_msg_error:nnx #1#2#3 + { \__kernel_msg_error:nnxx {#1} {#2} {#3} { } } +\cs_set_protected:Npn \__kernel_msg_error:nn #1#2 + { \__kernel_msg_error:nnxx {#1} {#2} { } { } } % \end{macrocode} % \end{macro} % @@ -2936,13 +2946,13 @@ % issued. We have to make sure we don't put the argument into the % conditional processing since it may be an |\if...| type function! % \begin{macrocode} -\__debug_patch:nnNNpn { } - { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } } +\__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 { \cs_if_free:NF #1 { - \__msg_kernel_error:nnxx { kernel } { command-already-defined } + \__kernel_msg_error:nnxx { kernel } { command-already-defined } { \token_to_str:N #1 } { \token_to_meaning:N #1 } } } @@ -3238,7 +3248,7 @@ { \@@_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3} { - \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments } + \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments } { \token_to_str:N #1 } { \int_eval:n {#3} } \use_none:n } @@ -3314,14 +3324,14 @@ \str_if_eq_x:nnF { } { \tl_map_function:nN {#2} \@@_generate_from_signature:n } { - \__msg_kernel_error:nnx { kernel } { non-base-function } + \__kernel_msg_error:nnx { kernel } { non-base-function } { \token_to_str:N #5 } } \cs_generate_from_arg_count:NNnn #5 #4 { \tl_count:n {#2} } {#6} } { - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:N #5 } } } @@ -3452,7 +3462,7 @@ \cs_if_exist:NTF #1 {#2} { - \__msg_kernel_error:nnx { kernel } { variable-not-defined } + \__kernel_msg_error:nnx { kernel } { variable-not-defined } { \token_to_str:N #1 } } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index e6262cbd3e8..f4c05b9ab39 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -138,7 +138,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -562,12 +562,6 @@ \global\lccode23 = 23 % \endgroup \fi -% \end{macrocode} -% In all cases it makes sense to set up |-| to map to itself: this allows -% hyphenation of the rest of a word following it (suggested by -% Lars Helstr\"om). -% \begin{macrocode} -\global\lccode`\- = `\- % %</initex> % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index fcba0ecaa6f..d214f8551e0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project +%% File: l3box.dtx Copyright (C) 2005-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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -901,10 +901,10 @@ % \testfile* % Assigning the contents of a box to be another box. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_eq:NN #1#2 { \tex_setbox:D #1 \tex_copy:D #2 } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_eq:NN #1#2 { \tex_global:D \tex_setbox:D #1 \tex_copy:D #2 } \cs_generate_variant:Nn \box_set_eq:NN { c , Nc , cc } @@ -928,10 +928,10 @@ % Assigning the contents of a box to be another box. % This clears the second box globally (that's how \TeX{} does it). % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_eq_clear:NN #1#2 { \tex_setbox:D #1 \tex_box:D #2 } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_eq_clear:NN #1#2 { \tex_global:D \tex_setbox:D #1 \tex_box:D #2 } \cs_generate_variant:Nn \box_set_eq_clear:NN { c , Nc , cc } @@ -1078,10 +1078,10 @@ % \testfile* % Set a box to the previous box. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_to_last:N #1 { \tex_setbox:D #1 \tex_lastbox:D } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_to_last:N #1 { \tex_global:D \tex_setbox:D #1 \tex_lastbox:D } \cs_generate_variant:Nn \box_set_to_last:N { c } @@ -1175,7 +1175,7 @@ \group_end: } { - \__msg_kernel_error:nnx { kernel } { variable-not-defined } + \__kernel_msg_error:nnx { kernel } { variable-not-defined } { \token_to_str:N #2 } } } @@ -1198,10 +1198,10 @@ % \begin{macro}{\hbox_gset:Nn, \hbox_gset:cn} % \testfile* % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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 { \group_begin: #2 \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } } \cs_generate_variant:Nn \hbox_set:Nn { c } @@ -1216,13 +1216,13 @@ % Storing material in a horizontal box with a specified width. % Again, put the dimension expression in parentheses when debugging. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} { \group_begin: #3 \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -1241,14 +1241,14 @@ % Storing material in a horizontal box. This type is useful in % environment definitions. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \hbox_set:Nw #1 { \tex_setbox:D #1 \tex_hbox:D \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset:Nw #1 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D @@ -1272,14 +1272,14 @@ % \begin{macro}{\hbox_gset_to_wd:Nnw, \hbox_gset_to_wd:cnw} % Combining the above ideas. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -1376,13 +1376,13 @@ % \testfile* % Storing material in a vertical box with a natural height. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set:Nn #1#2 { \tex_setbox:D #1 \tex_vbox:D { \group_begin: #2 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D @@ -1400,13 +1400,13 @@ % Storing material in a vertical box with a natural height and reference % point at the baseline of the first object in the box. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set_top:Nn #1#2 { \tex_setbox:D #1 \tex_vtop:D { \group_begin: #2 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset_top:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vtop:D @@ -1423,13 +1423,13 @@ % \testfile* % Storing material in a vertical box with a specified height. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} { \group_begin: #3 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -1448,14 +1448,14 @@ % Storing material in a vertical box. This type is useful in % environment definitions. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set:Nw #1 { \tex_setbox:D #1 \tex_vbox:D \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset:Nw #1 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D @@ -1480,14 +1480,14 @@ % \begin{macro}{\vbox_gset_to_ht:Nnw, \vbox_gset_to_ht:cnw} % A combination of the above ideas. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -1517,7 +1517,7 @@ % \testfile* % Splitting a vertical box in two. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} } % \end{macrocode} @@ -2063,19 +2063,19 @@ % \begin{macro}[deprecated = 2018-12-31]{\box_resize:Nnn, \box_resize:cnn} % \begin{macro}[deprecated = 2018-12-31]{\box_use_clear:N, \box_use_clear:c} % \begin{macrocode} -\__debug_deprecation:nnNNpn +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn } \cs_new_protected:Npn \box_resize:Nnn { \box_resize_to_wd_and_ht_plus_dp:Nnn } -\__debug_deprecation:nnNNpn +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn } \cs_new_protected:Npn \box_resize:cnn { \box_resize_to_wd_and_ht_plus_dp:cnn } -\__debug_deprecation:nnNNpn - { 2018-12-31 } { \box_use_clear:N } +\__kernel_patch_deprecation:nnNNpn + { 2018-12-31 } { \box_use_drop:N } \cs_new_protected:Npn \box_use_clear:N { \box_use_drop:N } -\__debug_deprecation:nnNNpn - { 2018-12-31 } { \box_use_clear:c } +\__kernel_patch_deprecation:nnNNpn + { 2018-12-31 } { \box_use_drop:c } \cs_new_protected:Npn \box_use_clear:c { \box_use_drop:c } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index e7539a4bec2..e8d226189ac 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project +%% File: l3candidates.dtx Copyright (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 @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1825,13 +1825,13 @@ \cs_set_protected:Npn \@@_get_details:nnN #1#2#3 { \tl_clear:N #3 - \__msg_kernel_error:nnx + \__kernel_msg_error:nnx { kernel } { xetex-primitive-not-available } { \exp_not:c { pdffile #2 } } } } } -\__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available } +\__kernel_msg_new:nnnn { kernel } { xetex-primitive-not-available } { Primitive~\token_to_str:N #1 not~available } { XeTeX~does~not~currently~provide~functionality~equivalent~to~the~ @@ -1865,7 +1865,7 @@ % \begin{macro}[deprecated = 2017-12-31]{\file_if_exist_input:nT, \file_if_exist_input:nTF} % For removal after 2017-12-31. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2017-12-31 } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \file_if_exist:nTF and~ \file_input:n } \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3 { @@ -1873,7 +1873,7 @@ \str_if_empty:NTF \l_@@_full_name_str {#3} { #2 \@@_input:V \l_@@_full_name_str } } -\__debug_deprecation:nnNNpn { 2017-12-31 } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \file_if_exist:nT and~ \file_input:n } \cs_new_protected:Npn \file_if_exist_input:nT #1#2 { @@ -1918,10 +1918,10 @@ % \begin{macrocode} \cs_if_exist:NTF \pdftex_uniformdeviate:D { - \__debug_patch_args:nNNpn + \__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_rand:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_rand:nn } + { \__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 { @@ -1933,7 +1933,7 @@ { \int_compare:nNnTF {#1} > {#2} { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { backward-range } {#1} {#2} \@@_rand:ww #2; #1; } @@ -1968,7 +1968,7 @@ { \cs_new:Npn \int_rand:nn #1#2 { - \__msg_kernel_expandable_error:nn { kernel } { fp-no-random } + \__kernel_msg_expandable_error:nn { kernel } { fp-no-random } \int_eval:n {#1} } } @@ -1980,7 +1980,7 @@ % \begin{macrocode} \cs_if_exist:NT \pdftex_uniformdeviate:D { - \__msg_kernel_new:nnn { kernel } { backward-range } + \__kernel_msg_new:nnn { kernel } { backward-range } { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. } } % \end{macrocode} @@ -2094,7 +2094,7 @@ % \begin{macro}[added = 2017-11-28]{\bool_const:Nn, \bool_const:cn} % A merger between \cs{tl_const:Nn} and \cs{bool_set:Nn}. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__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 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index f0ee5ad54b5..431df952a3c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1696,7 +1696,7 @@ } } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index 3f45836f0d6..db42fb4981b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -479,7 +479,7 @@ \coffin_if_exist:NTF #1 { #2 } { - \__msg_kernel_error:nnx { kernel } { unknown-coffin } + \__kernel_msg_error:nnx { kernel } { unknown-coffin } { \token_to_str:N #1 } } } @@ -735,7 +735,7 @@ \prop_get:cnNF { l_@@_poles_ \__int_value:w #1 _prop } {#2} #3 { - \__msg_kernel_error:nnxx { kernel } { unknown-coffin-pole } + \__kernel_msg_error:nnxx { kernel } { unknown-coffin-pole } {#2} { \token_to_str:N #1 } \tl_set:Nn #3 { { 0pt } { 0pt } { 0pt } { 0pt } } } @@ -901,7 +901,7 @@ \l_@@_pole_a_tl \l_@@_pole_b_tl \bool_if:NT \l_@@_error_bool { - \__msg_kernel_error:nn { kernel } { no-pole-intersection } + \__kernel_msg_error:nn { kernel } { no-pole-intersection } \dim_zero:N \l_@@_x_dim \dim_zero:N \l_@@_y_dim } @@ -1695,7 +1695,7 @@ % \subsection{Messages} % % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { no-pole-intersection } +\__kernel_msg_new:nnnn { kernel } { no-pole-intersection } { No~intersection~between~coffin~poles. } { \c__msg_coding_error_text_tl @@ -1703,17 +1703,17 @@ but~they~do~not~have~a~unique~meeting~point:~ the~value~(0~pt,~0~pt)~will~be~used. } -\__msg_kernel_new:nnnn { kernel } { unknown-coffin } +\__kernel_msg_new:nnnn { kernel } { unknown-coffin } { Unknown~coffin~'#1'. } { The~coffin~'#1'~was~never~defined. } -\__msg_kernel_new:nnnn { kernel } { unknown-coffin-pole } +\__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. } -\__msg_kernel_new:nnn { kernel } { show-coffin } +\__kernel_msg_new:nnn { kernel } { show-coffin } { Size~of~coffin~#1 : #2 \\ Poles~of~coffin~#1 : #3 . diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index 9ed12f0f551..b3e88c1a7ee 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3color.dtx Copyright(C) 2011,2012,2014,2016,2017 The LaTeX3 Project +%% File: l3color-base.dtx Copyright(C) 2011,2012,2014,2016-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 \textsf{l3color} package\\ Color support^^A +% The \textsf{l3color-base} package\\ Color support^^A % } % % \author{^^A @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -79,7 +79,7 @@ % \subsection{Internal functions} % % \begin{variable}[added = 2017-06-15, updated = 2017-10-02] -% {\l__color_current_tl} +% {\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 % values. There are four pre-defined models, three of which take numerical @@ -102,7 +102,7 @@ % number of data entries these require will depend on the number of % colors to be mixed. % \begin{texnote} -% The content of \cs{l__color_current_tl} is space-separated as +% The content of \cs{l_@@_current_tl} is space-separated as % this allows it to be used directly in specials in many common cases. % This internal representation is close to that used by the \texttt{dvips} % program. @@ -113,12 +113,16 @@ % % \begin{implementation} % -% \section{\pkg{l3color} 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 @@ -140,23 +144,49 @@ \cs_new_protected:Npn \color_ensure_current: { %<*package> - \__driver_color_pickup:N \l__color_current_tl + \driver_color_pickup:N \l_@@_current_tl %</package> - \__driver_color_select:V \l__color_current_tl - \group_insert_after:N \__driver_color_reset: + \@@_select:V \l_@@_current_tl + \group_insert_after:N \driver_color_reset: } % \end{macrocode} % \end{macro} % -% \begin{variable}{\l__color_current_tl} +% \begin{macro}{\@@_select:n, \@@_select:V} +% \begin{macro}{\@@_select:w} +% \begin{macro} +% {\@@_select_cmyk:w, \@@_select_gray:w, \@@_select_rgb:w, \@@_select_spot:w} +% Take an internal color specification and pass it to the driver. This code +% is needed to ensure the current color but will also be used by the +% higher-level experimental material. +% \begin{macrocode} +\cs_new_protected:Npn \@@_select:n #1 + { \@@_select:w #1 \q_stop } +\cs_generate_variant:Nn \@@_select:n { V } +\cs_new_protected:Npn \@@_select:w #1 ~ #2 \q_stop + { \use:c { @@_select_ #1 :w } #2 \q_stop } +\cs_new_protected:Npn \@@_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop + { \driver_color_cmyk:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \@@_select_gray:w #1 \q_stop + { \driver_color_gray:n {#1} } +\cs_new_protected:Npn \@@_select_rgb:w #1 ~ #2 ~ #3 \q_stop + { \driver_color_rgb:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \@@_select_spot:w #1 ~ #2 \q_stop + { \driver_color_spot:nn {#1} {#2} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{variable}{\l_@@_current_tl} % As the setting data is used only % for specials, and those are always space-separated, it makes most sense to % hold the internal information in that form. Any splitting is done by a % delimited function but often the entire \texttt{tl} can be used as-is: % see \texttt{l3drivers.dtx}. % \begin{macrocode} -\tl_new:N \l__color_current_tl -\tl_set:Nn \l__color_current_tl { gray~0 } +\tl_new:N \l_@@_current_tl +\tl_set:Nn \l_@@_current_tl { gray~0 } % \end{macrocode} % \end{variable} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index c4bfa10758a..1ab74d3b67b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3deprecation.dtx (C) Copyright 2017 The LaTeX3 Project +%% File: l3deprecation.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -75,10 +75,10 @@ { \etex_protected:D \tex_outer:D \tex_edef:D #1 { - \exp_not:N \__msg_kernel_expandable_error:nnnnn + \exp_not:N \__kernel_msg_expandable_error:nnnnn { kernel } { deprecated-command } { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} } - \exp_not:N \__msg_kernel_error:nnxxx + \exp_not:N \__kernel_msg_error:nnxxx { kernel } { deprecated-command } { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} } } @@ -120,20 +120,15 @@ % This is left-over from \pkg{l3expan}. It cannot be done there because % \pkg{l3tl} is not loaded at that time. % \begin{macrocode} -\__debug:TF +\__kernel_deprecation_code:nn { - \tl_gput_right:Nn \g__debug_deprecation_on_tl - { - \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx - { \__msg_kernel_error:nnxxxx } - } - \tl_gput_right:Nn \g__debug_deprecation_off_tl - { - \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx - { \__msg_kernel_warning:nnxxxx } - } + \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx + { \__kernel_msg_error:nnxxxx } + } + { + \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx + { \__kernel_msg_warning:nnxxxx } } - { } % \end{macrocode} % % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 7f600a15642..4341ff018a1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3doc.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 @@ -70,14 +70,14 @@ and all files in that bundle must be distributed together. % This isn't included in the typeset documentation because it's a bit % ugly: %<*class> -\ProvidesExplClass{l3doc}{2017/12/16}{} +\ProvidesExplClass{l3doc}{2018/02/21}{} {L3 Experimental documentation class} %</class> % \fi % % \title{The \cls{l3doc} class} % \author{\Team} -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % \maketitle % \tableofcontents % @@ -949,7 +949,7 @@ and all files in that bundle must be distributed together. \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT { o } \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF { o } \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF { V } -\cs_generate_variant:Nn \tl_if_in:nnTF { no } +\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo } \cs_generate_variant:Nn \tl_if_in:NnTF { No } \cs_generate_variant:Nn \tl_if_in:NnT { No } \cs_generate_variant:Nn \tl_if_in:NnF { No } @@ -995,6 +995,22 @@ and all files in that bundle must be distributed together. % \end{macrocode} % \end{macro} % +% \begin{macro}[TF]{\@@_str_if_begin:nn, \@@_str_if_begin:oo} +% True if the first string starts with the second. +% \begin{macrocode} +\prg_new_protected_conditional:Npnn \@@_str_if_begin:nn #1#2 { TF , T , F } + { + \tl_if_in:ooTF + { \exp_after:wN \scan_stop: \tl_to_str:n {#1} } + { \exp_after:wN \scan_stop: \tl_to_str:n {#2} } + { \prg_return_true: } + { \prg_return_false: } + } +\prg_generate_conditional_variant:Nnn \@@_str_if_begin:nn + { oo } { TF , T , F } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_replace_at_at:N} % \begin{macro}{\@@_replace_at_at_aux:Nn} % The goal is to replace |@@| by the current module name. We take @@ -1035,14 +1051,16 @@ and all files in that bundle must be distributed together. % \end{macro} % \end{macro} % -% \begin{macro}{\@@_detect_internals:N} +% \begin{macro}{\@@_detect_internals: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 -% sequence (for the warning message), then remove anything after any -% |_| or |:| (with either catcode) to get the module name. If that -% name is not empty and differs from the current |@@| name then -% complain. +% sequence (for the warning message). Then check if that starts with +% something allowed: |@@| module name and |:| or |_|, or if the +% relevant boolean is set |kernel_| (it seems safe to assume we will +% not define a |\__kernel:...| command). For the message itself +% remove anything after any |_| or |:| (with either catcode) to get a +% guess of the module name. % \begin{macrocode} \group_begin: \char_set_catcode_active:N \^^M @@ -1057,32 +1075,38 @@ and all files in that bundle must be distributed together. \@@_trim_right:No \l_@@_detect_internals_tl \c_catcode_active_space_tl \@@_trim_right:Nn \l_@@_detect_internals_tl ^^M - \tl_set_eq:NN \l_@@_detect_internals_cs_tl \l_@@_detect_internals_tl - \@@_trim_right:Nn \l_@@_detect_internals_tl _ - \@@_trim_right:Nn \l_@@_detect_internals_tl : - \@@_trim_right:No \l_@@_detect_internals_tl { \token_to_str:N : } - \tl_if_empty:NF \l_@@_detect_internals_tl + \@@_if_detect_internals_ok:NF \l_@@_detect_internals_tl { - \str_if_eq:NNF \l_@@_detect_internals_tl \g_@@_module_name_tl - { - \bool_lazy_and:nnF - { \g_@@_kernel_bool } - { - \str_if_eq_x_p:nn - { \tl_to_str:N \l_@@_detect_internals_tl } - { kernel } - } - { - \msg_warning:nnxxx { l3doc } { foreign-internal } - { \tl_to_str:N \l_@@_detect_internals_cs_tl } - { \tl_to_str:N \l_@@_detect_internals_tl } - { \tl_to_str:N \g_@@_module_name_tl } - } - } + \tl_set_eq:NN \l_@@_detect_internals_cs_tl \l_@@_detect_internals_tl + \@@_trim_right:Nn \l_@@_detect_internals_tl _ + \@@_trim_right:Nn \l_@@_detect_internals_tl : + \@@_trim_right:No \l_@@_detect_internals_tl { \token_to_str:N : } + \msg_warning:nnxxx { l3doc } { foreign-internal } + { \tl_to_str:N \l_@@_detect_internals_cs_tl } + { \tl_to_str:N \l_@@_detect_internals_tl } + { \tl_to_str:N \g_@@_module_name_tl } } } } \group_end: +\prg_new_protected_conditional:Npnn \@@_if_detect_internals_ok:N #1 { F } + { + \@@_str_if_begin:ooTF {#1} { \g_@@_module_name_tl _ } + { \prg_return_true: } + { + \@@_str_if_begin:ooTF {#1} { \g_@@_module_name_tl : } + { \prg_return_true: } + { + \bool_if:NTF \g_@@_kernel_bool + { + \@@_str_if_begin:ooTF {#1} { kernel _ } + { \prg_return_true: } + { \prg_return_false: } + } + { \prg_return_false: } + } + } + } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index d11bd14e7f9..5295a5553fd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -61,7 +61,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx index 5ccd56959c7..8b5aa7d53c1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx @@ -22,10 +22,6 @@ % %<*driver> \documentclass[full,kernel]{l3doc} -%</driver> -%<*driver|package> -%</driver|package> -%<*driver> \begin{document} \DocInput{\jobname.dtx} \end{document} @@ -45,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -126,20 +122,50 @@ % % \section{Color support} % -% \begin{function}[added = 2017-10-25] -% {\__driver_color_select:n, \__driver_color_select:V} +% \begin{function}[added = 2018-02-20]{\driver_color_cmyk:nnnn} +% \begin{syntax} +% \cs{driver_color_cmyk:nnnn} \Arg{cyan} \Arg{magenta} \Arg{yellow} +% \Arg{black} +% \end{syntax} +% Sets the color to the CMYK values specified, all of which are +% fp denotations in the range $0$ and $1$. For drawing colors, see +% \cs{driver_draw_color_cmyk:nnnn}, \emph{etc.} +% \end{function} +% +% \begin{function}[added = 2018-02-20]{\driver_color_gray:n} +% \begin{syntax} +% \cs{driver_color_gray:n} \Arg{gray} +% \end{syntax} +% Sets the color to the grayscale value specified, which is +% fp denotations in the range $0$ and $1$. For drawing colors, see +% \cs{driver_draw_color_gray:n}, \emph{etc.} +% \end{function} +% +% \begin{function}[added = 2018-02-20]{\driver_color_rgb:nnn} % \begin{syntax} -% \cs{__driver_color_select:n} \Arg{color} +% \cs{driver_color_rgb:nnn} \Arg{red} \Arg{green} \Arg{blue} % \end{syntax} -% Selects the \meta{color} (which is given in low-level format: a -% \meta{model} followed by a space and one or more space-separated -% axes). +% Sets the color to the RGB values specified, all of which are +% fp denotations in the range $0$ and $1$. For drawing colors, see +% \cs{driver_draw_color_rgb:nnn}, \emph{etc.} % \end{function} % -% \begin{function}[added = 2017-10-25] -% {\__driver_color_pickup:N} +% \begin{function}[added = 2018-02-20]{\driver_color_reset:} % \begin{syntax} -% \cs{__driver_color_pickup:N} \meta{tl} +% \cs{driver_color_reset:} +% \end{syntax} +% Resets the active color to that before a call to +% \cs{driver_color_\meta{model}:n(nnn)}. This function should be inserted +% after the \TeX{} group setting a color, \emph{i.e.}~normally +% \begin{verbatim} +% % Use of \driver_color_rgb:nnn, etc. +% \group_insert_after:N \driver_color_reset: +% \end{verbatim} +% \end{function} +% +% \begin{function}[added = 2018-02-20]{\driver_color_pickup:N} +% \begin{syntax} +% \cs{driver_color_pickup:N} \meta{tl} % \end{syntax} % In \LaTeXe{} package mode, collects data on the current color from % \tn{current@color} and stores it in the low-level format used by \pkg{expl3} @@ -383,11 +409,11 @@ % \driver_draw_stroke_cmyk:nnnn % } % \begin{syntax} -% \cs{driver_draw_color_cmyk:nnnn} \Arg{cyan} \Arg{magneta} \Arg{yellow} +% \cs{driver_draw_color_cmyk:nnnn} \Arg{cyan} \Arg{magenta} \Arg{yellow} % \Arg{black} % \end{syntax} % Sets the color for drawing to the CMYK values specified, all of which are -% fp expressions which should evaluate to between $0$ and $1$. The +% fp denotations in the range $0$ and $1$. The % \texttt{fill} and \texttt{stroke} versions set only the color for those % operations. Note that the general setting is more efficient with some % drivers so should in most cases be preferred. @@ -403,7 +429,7 @@ % \cs{driver_draw_color_gray:n} \Arg{gray} % \end{syntax} % Sets the color for drawing to the grayscale value specified, which is -% fp expressions which should evaluate to between $0$ and $1$. The +% fp denotations in the range $0$ and $1$. The % \texttt{fill} and \texttt{stroke} versions set only the color for those % operations. Note that the general setting is more efficient with some % drivers so should in most cases be preferred. @@ -419,7 +445,7 @@ % \cs{driver_draw_color_rgb:nnn} \Arg{red} \Arg{green} \Arg{blue} % \end{syntax} % Sets the color for drawing to the RGB values specified, all of which are -% fp expressions which should evaluate to between $0$ and $1$. The +% fp denotations in the range $0$ and $1$. The % \texttt{fill} and \texttt{stroke} versions set only the color for those % operations. Note that the general setting is more efficient with some % drivers so should in most cases be preferred. @@ -521,18 +547,19 @@ %<*dvisvgm|dvipdfmx|dvips|xdvipdfmx> % \end{macrocode} % -% \begin{macro}{\@@_color_pickup:N} +% \begin{macro}{\driver_color_pickup:N} +% \begin{macro}{\@@_color_pickup:w} % Allow for \LaTeXe{} color. Here, the possible input values are limited: % \texttt{dvips}-style colors can mainly be taken as-is with the exception % spot ones (here we need a model and a tint). % \begin{macrocode} %<*package> -\cs_new_protected:Npn \@@_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \@@_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { \exp_args:NV \tl_if_head_is_space:nTF \current@color { @@ -542,9 +569,9 @@ \exp_after:wN \use:n \current@color \c_space_tl 1 } } - { \exp_after:wN \@@_color_pickup_aux:w \current@color \q_stop #1 } + { \exp_after:wN \@@_color_pickup:w \current@color \q_stop #1 } } - \cs_new_protected:Npn \@@_color_pickup_aux:w #1 ~ #2 \q_stop #3 + \cs_new_protected:Npn \@@_color_pickup:w #1 ~ #2 \q_stop #3 { \tl_set:Nn #3 { #1 ~ #2 } } } { } @@ -552,36 +579,27 @@ %</package> % \end{macrocode} % \end{macro} +% \end{macro} % -% \begin{macro}{\@@_color_select:n, \@@_color_select:V} -% \begin{macro}[EXP]{\@@_convert_model:w} -% \begin{macro}[EXP]{\@@_color_convert_spot:} -% \begin{macro}[EXP]{\@@_color_convert_spot:w} -% \begin{macro}{\@@_color_reset:} -% Mainly no conversation but a little work with \texttt{spot} colors as they -% can't have a tint level here! The easy route of just picking up -% \texttt{spot} as a model won't work as there could be additional models -% created for mixing named colors. (They would not be supported at the moment, -% but still need to be handled.) +% \begin{macro}{\driver_color_cmyk:nnnn} +% \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}{\driver_color_reset:} +% Simply dump the data. % \begin{macrocode} +\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4 + { \@@_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \@@_color_select:n { gray~ #1 } } +\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3 + { \@@_color_select:n { rgb~ #1 ~ #2 ~ #3 } } +\cs_new_protected:Npn \driver_color_spot:nn #1#2 + { \@@_color_select:n { color~push~\c_space_tl #1 } } \cs_new_protected:Npn \@@_color_select:n #1 - { - \tex_special:D - { - color~push~ - \cs_if_exist_use:cF - { @@_color_convert_ \@@_convert_model:w #1 \q_stop :n } - { \use:n } - {#1} - } - } -\cs_generate_variant:Nn \@@_color_select:n { V } -\cs_new:Npn \@@_convert_model:w #1 ~ #2 \q_stop {#1} -\cs_new:Npn \@@_color_convert_spot:n #1 - { \@@_color_convert_spot:w #1 \q_stop } -\cs_new:Npn \@@_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop - { \c_space_tl #2 } -\cs_new_protected:Npn \@@_color_reset: + { \tex_special:D { color~push~ #1 } } +\cs_new_protected:Npn \driver_color_reset: { \tex_special:D { color~pop } } % \end{macrocode} % \end{macro} @@ -589,6 +607,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macrocode} %</dvisvgm|dvipdfmx|dvips|xdvipdfmx> @@ -600,27 +619,27 @@ %<*pdfmode> % \end{macrocode} % -% \begin{macro}{\@@_color_pickup:N} -% \begin{macro}{\@@_color_pickup_aux:w} +% \begin{macro}{\driver_color_pickup:N} +% \begin{macro}{\@@_color_pickup:w} % The current color in driver-dependent format: pick up the package-mode % data if available. We end up converting back and forward in this route as % we store our color data in \texttt{dvips} format. % The \tn{current@color} needs to be \texttt{x}-expanded before -% \cs{@@_color_pickup_aux:w} breaks it apart, because for instance +% \cs{@@_color_pickup:w} breaks it apart, because for instance % \pkg{xcolor} sets it to be instructions to generate a colour % \begin{macrocode} %<*package> -\cs_new_protected:Npn \@@_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \@@_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { - \exp_last_unbraced:Nx \@@_color_pickup_aux:w + \exp_last_unbraced:Nx \@@_color_pickup:w { \current@color } ~ 0 ~ 0 ~ 0 \q_stop #1 } - \cs_new_protected:Npn \@@_color_pickup_aux:w + \cs_new_protected:Npn \@@_color_pickup:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop #7 { \str_if_eq:nnTF {#2} { g } @@ -659,47 +678,30 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}{\@@_color_select:n, \@@_color_select:V} -% \begin{macro}[EXP]{\@@_color_convert:w} -% \begin{macro}[EXP] -% { -% \@@_color_convert_gray:w , -% \@@_color_convert_cmyk:w , -% \@@_color_convert_rgb:w , -% \@@_color_convert_spot:w -% } -% \begin{macro}{\@@_color_reset:} -% There is a dedicated primitive/primitive interface for setting colors. -% As with scoping, this approach is not suitable for cached operations. -% Most of the conversions are trivial but the need to cover spot colors -% makes life slightly more interesting. -% \begin{macrocode} +% \begin{macro}{\driver_color_cmyk:nnnn} +% \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}{\driver_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 } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \@@_color_select:n { #1 ~ g ~ #1 ~ G } } +\cs_new_protected:Npn \driver_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 } } \cs_new_protected:Npx \@@_color_select:n #1 { \cs_if_exist:NTF \luatex_pdfextension:D { \luatex_pdfextension:D colorstack } { \pdftex_pdfcolorstack:D } - \exp_not:N \l_@@_color_stack_int push - { - \exp_not:N \@@_color_convert:w - #1 - \exp_not:N \q_stop - } - } -\cs_generate_variant:Nn \@@_color_select:n { V } -\cs_new:Npn \@@_color_convert:w #1 ~ #2 \q_stop - { \use:c { @@_color_convert_ #1 :w } #2 \q_stop } -\cs_new:Npn \@@_color_convert_gray:w #1 \q_stop - { #1 ~ g ~ #1 ~ G } -\cs_new:Npn \@@_color_convert_cmyk:w #1 \q_stop - { #1 ~ k ~ #1 ~ K } -\cs_new:Npn \@@_color_convert_rgb:w #1 \q_stop - { #1 ~ rg ~ #1 ~ RG } -\cs_new:Npn \@@_color_convert_spot:w #1 ~ #2 \q_stop - { - /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC + \exp_not:N \l_@@_color_stack_int push {#1} } -\cs_new_protected:Npx \@@_color_reset: +\cs_new_protected:Npx \driver_color_reset: { \cs_if_exist:NTF \luatex_pdfextension:D { \luatex_pdfextension:D colorstack } @@ -711,6 +713,8 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} % % \begin{macrocode} %</pdfmode> @@ -1107,7 +1111,7 @@ { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \@@_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } } + { \@@_draw_literal:n { #1 ~ setmiterlimit } } \cs_new_protected:Npn \driver_draw_cap_butt: { \@@_draw_literal:n { 0 ~ setlinecap } } \cs_new_protected:Npn \driver_draw_cap_round: @@ -1158,81 +1162,42 @@ } \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4 { - \@@_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - setcmykcolor ~ - } + \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor } \@@_draw_color_reset: } \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4 { - \@@_draw_literal:x - { - /l3fc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - setcmykcolor - } ~ - def - } + \@@_draw_literal:n + { /l3fc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def } } \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4 { - \@@_draw_literal:x - { - /l3sc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - setcmykcolor - } ~ - def - } + \@@_draw_literal:n + { /l3sc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def } } \cs_new_protected:Npn \driver_draw_color_gray:n #1 { - \@@_draw_literal:x { fp_eval:n {#1} ~ setgray } + \@@_draw_literal:n { #1 ~ setgray } \@@_draw_color_reset: } \cs_new_protected:Npn \driver_draw_fill_gray:n #1 - { \@@_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } } + { \@@_draw_literal:n { /l3fc ~ { #1 ~ setgray } ~ def } } \cs_new_protected:Npn \driver_draw_stroke_gray:n #1 - { \@@_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } } + { \@@_draw_literal:n { /l3sc ~ { #1 ~ setgray } ~ def } } \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3 { - \@@_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ - setrgbcolor - } + \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ setrgbcolor } \@@_draw_color_reset: } \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3 { - \@@_draw_literal:x - { - /l3fc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ - setrgbcolor - } ~ - def - } + \@@_draw_literal:n + { /l3fc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def } } \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3 { - \@@_draw_literal:x - { - /l3sc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ - setrgbcolor - } ~ - def - } + \@@_draw_literal:n + { /l3sc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def } } % \end{macrocode} % \end{macro} @@ -1250,8 +1215,7 @@ \@@_draw_literal:x { [ - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ + #1 ~ #2 ~ #3 ~ #4 ~ \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~ ] ~ concat @@ -2067,7 +2031,7 @@ { \dim_to_decimal_in_bp:n {#1} ~ w } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \@@_draw_literal:x { \fp_eval:n {#1} ~ M } } + { \@@_draw_literal:x { #1 ~ M } } \cs_new_protected:Npn \driver_draw_cap_butt: { \@@_draw_literal:n { 0 ~ J } } \cs_new_protected:Npn \driver_draw_cap_round: @@ -2093,103 +2057,51 @@ % \driver_draw_fill_cmyk:nnnn , % \driver_draw_stroke_cmyk:nnnn % } -% \begin{macro}{\@@_draw_color_cmyk_aux:nnnn} % \begin{macro} % { % \driver_draw_color_gray:n , % \driver_draw_fill_gray:n , % \driver_draw_stroke_gray:n % } -% \begin{macro}{\@@_draw_color_gray_aux:n} % \begin{macro} % { % \driver_draw_color_rgb:nnn , % \driver_draw_fill_rgb:nnn , % \driver_draw_stroke_rgb:nnn % } -% \begin{macro}{\@@_draw_color_rgb_aux:nnn} % Yet more fast conversion, all using the FPU to allow for expressions % in numerical input. % \begin{macrocode} \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4 { - \use:x - { - \@@_draw_color_cmyk_aux:nnnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - { \fp_eval:n {#4} } - } - } -\cs_new_protected:Npn \@@_draw_color_cmyk_aux:nnnn #1#2#3#4 - { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4 { - \@@_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - k - } + \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k } } \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4 - { - \@@_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - K - } - } + { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_color_gray:n #1 - { - \use:x - { \@@_draw_color_gray_aux:n { \fp_eval:n {#1} } } - } -\cs_new_protected:Npn \@@_draw_color_gray_aux:n #1 - { - \@@_draw_literal:n { #1 ~ g ~ #1 ~ G } - } + { \@@_draw_literal:n { #1 ~ g ~ #1 ~ G } } \cs_new_protected:Npn \driver_draw_fill_gray:n #1 - { \@@_draw_literal:x { \fp_eval:n {#1} ~ g } } + { \@@_draw_literal:n { #1 ~ g } } \cs_new_protected:Npn \driver_draw_stroke_gray:n #1 - { \@@_draw_literal:x { \fp_eval:n {#1} ~ G } } + { \@@_draw_literal:n { #1 ~ G } } \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3 { - \use:x - { - \@@_draw_color_rgb_aux:nnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - } - } -\cs_new_protected:Npn \@@_draw_color_rgb_aux:nnn #1#2#3 - { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3 - { - \@@_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg } - } + { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } } \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3 - { - \@@_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG } - } + { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} % % \begin{macro}{\driver_draw_transformcm:nnnnnn} % The first four arguments here are floats (the affine matrix), the last @@ -2200,8 +2112,7 @@ { \@@_draw_literal:x { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ + #1 ~ #2 ~ #3 ~ #4 ~ \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~ cm } @@ -2717,7 +2628,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=" \fp_eval:n {#1} " } } + { \@@_draw_scope:x { stroke-miterlimit=" #1 " } } \cs_new_protected:Npn \driver_draw_cap_butt: { \@@_draw_scope:n { stroke-linecap="butt" } } \cs_new_protected:Npn \driver_draw_cap_round: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index d932e646c2f..bd8f69d6f16 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3expan.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3expan.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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1064,7 +1064,7 @@ { \fi: \fi: - \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2} + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2} \exp_end: } % \end{macrocode} @@ -1527,7 +1527,7 @@ % error. % \begin{macrocode} \cs_new:Npn ^^@ - { \__msg_kernel_expandable_error:nn { kernel } { bad-exp-end-f } } + { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } } % \end{macrocode} % The same but grabbing an argument to remove spaces and braces. % \begin{macrocode} @@ -1561,7 +1561,7 @@ % iterate through the comma list of variant argument specifiers, which % we first convert to a string: the reason is explained later. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_cs_exist:N #1 } { } \cs_new_protected:Npn \cs_generate_variant:Nn #1#2 { \@@_generate_variant:N #1 @@ -1642,7 +1642,7 @@ \cs_new_protected:Npn \@@_generate_variant:nnNN #1#2#3#4 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: @@ -1849,7 +1849,7 @@ \exp_not:n { \q_mark - \__msg_kernel_error:nnxx { kernel } { variant-too-long } + \__kernel_msg_error:nnxx { kernel } { variant-too-long } {#5} { \token_to_str:N #3 } \use_none:nnn \q_stop @@ -1864,7 +1864,7 @@ \exp_not:n { \q_mark - \__msg_kernel_error:nnxxxx { kernel } { invalid-variant } + \__kernel_msg_error:nnxxxx { kernel } { invalid-variant } {#7} { \token_to_str:N #5 } {#1} {#2} \use_none:nnn \q_stop @@ -1877,12 +1877,13 @@ #3 \q_stop #4 #5 {#6} {#7} \exp_not:n { - \@@_generate_variant_loop_warning:nnxxxx { kernel } { invalid-variant } + \@@_generate_variant_loop_warning:nnxxxx + { kernel } { deprecated-variant } {#7} { \token_to_str:N #5 } {#1} {#2} } } \cs_new_protected:Npn \@@_generate_variant_loop_warning:nnxxxx - { \__msg_kernel_warning:nnxxxx } + { \__kernel_msg_warning:nnxxxx } % \end{macrocode} % \end{macro} % @@ -1915,11 +1916,11 @@ % \cs{cs_new_protected:Npx}. Then define the variant by % combining the |\exp_args:N #3| variant and the base function. % \begin{macrocode} -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { \cs_if_free:NF #4 { - \__debug_log:x + \__kernel_debug_log:x { Variant~\token_to_str:N #4~% already~defined;~ not~ changing~ it~ \msg_line_context: @@ -2012,7 +2013,7 @@ \cs_new_protected:Npn \@@_generate_variant:nnNnn #1#2#3#4#5 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \use_i_delimit_by_q_stop:nw \fi: @@ -2032,7 +2033,7 @@ \cs_if_exist_use:cTF { @@_generate_variant_#1_form:nnn } { {#3} {#4} {#5} } { - \__msg_kernel_error:nnxx + \__kernel_msg_error:nnxx { kernel } { conditional-form-unknown } {#1} { \token_to_str:c { #3 : #4 } } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 211c204a7d8..4b89d01c5d1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% File: l3file.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 @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -884,7 +884,7 @@ \int_if_even:nF { 0 \tl_map_function:NN #2 \@@_name_quote_aux:n } { - \__msg_kernel_error:nnx + \__kernel_msg_error:nnx { kernel } { unbalanced-quote-in-filename } {#2} } \tl_remove_all:Nn #2 { " } @@ -975,7 +975,7 @@ \cs_new_protected:Npn \__file_missing:n #1 { \__file_name_sanitize:nN {#1} \l__file_base_name_str - \__msg_kernel_error:nnx { kernel } { file-not-found } + \__kernel_msg_error:nnx { kernel } { file-not-found } { \l__file_base_name_str } } % \end{macrocode} @@ -1299,7 +1299,7 @@ \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl { \@@_open_stream:Nn #1 {#2} } %<*initex> - { \__msg_kernel_fatal:nn { kernel } { input-streams-exhausted } } + { \__kernel_msg_fatal:nn { kernel } { input-streams-exhausted } } %</initex> %<*package> { @@ -1611,7 +1611,7 @@ \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl { \@@_open_stream:NV #1 \l__file_base_name_str } %<*initex> - { \__msg_kernel_fatal:nn { kernel } { output-streams-exhausted } } + { \__kernel_msg_fatal:nn { kernel } { output-streams-exhausted } } %</initex> %<*package> { @@ -1912,7 +1912,7 @@ % \begin{macrocode} \cs_new_protected:Npn \iow_indent:n #1 { - \__msg_kernel_error:nnnnn { kernel } { iow-indent } + \__kernel_msg_error:nnnnn { kernel } { iow-indent } { \iow_wrap:nnnN } { \iow_indent:n } {#1} #1 } @@ -1924,7 +1924,7 @@ } \cs_new:Npn \@@_indent_error:n #1 { - \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent } + \__kernel_msg_expandable_error:nnnnn { kernel } { iow-indent } { \iow_wrap:nnnN } { \iow_indent:n } {#1} #1 } @@ -2346,38 +2346,38 @@ % \subsection{Messages} % % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { file-not-found } +\__kernel_msg_new:nnnn { kernel } { file-not-found } { File~'#1'~not~found. } { The~requested~file~could~not~be~found~in~the~current~directory,~ in~the~TeX~search~path~or~in~the~LaTeX~search~path. } -\__msg_kernel_new:nnn { kernel } { file-list } +\__kernel_msg_new:nnn { kernel } { file-list } { >~File~List~< #1 \\ ............. } -\__msg_kernel_new:nnnn { kernel } { input-streams-exhausted } +\__kernel_msg_new:nnnn { kernel } { input-streams-exhausted } { Input~streams~exhausted } { TeX~can~only~open~up~to~16~input~streams~at~one~time.\\ All~16~are~currently~in~use,~and~something~wanted~to~open~ another~one. } -\__msg_kernel_new:nnnn { kernel } { output-streams-exhausted } +\__kernel_msg_new:nnnn { kernel } { output-streams-exhausted } { Output~streams~exhausted } { TeX~can~only~open~up~to~16~output~streams~at~one~time.\\ All~16~are~currently~in~use,~and~something~wanted~to~open~ another~one. } -\__msg_kernel_new:nnnn { kernel } { unbalanced-quote-in-filename } +\__kernel_msg_new:nnnn { kernel } { unbalanced-quote-in-filename } { Unbalanced~quotes~in~file~name~'#1'. } { File~names~must~contain~balanced~numbers~of~quotes~("). } -\__msg_kernel_new:nnnn { kernel } { iow-indent } +\__kernel_msg_new:nnnn { kernel } { iow-indent } { Only~#1 (arg~1)~allows~#2 } { The~command~#2 can~only~be~used~in~messages~ @@ -2397,17 +2397,12 @@ % \begin{macrocode} \tl_new:N \g_file_current_name_tl \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str } -\__debug:TF +\__kernel_deprecation_code:nn { - \tl_gput_right:Nn \g__debug_deprecation_on_tl - { - \__deprecation_error:Nnn \g_file_current_name_tl - { \g_file_curr_name_str } { 2018-12-31 } - } - \tl_gput_right:Nn \g__debug_deprecation_off_tl - { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } } + \__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 } } % \end{macrocode} % \end{variable} % @@ -2415,7 +2410,7 @@ % \begin{macro}[deprecated = 2018-12-31]{\file_path_remove:n} % Wrapper functions to manage the search path. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2018-12-31 } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \seq_put_right:Nn \l_file_search_path_seq } \cs_new_protected:Npn \file_path_include:n #1 { @@ -2423,7 +2418,7 @@ \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 } } -\__debug_deprecation:nnNNpn { 2018-12-31 } +\__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 { @@ -2437,7 +2432,7 @@ % \begin{macro}[deprecated = 2018-12-31]{\file_add_path:nN} % For removal after 2018-12-31. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN } \cs_new_protected:Npn \file_add_path:nN #1#2 { \file_get_full_name:nN {#1} #2 @@ -2450,7 +2445,7 @@ % \begin{macro}[added = 2012-06-24, updated = 2012-07-31, deprecated=2017-12-31]{\ior_get_str:NN} % For removal after 2017-12-31. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN } \cs_new_protected:Npn \ior_get_str:NN { \ior_str_get:NN } % \end{macrocode} % \end{macro} @@ -2458,7 +2453,7 @@ % \begin{macro}[deprecated = 2018-12-31]{\file_list:} % Renamed to \cs{file_log_list:}. For removal after 2018-12-31. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: } \cs_new_protected:Npn \file_list: { \file_log_list: } % \end{macrocode} % \end{macro} @@ -2467,13 +2462,13 @@ % {\ior_list_streams:, \ior_log_streams:, \iow_list_streams:, \iow_log_streams:} % These got a more consistent naming. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: } \cs_new_protected:Npn \ior_list_streams: { \ior_show_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: } \cs_new_protected:Npn \ior_log_streams: { \ior_log_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: } \cs_new_protected:Npn \iow_list_streams: { \iow_show_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: } \cs_new_protected:Npn \iow_log_streams: { \iow_log_list: } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index 3ab6b77bbb5..96a497d7492 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -175,7 +175,7 @@ \if_meaning:w #1 ^^b3 ^^bc \else: % ij - U+0133 - ij \if_meaning:w #1 ^^ba ^^a8 \else: % ĺ - U+013A - lacute \if_meaning:w #1 ^^be ^^a9 \else: % ľ - U+013E - lcaron - \__msg_kernel_expandable_error:nn { kernel } { encoding-failure } + \__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 @@ -197,7 +197,7 @@ \if_meaning:w #1 ^^ba ^^b9 \else: % ź - U+017A - zacute \if_meaning:w #1 ^^bc ^^bb \else: % ż - U+017C - zdotaccent \if_meaning:w #1 ^^be ^^ba \else: % ž - U+017E - zcaron - \__msg_kernel_expandable_error:nn { kernel } { encoding-failure } + \__kernel_msg_expandable_error:nn { kernel } { encoding-failure } \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: } @@ -206,7 +206,7 @@ \if_meaning:w #1 ^^99 ^^b3 \else: % ș - U+0219 - scommaaccent \if_meaning:w #1 ^^9b ^^b5 \else: % ț - U+021B - tcommaaccent \if_meaning:w #1 ^^b7 ^^1a \else: % ȷ - U+0237 - dotlessj - \__msg_kernel_expandable_error:nn { kernel } { encoding-failure } + \__kernel_msg_expandable_error:nn { kernel } { encoding-failure } \fi: \fi: \fi: } % \end{macrocode} @@ -221,7 +221,7 @@ \seq_put_right:Nx \l_char_active_seq { \exp_not:c { \char_generate:nn { "#1 } { 12 } } } } - \__msg_kernel_new:nnn { kernel } { encoding-failure } + \__kernel_msg_new:nnn { kernel } { encoding-failure } { Unknown~UTF-8~char } % \end{macrocode} % All of the chars are lower case so give them the correct \tn{lccode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 6df896757a3..29ffae5d507 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3flag.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3flag.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -64,7 +64,7 @@ % It must expand to character tokens only, with no spaces. % % A typical use case of flags would be to keep track of whether an -% exceptional condition has occured during expandable processing, and +% exceptional condition has occurred during expandable processing, and % produce a meaningful (non-expandable) message after the end of the % expandable processing. This is exemplified by \pkg{l3str-convert}, % which for performance reasons performs conversions of individual @@ -196,8 +196,8 @@ % When the option \texttt{check-declarations} is used, check for the % function defined by \cs{flag_new:n}. % \begin{macrocode} -\__debug_patch:nnNNpn - { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { } +\__kernel_patch:nnNNpn + { \exp_args:Nc \__kernel_chk_var_exist:N { flag~#1 } } { } \cs_new_protected:Npn \flag_clear:n #1 { \@@_clear:wn 0 ; {#1} } \cs_new_protected:Npn \@@_clear:wn #1 ; #2 { @@ -243,7 +243,7 @@ % \subsection{Expandable flag commands} % % \begin{macro}[EXP]{\@@_chk_exist:n} -% Analogue of \cs{__debug_chk_var_exist:N} for flags, and with an +% Analogue of \cs{__kernel_chk_var_exist:N} for flags, and with an % expandable error. We need to add checks by hand because flags are % not implemented in terms of other variables. Not all functions need % to be patched since some are defined in terms of others. @@ -254,7 +254,7 @@ { \flag_if_exist:nF {#1} { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } { flag~#1~ } } } @@ -278,7 +278,7 @@ % \begin{macro}[EXP, pTF]{\flag_if_raised:n} % Test if the flag has a non-zero height, by checking the |0| control sequence. % \begin{macrocode} -\__debug_patch_conditional:nNNpnn { \@@_chk_exist:n {#1} } +\__kernel_patch_conditional:nNNpnn { \@@_chk_exist:n {#1} } \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF } { \if_cs_exist:w flag~#1~0 \cs_end: @@ -295,7 +295,7 @@ % Extract the value of the flag by going through all of the % control sequences starting from |0|. % \begin{macrocode} -\__debug_patch:nnNNpn { \@@_chk_exist:n {#1} } { } +\__kernel_patch:nnNNpn { \@@_chk_exist:n {#1} } { } \cs_new:Npn \flag_height:n #1 { \@@_height_loop:wn 0; {#1} } \cs_new:Npn \@@_height_loop:wn #1 ; #2 { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3format.ins b/Master/texmf-dist/source/latex/l3kernel/l3format.ins index a17cdbdc311..6aa7727df4f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3format.ins +++ b/Master/texmf-dist/source/latex/l3kernel/l3format.ins @@ -1,6 +1,6 @@ \iffalse meta-comment -File l3format.ins Copyright (C) 2011,2012,2014-2017 The LaTeX3 Project +File l3format.ins Copyright (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 @@ -33,7 +33,7 @@ license information is placed in the derived files. \preamble -Copyright (C) 1990-2017 The LaTeX3 Project +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 @@ -83,6 +83,7 @@ and all files in that bundle must be distributed together. \from{l3fp-traps.dtx} {initex} \from{l3fp-round.dtx} {initex} \from{l3fp-parse.dtx} {initex} + \from{l3fp-assign.dtx} {initex} \from{l3fp-logic.dtx} {initex} \from{l3fp-basics.dtx} {initex} \from{l3fp-extended.dtx}{initex} @@ -90,14 +91,13 @@ and all files in that bundle must be distributed together. \from{l3fp-trig.dtx} {initex} \from{l3fp-convert.dtx} {initex} \from{l3fp-random.dtx} {initex} - \from{l3fp-assign.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{l3coffins.dtx} {initex} - \from{l3color.dtx} {initex} + \from{l3color-base.dtx} {initex} \from{l3sys.dtx} {initex} \from{l3deprecation.dtx}{initex} \from{l3candidates.dtx} {initex} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index c7e6b55d65a..d4dfd6d5c41 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index 9b6d2366310..2c63887e4f0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-aux.dtx Copyright(C) 2011-2017 The LaTeX3 Project +%% File: l3fp-aux.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -203,6 +203,17 @@ % % \subsection{Constants, and structure of floating points} % +% \begin{macro}{\@@_misused:n} +% This receives a floating point object (floating point number or +% tuple) and generates an error stating that it was misused. This is +% called when for instance an |fp| variable is left in the input +% stream and its contents reach \TeX{}'s stomach. +% \begin{macrocode} +\cs_new_protected:Npn \@@_misused:n #1 + { \__kernel_msg_error:nnx { kernel } { misused-fp } { \fp_to_tl:n {#1} } } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\s_@@, \@@_chk:w} % Floating points numbers all start with \cs{s_@@} \cs{@@_chk:w}, % where \cs{s_@@} is equal to the \TeX{} primitive \tn{relax}, and @@ -214,10 +225,7 @@ % \begin{macrocode} \__scan_new:N \s_@@ \cs_new_protected:Npn \@@_chk:w #1 ; - { - \__msg_kernel_error:nnx { kernel } { misused-fp } - { \fp_to_tl:n { \s_@@ \@@_chk:w #1 ; } } - } + { \@@_misused:n { \s_@@ \@@_chk:w #1 ; } } % \end{macrocode} % \end{macro} % @@ -385,10 +393,9 @@ % \cs{@@_exp_after_f:nw} \Arg{tokens} \meta{floating point} % \end{syntax} % Places \meta{tokens} (empty in the case of \cs{@@_exp_after_o:w}) -% between the \meta{floating point} and the \meta{more tokens}, then -% hits those tokens with either \texttt{o}-expansion (one -% \cs{exp_after:wN}) or \texttt{f}-expansion, and leaves the floating -% point number unchanged. +% between the \meta{floating point} and the following tokens, then +% hits those tokens with \texttt{o} or \texttt{f}-expansion, and +% leaves the floating point number unchanged. % % We first distinguish normal floating points, which have a significand, % from the much simpler special floating points. @@ -459,27 +466,198 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[EXP]{\@@_exp_after_array_f:w} +% \subsection{Other floating point types} +% +% \begin{macro}{\s_@@_tuple, \@@_tuple_chk:w} +% \begin{variable}{\c_@@_empty_tuple_fp} +% Floating point tuples take the form \cs{s_@@_tuple} +% \cs{@@_tuple_chk:w} |{| \meta{fp 1} \meta{fp 2} \dots |}| |;| where +% each \meta{fp} is a floating point number or tuple, hence ends with +% |;| itself. When a tuple is typeset, \cs{@@_tuple_chk:w} produces +% an error, just like usual floating point numbers. +% Tuples may have zero or one element. +% \begin{macrocode} +\__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 + { \s_@@_tuple \@@_tuple_chk:w { } ; } +% \end{macrocode} +% \end{variable} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_tuple_count:w, \@@_array_count:n} +% \begin{macro}[EXP]{\@@_tuple_count_loop:Nw} +% Count the number of items in a tuple of floating points by counting +% semicolons. The technique is very similar to \cs{tl_count:n}, but +% with the loop built-in. Checking for the end of the loop is done +% with the |\use_none:n #1| construction. +% \begin{macrocode} +\cs_new:Npn \@@_array_count:n #1 + { \@@_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: + } +\cs_new:Npn \@@_tuple_count_loop:Nw #1#2; + { \use_none:n #1 + 1 \@@_tuple_count_loop:Nw } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \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 +% \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. +% \begin{macrocode} +\cs_new:Npn \@@_if_type_fp:NTwFw #1 \s_@@ #2 #3 \q_stop {#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_array_if_all_fp:nTF, \@@_array_if_all_fp_loop:w} +% True if all items are floating point numbers. Used for |min|. +% \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 + } +\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 } + \q_stop + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP] +% {\@@_type_from_scan:N, \@@_type_from_scan_other:N, \@@_type_from_scan:w} +% Used as \cs{@@_type_from_scan:N} \meta{token}. +% Grabs the pieces of the stringified \meta{token} which lies after +% the first |s__fp|. If the \meta{token} does not contain that +% string, the result is |_?|. +% \begin{macrocode} +\cs_new:Npn \@@_type_from_scan:N #1 + { + \@@_if_type_fp:NTwFw + #1 { } + \s_@@ { \@@_type_from_scan_other:N #1 } + \q_stop + } +\cs_new:Npx \@@_type_from_scan_other:N #1 + { + \exp_not:N \exp_after:wN \exp_not:N \@@_type_from_scan:w + \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} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_change_func_type:NNN} +% \begin{macro}[EXP]{\@@_change_func_type_aux:w, \@@_change_func_type_chk:NNN} +% Arguments are \meta{type marker} \meta{function} \meta{recovery}. +% This gives the function obtained by placing the type after |@@|. If +% the function is not defined then \meta{recovery} \meta{function} is +% used instead; however that test is not run when the \meta{type +% marker} is \cs{s_@@}. +% \begin{macrocode} +\cs_new:Npn \@@_change_func_type:NNN #1#2#3 + { + \@@_if_type_fp:NTwFw + #1 #2 + \s_@@ + { + \exp_after:wN \@@_change_func_type_chk:NNN + \cs:w + @@ \@@_type_from_scan_other:N #1 + \exp_after:wN \@@_change_func_type_aux:w \token_to_str:N #2 + \cs_end: + #2 #3 + } + \q_stop + } +\exp_last_unbraced:NNNNo + \cs_new:Npn \@@_change_func_type_aux:w #1 { \tl_to_str:n { @@ } } { } +\cs_new:Npn \@@_change_func_type_chk:NNN #1#2#3 + { + \if_meaning:w \scan_stop: #1 + \exp_after:wN #3 \exp_after:wN #2 + \else: + \exp_after:wN #1 + \fi: + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_exp_after_any_f:Nnw, \@@_exp_after_any_f:nw} % \begin{macro}[EXP]{\@@_exp_after_stop_f:nw} -% \begin{syntax} -% \cs{@@_exp_after_array_f:w} -% \meta{fp_1} |;| -% \ldots{} -% \meta{fp_n} |;| -% \cs{s_@@_stop} -% \end{syntax} +% The |Nnw| function simply dispatches to the appropriate +% \cs[no-index]{@@_exp_after\ldots{}_f:nw} with \enquote{\ldots{}} +% (either empty or |_|\meta{type}) extracted from |#1|, which should +% start with |\s__fp|. If it doesn't start with |\s__fp| the function +% \cs{@@_exp_after_?_f:nw} defined in \pkg{l3fp-parse} gives an error; +% another special \meta{type} is |stop|, useful for loops, see below. +% The |nw| function has an important optimization for floating points +% numbers; it also fetches its type marker |#2| from the floating +% point. % \begin{macrocode} -\cs_new:Npn \@@_exp_after_array_f:w #1 +\cs_new:Npn \@@_exp_after_any_f:Nnw #1 + { \cs:w @@_exp_after \@@_type_from_scan_other:N #1 _f:nw \cs_end: } +\cs_new:Npn \@@_exp_after_any_f:nw #1#2 { - \cs:w @@_exp_after \@@_type_from_scan:N #1 _f:nw \cs_end: - { \@@_exp_after_array_f:w } - #1 + \@@_if_type_fp:NTwFw + #2 \@@_exp_after_f:nw + \s_@@ { \@@_exp_after_any_f:Nnw #2 } + \q_stop + {#1} #2 } \cs_new_eq:NN \@@_exp_after_stop_f:nw \use_none:nn % \end{macrocode} % \end{macro} % \end{macro} % +% \begin{macro}[EXP]{\@@_exp_after_tuple_f:nw, \@@_exp_after_array_f:w} +% The loop works by using the |n| argument of +% \cs{@@_exp_after_any_f:nw} to place the loop macro after the next +% item in the tuple and expand it. +% \begin{quote} +% \cs{@@_exp_after_array_f:w}\\ +% \meta{fp_1} |;|\\ +% \ldots{}\\ +% \meta{fp_n} |;|\\ +% \cs{s_@@_stop} +% \end{quote} +% \begin{macrocode} +\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 + \exp_after:wN { + \exp:w \exp_end_continue_f:w + \@@_exp_after_array_f:w #2 \s_@@_stop + \exp_after:wN } + \exp_after:wN ; + \exp:w \exp_end_continue_f:w #1 + } +\cs_new:Npn \@@_exp_after_array_f:w + { \@@_exp_after_any_f:nw { \@@_exp_after_array_f:w } } +% \end{macrocode} +% \end{macro} +% % \subsection{Packing digits} % % When a positive integer |#1| is known to be less than $10^8$, the @@ -1011,28 +1189,6 @@ % \end{macro} % \end{macro} % -% \subsection{Length of a floating point array} -% -% \begin{macro}[EXP]{\@@_array_count:n} -% \begin{macro}[EXP]{\@@_array_count_loop:Nw} -% Count the number of items in an array of floating points. The -% technique is very similar to \cs{tl_count:n}, but with the loop -% built-in. Checking for the end of the loop is done with the -% |\use_none:n #1| construction. -% \begin{macrocode} -\cs_new:Npn \@@_array_count:n #1 - { - \__int_value:w \__int_eval:w 0 - \@@_array_count_loop:Nw #1 { ? \__prg_break: } ; - \__prg_break_point: - \__int_eval_end: - } -\cs_new:Npn \@@_array_count_loop:Nw #1#2; - { \use_none:n #1 + 1 \@@_array_count_loop:Nw } -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \subsection{\texttt{x}-like expansion expandably} % % \begin{macro}[EXP]{\@@_expand:n} @@ -1064,16 +1220,30 @@ % \end{macro} % \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} +% The goal is to convert for instance \cs{@@_sin_o:w} to |sin|. +% 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 } +\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: } } +% \end{macrocode} +% \end{macro} +% % \subsection{Messages} % % Using a floating point directly is an error. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { misused-fp } +\__kernel_msg_new:nnnn { kernel } { misused-fp } { A~floating~point~with~value~'#1'~was~misused. } { To~obtain~the~value~of~a~floating~point~variable,~use~ '\token_to_str:N \fp_to_decimal:N',~ - '\token_to_str:N \fp_to_scientific:N',~or~other~ + '\token_to_str:N \fp_to_tl:N',~or~other~ conversion~functions. } % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 8f7e365eeec..8a0f18da382 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project +%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016-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@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -2068,6 +2068,74 @@ % \end{macrocode} % \end{macro} % +% \subsection{Operations on tuples} +% +% \begin{macro}[EXP]{\@@_tuple_set_sign_o:w} +% \begin{macro}[EXP]{\@@_tuple_set_sign_aux_o:Nnw, \@@_tuple_set_sign_aux_o:w} +% Two cases: |abs(|\meta{tuple}|)| for which |#1| is $0$ (invalid for +% tuples) and |-|\meta{tuple} for which |#1| is $2$. In that case, +% map over all items in the tuple an auxiliary that dispatches to the +% type-appropriate sign-flipping function. +% \begin{macrocode} +\cs_new:Npn \@@_tuple_set_sign_o:w #1 + { + \if_meaning:w 2 #1 + \exp_after:wN \@@_tuple_set_sign_aux_o:Nnw + \fi: + \@@_invalid_operation_o:nw { abs } + } +\cs_new:Npn \@@_tuple_set_sign_aux_o:Nnw #1#2#3 @ + { \@@_tuple_map_o:nw \@@_tuple_set_sign_aux_o:w #3 } +\cs_new:Npn \@@_tuple_set_sign_aux_o:w #1#2 ; + { + \@@_change_func_type:NNN #1 \@@_set_sign_o:w + \@@_parse_apply_unary_error:NNw + 2 #1 #2 ; @ + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_*_tuple_o:ww, \@@_tuple_*_o:ww, \@@_tuple_/_o:ww} +% For \meta{number}|*|\meta{tuple} and \meta{tuple}|*|\meta{number} +% and \meta{tuple}|/|\meta{number}, loop through the \meta{tuple} some +% code that multiplies or divides by the appropriate \meta{number}. +% Importantly we need to dispatch according to the type, and we make +% sure to apply the operator in the correct order. +% \begin{macrocode} +\cs_new:cpn { @@_*_tuple_o:ww } #1 ; + { \@@_tuple_map_o:nw { \@@_binary_type_o:Nww * #1 ; } } +\cs_new:cpn { @@_tuple_*_o:ww } #1 ; #2 ; + { \@@_tuple_map_o:nw { \@@_binary_rev_type_o:Nww * #2 ; } #1 ; } +\cs_new:cpn { @@_tuple_/_o:ww } #1 ; #2 ; + { \@@_tuple_map_o:nw { \@@_binary_rev_type_o:Nww / #2 ; } #1 ; } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_tuple_+_tuple_o:ww, \@@_tuple_-_tuple_o:ww} +% Check the two tuples have the same number of items and map through +% these a helper that dispatches appropriately depending on the types. +% This means |(1,2)+((1,1),2)| gives |(nan,4)|. +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:w #1 + { + \cs_new:cpn { @@_tuple_#1_tuple_o:ww } + \s_@@_tuple \@@_tuple_chk:w ##1 ; + \s_@@_tuple \@@_tuple_chk:w ##2 ; + { + \int_compare:nNnTF + { \@@_array_count:n {##1} } = { \@@_array_count:n {##2} } + { \@@_tuple_mapthread_o:nww { \@@_binary_type_o:Nww #1 } } + { \@@_invalid_operation_o:nww #1 } + \s_@@_tuple \@@_tuple_chk:w {##1} ; + \s_@@_tuple \@@_tuple_chk:w {##2} ; + } + } +\@@_tmp:w + +\@@_tmp:w - +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</initex|package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index c727afc5696..abf02162559 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-convert.dtx Copyright(C) 2011-2017 The LaTeX3 Project +%% File: l3fp-convert.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -61,6 +61,39 @@ %<@@=fp> % \end{macrocode} % +% \subsection{Dealing with tuples} +% +% \begin{macro}[EXP] +% {\@@_tuple_convert:Nw, \@@_tuple_convert_loop:nNw, \@@_tuple_convert_end:w} +% The first argument is for instance \cs{@@_to_tl_dispatch:w}, which +% converts any floating point object to the appropriate +% representation. We loop through all items, putting |,~| between all +% of them and making sure to remove the leading |,~|. +% \begin{macrocode} +\cs_new:Npn \@@_tuple_convert:Nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ; + { + \int_case:nnF { \@@_array_count:n {#2} } + { + { 0 } { ( ) } + { 1 } { \@@_tuple_convert_end:w @ { #1 #2 , } } + } + { + \@@_tuple_convert_loop:nNw { } #1 + #2 { ? \@@_tuple_convert_end:w } ; + @ { \use_none:nn } + } + } +\cs_new:Npn \@@_tuple_convert_loop:nNw #1#2#3#4; #5 @ #6 + { + \use_none:n #3 + \exp_args:Nf \@@_tuple_convert_loop:nNw { #2 #3#4 ; } #2 #5 + @ { #6 , ~ #1 } + } +\cs_new:Npn \@@_tuple_convert_end:w #1 @ #2 + { \exp_after:wN ( \exp:w \exp_end_continue_f:w #2 ) } +% \end{macrocode} +% \end{macro} +% % \subsection{Trimming trailing zeros} % % \begin{macro}[EXP]{\@@_trim_zeros:w} @@ -104,8 +137,28 @@ % \end{macro} % % \begin{macro}[EXP] +% {\@@_to_scientific_dispatch:w, \@@_to_scientific_recover:w, \@@_tuple_to_scientific:w} +% We allow tuples. +% \begin{macrocode} +\cs_new:Npn \@@_to_scientific_dispatch:w #1 + { + \@@_change_func_type:NNN + #1 \@@_to_scientific:w \@@_to_scientific_recover:w + #1 + } +\cs_new:Npn \@@_to_scientific_recover:w #1 #2 ; + { + \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { } + nan + } +\cs_new:Npn \@@_tuple_to_scientific:w + { \@@_tuple_convert:Nw \@@_to_scientific_dispatch:w } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP] % { -% \@@_to_scientific_dispatch:w, +% \@@_to_scientific:w, % \@@_to_scientific_normal:wnnnnn, % \@@_to_scientific_normal:wNw % } @@ -122,7 +175,7 @@ % second step grab the first digit (previously hidden in braces) to % order the various parts correctly. % \begin{macrocode} -\cs_new:Npn \@@_to_scientific_dispatch:w \s_@@ \@@_chk:w #1#2 +\cs_new:Npn \@@_to_scientific:w \s_@@ \@@_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: @@ -178,13 +231,33 @@ % \end{macro} % % \begin{macro}[EXP] +% {\@@_to_decimal_dispatch:w, \@@_to_decimal_recover:w, \@@_tuple_to_decimal:w} +% We allow tuples. +% \begin{macrocode} +\cs_new:Npn \@@_to_decimal_dispatch:w #1 + { + \@@_change_func_type:NNN + #1 \@@_to_decimal:w \@@_to_decimal_recover:w + #1 + } +\cs_new:Npn \@@_to_decimal_recover:w #1 #2 ; + { + \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { } + nan + } +\cs_new:Npn \@@_tuple_to_decimal:w + { \@@_tuple_convert:Nw \@@_to_decimal_dispatch:w } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP] % { -% \@@_to_decimal_dispatch:w, +% \@@_to_decimal:w, % \@@_to_decimal_normal:wnnnnn, % \@@_to_decimal_large:Nnnw, % \@@_to_decimal_huge:wnnnn, % } -% The structure is similar to \cs{@@_to_scientific_dispatch:w}. +% The structure is similar to \cs{@@_to_scientific:w}. % Insert |-| for % negative numbers. Zero gives $0$, $\pm\infty$ and \nan{} yield an % \enquote{invalid operation} exception; note that $\pm\infty$ @@ -198,7 +271,7 @@ % non-positive, the result should be $0.\meta{zeros}\meta{digits}$, % trimmed. % \begin{macrocode} -\cs_new:Npn \@@_to_decimal_dispatch:w \s_@@ \@@_chk:w #1#2 +\cs_new:Npn \@@_to_decimal:w \s_@@ \@@_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: @@ -275,9 +348,24 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[EXP]{\@@_to_tl_dispatch:w, \@@_to_tl_recover:w, \@@_tuple_to_tl:w} +% We allow tuples. +% \begin{macrocode} +\cs_new:Npn \@@_to_tl_dispatch:w #1 + { \@@_change_func_type:NNN #1 \@@_to_tl:w \@@_to_tl_recover:w #1 } +\cs_new:Npn \@@_to_tl_recover:w #1 #2 ; + { + \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { } + nan + } +\cs_new:Npn \@@_tuple_to_tl:w + { \@@_tuple_convert:Nw \@@_to_tl_dispatch:w } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[EXP] % { -% \@@_to_tl_dispatch:w, \@@_to_tl_normal:nnnnn, +% \@@_to_tl:w, \@@_to_tl_normal:nnnnn, % \@@_to_tl_scientific:wnnnnn, \@@_to_tl_scientific:wNw % } % A structure similar to \cs{@@_to_scientific_dispatch:w} and @@ -286,7 +374,7 @@ % in decimal notation if the exponent is in the range $[-2,16]$, and % otherwise use scientific notation. % \begin{macrocode} -\cs_new:Npn \@@_to_tl_dispatch:w \s_@@ \@@_chk:w #1#2 +\cs_new:Npn \@@_to_tl:w \s_@@ \@@_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: @@ -327,20 +415,40 @@ % \subsection{Convert to dimension or integer} % % \begin{macro}[EXP]{\fp_to_dim:N, \fp_to_dim:c, \fp_to_dim:n} -% These three public functions rely on \cs{fp_to_decimal:n} -% internally. +% \begin{macro}[EXP]{\@@_to_dim_dispatch:w, \@@_to_dim_recover:w, \@@_to_dim:w} +% All three public variants are based on the same +% \cs{@@_to_dim_dispatch:w} after evaluating their argument to an +% internal floating point. +% We only allow floating point numbers, not tuples. % \begin{macrocode} \cs_new:Npn \fp_to_dim:N #1 - { \fp_to_decimal:N #1 pt } + { \exp_after:wN \@@_to_dim_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_dim:N { c } -\cs_new:Npn \fp_to_dim:n #1 - { \fp_to_decimal:n {#1} pt } +\cs_new:Npn \fp_to_dim:n + { + \exp_after:wN \@@_to_dim_dispatch:w + \exp:w \exp_end_continue_f:w \@@_parse:n + } +\cs_new:Npn \@@_to_dim_dispatch:w #1#2 ; + { + \@@_change_func_type:NNN #1 \@@_to_dim:w \@@_to_dim_recover:w + #1 #2 ; + } +\cs_new:Npn \@@_to_dim_recover:w #1 + { \@@_invalid_operation:nnw { 0pt } { fp_to_dim } } +\cs_new:Npn \@@_to_dim:w #1 ; { \@@_to_decimal:w #1 ; pt } % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}[EXP]{\fp_to_int:N, \fp_to_int:c, \fp_to_int:n} -% These three public functions evaluate their argument, then pass it -% to \cs{fp_to_int_dispatch:w}. +% \begin{macro}[EXP]{\@@_to_int_dispatch:w, \@@_to_int_recover:w} +% For the most part identical to \cs{fp_to_dim:N} but without |pt|, +% and where \cs{@@_to_int:w} does more work. +% To convert to an integer, first round to $0$ places (to the nearest +% integer), then express the result as a decimal number: the +% definition of \cs{@@_to_decimal_dispatch:w} is such that there are no +% trailing dot nor zero. % \begin{macrocode} \cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \@@_to_int_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_int:N { c } @@ -349,22 +457,21 @@ \exp_after:wN \@@_to_int_dispatch:w \exp:w \exp_end_continue_f:w \@@_parse:n } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP]{\@@_to_int_dispatch:w} -% To convert to an integer, first round to $0$ places (to the nearest -% integer), then express the result as a decimal number: the -% definition of \cs{@@_to_decimal_dispatch:w} is such that there are no -% trailing dot nor zero. -% \begin{macrocode} -\cs_new:Npn \@@_to_int_dispatch:w #1; +\cs_new:Npn \@@_to_int_dispatch:w #1#2 ; { - \exp_after:wN \@@_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w + \@@_change_func_type:NNN #1 \@@_to_int:w \@@_to_int_recover:w + #1 #2 ; + } +\cs_new:Npn \@@_to_int_recover:w #1 + { \@@_invalid_operation:nnw { 0 } { fp_to_int } } +\cs_new:Npn \@@_to_int:w #1; + { + \exp_after:wN \@@_to_decimal:w \exp:w \exp_end_continue_f:w \@@_round:Nwn \@@_round_to_nearest:NNN #1; { 0 } } % \end{macrocode} % \end{macro} +% \end{macro} % % \subsection{Convert from a dimension} % @@ -390,7 +497,7 @@ % performed by \cs{@@_mul_npos_o:Nww}, and cancelled by % \cs{prg_do_nothing:} here. % \begin{macrocode} -\__debug_patch_args:nNNpn { { (#1) } } +\__kernel_patch_args:nNNpn { { (#1) } } \cs_new:Npn \dim_to_fp:n #1 { \exp_after:wN \@@_from_dim_test:ww diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 715a3cf5339..c705c4c47f1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 0e24d860cce..9172db30bc5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index d8cfecfbc28..678c76cdf7c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-logic.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3fp-logic.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@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -344,7 +344,7 @@ } { \token_if_eq_meaning:NNTF #2 0 - { \__msg_kernel_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} @@ -410,15 +410,16 @@ % \end{macro} % % \begin{macrocode} -\__msg_kernel_new:nnn { kernel } { fp-bad-step } +\__kernel_msg_new:nnn { kernel } { fp-bad-step } { Invalid~step~size~#2~in~step~function~#3. } -\__msg_kernel_new:nnn { kernel } { fp-tiny-step } +\__kernel_msg_new:nnn { kernel } { fp-tiny-step } { Tiny~step~size~(#1+#2=#1)~in~step~function~#3. } % \end{macrocode} % % \subsection{Extrema} % -% \begin{macro}[EXP]{\@@_minmax_o:Nw} +% \begin{macro}[EXP]{\@@_minmax_o:Nw, \@@_minmax_aux_o:Nw} +% First check all operands are floating point numbers. % The argument~|#1| is $2$~to find the maximum of an array~|#2| of % floating point numbers, and $0$~to find the minimum. We read % numbers sequentially, keeping track of the largest (smallest) number @@ -430,7 +431,13 @@ % fp-like trailing marker breaks the loop correctly: see the precise % definition of \cs{@@_minmax_loop:Nww}. % \begin{macrocode} -\cs_new:Npn \@@_minmax_o:Nw #1#2 @ +\cs_new:Npn \@@_minmax_o:Nw #1 + { + \@@_parse_function_all_fp_o:fnw + { \token_if_eq_meaning:NNTF 0 #1 { min } { max } } + { \@@_minmax_aux_o:Nw #1 } + } +\cs_new:Npn \@@_minmax_aux_o:Nw #1#2 @ { \if_meaning:w 0 #1 \exp_after:wN \@@_minmax_loop:Nww \exp_after:wN + @@ -581,7 +588,7 @@ \@@_parse_operand:Nw \c_@@_prec_colon_int \@@_parse_expand:w \else: - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { fp-missing } { : } { ~for~?: } \exp_after:wN \@@_parse_continue:NwN \exp_after:wN #1 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 03bd96b4b81..541d8f14ab6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-parse.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3fp-parse.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 @@ -28,7 +28,7 @@ %</driver> % \fi % -% \title{The \textsf{l3fp-parse} package +% \title{The \textsf{l3fp-parse} package\\ % Floating point expression parsing} % \author{^^A % The \LaTeX3 Project\thanks @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -65,12 +65,17 @@ % (almost) right the first time. Let us first describe our goal, then % discuss the design precisely before writing any code. % +% In this file at least, a \meta{floating point object} is a floating +% point number or tuple. This can be extended to anything that starts +% with \cs{s_@@} or \cs{s_@@_\meta{type}} and ends with |;| with some +% internal structure that depends on the \meta{type}. +% % \begin{macro}[EXP]{\@@_parse:n} % \begin{syntax} % \cs{@@_parse:n} \Arg{fpexpr} % \end{syntax} % Evaluates the \meta{floating point expression} and leaves the result -% in the input stream as an internal floating point number. This +% in the input stream as a floating point object. This % function forms the basis of almost all public \pkg{l3fp} functions. % During evaluation, each token is fully \texttt{f}-expanded. % @@ -83,33 +88,8 @@ % \end{texnote} % \end{macro} % -% Floating point expressions are composed of numbers, given in various -% forms, infix operators, such as |+|, |**|, or~|,| (which joins two -% numbers into a list), and prefix operators, such as the unary~|-|, -% functions, or opening parentheses. Here is a list of precedences -% which control the order of evaluation (some distinctions are -% irrelevant for the order of evaluation, but serve as signals), from -% the tightest binding to the loosest binding. -% \begin{itemize} -% \item[16] Function calls with multiple arguments. -% \item[15] Function calls expecting exactly one argument. -% \item[13/14] Binary |**| and~|^| (right to left). -% \item[12] Unary |+|, |-|, |!| (right to left). -% \item[10] Binary |*|, |/|, and juxtaposition (implicit~|*|). -% \item[9] Binary |+| and~|-|. -% \item[7] Comparisons. -% \item[6] Logical \texttt{and}, denoted by~|&&|. -% \item[5] Logical \texttt{or}, denoted by~\verb*+||+. -% \item[4] Ternary operator |?:|, piece~|?|. -% \item[3] Ternary operator |?:|, piece~|:|. -% \item[2] Commas, and parentheses accepting commas. -% \item[1] Parentheses expecting exactly one argument. -% \item[0] Start and end of the expression. -% \end{itemize} -% % \begin{variable} % { -% \c_@@_prec_funcii_int, % \c_@@_prec_func_int, % \c_@@_prec_hatii_int, % \c_@@_prec_hat_int, @@ -122,12 +102,33 @@ % \c_@@_prec_quest_int, % \c_@@_prec_colon_int, % \c_@@_prec_comma_int, -% \c_@@_prec_paren_int, +% \c_@@_prec_tuple_int, % \c_@@_prec_end_int, % } +% Floating point expressions are composed of numbers, given in various +% forms, infix operators, such as |+|, |**|, or~|,| (which joins two +% numbers into a list), and prefix operators, such as the unary~|-|, +% functions, or opening parentheses. Here is a list of precedences +% which control the order of evaluation (some distinctions are +% irrelevant for the order of evaluation, but serve as signals), from +% the tightest binding to the loosest binding. +% \begin{itemize} +% \item[16] Function calls. +% \item[13/14] Binary |**| and~|^| (right to left). +% \item[12] Unary |+|, |-|, |!| (right to left). +% \item[10] Binary |*|, |/|, and juxtaposition (implicit~|*|). +% \item[9] Binary |+| and~|-|. +% \item[7] Comparisons. +% \item[6] Logical \texttt{and}, denoted by~|&&|. +% \item[5] Logical \texttt{or}, denoted by~\verb*+||+. +% \item[4] Ternary operator |?:|, piece~|?|. +% \item[3] Ternary operator |?:|, piece~|:|. +% \item[2] Commas. +% \item[1] Place where a comma is allowed and generates a tuple. +% \item[0] Start and end of the expression. +% \end{itemize} % \begin{macrocode} -\int_const:Nn \c_@@_prec_funcii_int { 16 } -\int_const:Nn \c_@@_prec_func_int { 15 } +\int_const:Nn \c_@@_prec_func_int { 16 } \int_const:Nn \c_@@_prec_hatii_int { 14 } \int_const:Nn \c_@@_prec_hat_int { 13 } \int_const:Nn \c_@@_prec_not_int { 12 } @@ -139,7 +140,7 @@ \int_const:Nn \c_@@_prec_quest_int { 4 } \int_const:Nn \c_@@_prec_colon_int { 3 } \int_const:Nn \c_@@_prec_comma_int { 2 } -\int_const:Nn \c_@@_prec_paren_int { 1 } +\int_const:Nn \c_@@_prec_tuple_int { 1 } \int_const:Nn \c_@@_prec_end_int { 0 } % \end{macrocode} % \end{variable} @@ -168,7 +169,7 @@ % which appear when computing a parenthesized expression near the % closing parenthesis. This still lets us expand tokens as we go, and % avoids performance problems as long as there are enough parentheses. -% However, it would be much better to avoid requiring the closing +% However, it would be better to avoid requiring the closing % parenthesis to be present as soon as the corresponding opening % parenthesis is read: the closing parenthesis may still be hidden in a % macro yet to be expanded. @@ -232,10 +233,11 @@ % called |\operand:w|. This means that |\operand:w| must know what the % previous binary operator is, or rather, its precedence: we thus rename % it |\operand:Nw|. Let us describe as an example how we plan to do -% the calculation |41-2^3*4+5|. Here, we abuse notations: the first -% argument of |\operand:Nw| should be an integer constant (\cs{c_@@_prec_plus_int}, -% \ldots{}) equal to the precedence of the given operator, -% not directly the operator itself. +% the calculation |41-2^3*4+5|. More precisely we describe how to +% perform the first operation in this expression. Here, we abuse +% notations: the first argument of |\operand:Nw| should be an integer +% constant (\cs{c_@@_prec_plus_int}, \ldots{}) equal to the precedence +% of the given operator, not directly the operator itself. % \begin{itemize} % \item Clean up~|41| and find~|-|. We call |\operand:Nw|~|-| to find % the second operand. @@ -247,16 +249,16 @@ % \item Compare the precedences of |^| and~|*|. Since the former is % higher, |\operand:Nw|~|^| has found the second operand of the % exponentiation, which is computed: $2^{3} = 8$. -% \item We now have |41+8*4+5|, and |\operand:Nw|~|-| is still +% \item We now have |41-8*4+5|, and |\operand:Nw|~|-| is still % looking for a second operand for the subtraction. Is it~$8$? % \item Compare the precedences of |-| and~|*|. Since the latter is % higher, we are not done with~$8$. Call |\operand:Nw|~|*| to find % the second operand of the multiplication. -% \item Clean up~|4|, and find~|-|. -% \item Compare the precedences of |*| and~|-|. Since the former is +% \item Clean up~|4|, and find~|+|. +% \item Compare the precedences of |*| and~|+|. Since the former is % higher, |\operand:Nw|~|*| has found the second operand of the % multiplication, which is computed: $8*4 = 32$. -% \item We now have |41+32+5|, and |\operand:Nw|~|-| is still looking +% \item We now have |41-32+5|, and |\operand:Nw|~|-| is still looking % for a second operand for the subtraction. Is it~$32$? % \item Compare the precedences of |-| and~|+|. Since they are equal, % |\operand:Nw|~|-| has found the second operand for the @@ -289,10 +291,10 @@ % of this function is that it reads one \meta{number}, performing no % computation, and finds the following binary \meta{operator}. Then it % expands to -% \begin{syntax} -% \meta{number} +% \begin{quote} +% \meta{number}\\ % | \__fp_parse_infix_|\meta{operator}|:N| \meta{precedence} -% \end{syntax} +% \end{quote} % expanding the \texttt{infix} auxiliary before leaving the above in the % input stream. % @@ -638,29 +640,6 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[EXP]{\@@_type_from_scan:N, \@@_type_from_scan:w} -% \begin{syntax} -% \cs{@@_type_from_scan:N} \meta{token} -% \end{syntax} -% Grabs the pieces of the stringified \meta{token} which lies after -% the first |s__fp|. If the \meta{token} does not contain that -% string, the result is |_?|. -% \begin{macrocode} -\cs_new:Npx \@@_type_from_scan:N #1 - { - \exp_not:N \exp_after:wN \exp_not:N \@@_type_from_scan:w - \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} - } -% \end{macrocode} -% \end{macro} -% % \begin{macro}[rEXP] % { % \@@_parse_digits_vii:N , @@ -761,8 +740,7 @@ % \@@_exp_after_?_f:nw % } % This function receives a \meta{precedence} and a control sequence -% equal to \cs{scan_stop:} in meaning. There are three cases, -% dispatched using \cs{@@_type_from_scan:N}. +% equal to \cs{scan_stop:} in meaning. There are three cases. % \begin{itemize} % \item \cs{s_@@} starts a floating point number, and we call % \cs{@@_exp_after_f:nw}, which |f|-expands after the floating @@ -785,23 +763,35 @@ % because \tn{protect} is often \cs{scan_stop:} hence \enquote{does % not exist}. % \begin{macrocode} -\cs_new:Npn \@@_parse_one_fp:NN #1#2 +\cs_new:Npn \@@_parse_one_fp:NN #1 { - \cs:w @@_exp_after \@@_type_from_scan:N #2 _f:nw \cs_end: + \@@_exp_after_any_f:nw { \exp_after:wN \@@_parse_infix:NN \exp_after:wN #1 \exp:w \@@_parse_expand:w } - #2 } \cs_new:Npn \@@_exp_after_mark_f:nw #1 { - \__msg_kernel_expandable_error:nn { kernel } { fp-early-end } - \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1 + \int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 } + { + \c_@@_prec_comma_int { } + \c_@@_prec_tuple_int { } + \c_@@_prec_end_int + { + \exp_after:wN \c_@@_empty_tuple_fp + \exp:w \exp_end_continue_f:w + } + } + { + \__kernel_msg_expandable_error:nn { kernel } { fp-early-end } + \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w + } + #1 } \cs_new:cpn { @@_exp_after_?_f:nw } #1#2 { - \__msg_kernel_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> @@ -815,9 +805,9 @@ \str_if_eq:nnTF {##2} { \protect } { \cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n } - { \__msg_kernel_expandable_error:nnn { kernel } { fp-robust-cmd } } + { \__kernel_msg_expandable_error:nnn { kernel } { fp-robust-cmd } } } - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {##2} } + { \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {##2} } } } } @@ -996,7 +986,7 @@ { \cs_if_exist_use:cF { @@_parse_caseless_ \str_fold_case:n {#2} :N } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { unknown-fp-word } {#2} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \@@_parse_infix:NN @@ -1051,13 +1041,13 @@ { \cs_if_exist:cTF { @@_parse_infix_ \token_to_str:N #1 :N } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-missing-number } {#1} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \@@_parse_infix:NN #3 #1 } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-unknown-symbol } {#1} \@@_parse_one:Nw #3 } @@ -1729,12 +1719,12 @@ \__str_if_eq_x:nn { \s_@@ } { \exp_not:N #1 } = 0 \exp_stop_f: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-after-e } { floating~point~ } \prg_return_true: \else: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} \prg_return_false: \fi: @@ -1745,14 +1735,14 @@ \__int_value:w #1 \else: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-after-e } { dimension~#1 } \fi: \prg_return_false: \fi: \else: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-missing } { exponent } \prg_return_true: \fi: @@ -1771,23 +1761,71 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[EXP]{\@@_parse_apply_unary:NNNwN} +% \begin{macro}[EXP]{\@@_parse_apply_function:NNNwN} % Here, |#1| is a precedence, |#2| is some extra data used by some % functions, |#3| is \emph{e.g.}, \cs{@@_sin_o:w}, and expands once % after the calculation, |#4| is the operand, and |#5| is a % \cs[no-index]{@@_parse_infix_\ldots{}:N} function. We feed the data~|#2|, and the % argument~|#4|, to the function~|#3|, which expands % \cs{exp:w} thus the \texttt{infix} function~|#5|. +% \begin{macrocode} +\cs_new:Npn \@@_parse_apply_function:NNNwN #1#2#3#4@#5 + { + #3 #2 #4 @ + \exp:w \exp_end_continue_f:w #5 #1 + } +% \end{macrocode} +% \end{macro} % -% This is redefined in \pkg{l3fp-extras}. +% \begin{macro}[EXP]{\@@_parse_apply_unary:NNNwN} +% \begin{macro}[EXP]{\@@_parse_apply_unary_chk:NwNw, \@@_parse_apply_unary_chk:nNNNw} +% \begin{macro}[EXP]{\@@_parse_apply_unary_type:NNN, \@@_parse_apply_unary_error:NNw} +% In contrast to \cs{@@_parse_apply_function:NNNwN}, this checks that +% the operand |#4| is a single argument (namely there is a single +% |;|). We use the fact that any floating point starts with a +% \enquote{safe} token like \cs{s_@@}. If there is no argument +% produce the |fp-no-arg| error; if there are at least two produce +% |fp-multi-arg|. For the error message extract the mathematical +% function name (such as |sin|) from the \pkg{expl3} function that +% computes it, such as \cs{@@_sin_o:w}. +% +% In addition, since there is a single argument we can dispatch on +% type and check that the resulting function exists. This catches +% things like |sin((1,2))| where it does not make sense to take the +% sine of a tuple. % \begin{macrocode} \cs_new:Npn \@@_parse_apply_unary:NNNwN #1#2#3#4@#5 { + \@@_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop + \@@_parse_apply_unary_type:NNN #3 #2 #4 @ \exp:w \exp_end_continue_f:w #5 #1 } +\cs_new:Npn \@@_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop + { + \if_meaning:w @ #3 \else: + \token_if_eq_meaning:NNTF . #3 + { \@@_parse_apply_unary_chk:nNNNNw { no } } + { \@@_parse_apply_unary_chk:nNNNNw { multi } } + \fi: + } +\cs_new:Npn \@@_parse_apply_unary_chk:nNNNNw #1#2#3#4#5#6 @ + { + #2 + \@@_error:nffn { fp-#1-arg } { \@@_func_to_name:N #4 } { } { } + \exp_after:wN #4 \exp_after:wN #5 \c_nan_fp @ + } +\cs_new:Npn \@@_parse_apply_unary_type:NNN #1#2#3 + { + \@@_change_func_type:NNN #3 #1 \@@_parse_apply_unary_error:NNw + #2 #3 + } +\cs_new:Npn \@@_parse_apply_unary_error:NNw #1#2#3 @ + { \@@_invalid_operation_o:fw { \@@_func_to_name:N #1 } #3 } % \end{macrocode} % \end{macro} +% \end{macro} +% \end{macro} % % \begin{macro}[EXP]{\@@_parse_prefix_-:Nw, \@@_parse_prefix_!:Nw} % The unary~|-| and boolean not are harder: we parse the operand using @@ -1840,13 +1878,15 @@ % \begin{macro}[EXP] % {\@@_parse_prefix_(:Nw, \@@_parse_lparen_after:NwN} % The left parenthesis is treated as a unary prefix operator because -% it appears in exactly the same settings. Commas are allowed if -% the previous precedence is $16$ (function with multiple arguments). -% In this case, find an -% operand using the precedence~$1$; otherwise the precedence~$0$. +% it appears in exactly the same settings. If the previous precedence +% is \cs{c_@@_prec_func_int} we are parsing arguments of a function +% and commas should not build tuples; otherwise commas should build +% tuples. We distinguish these cases by precedence: +% \cs{c_@@_prec_comma_int} for the case of arguments, +% \cs{c_@@_prec_tuple_int} for the case of tuples. % Once the operand is found, the \texttt{lparen_after} auxiliary makes % sure that there was a closing parenthesis (otherwise it complains), -% and leaves in the input stream the array it found as an operand, +% and leaves in the input stream an operand, % fetching the following infix operator. % \begin{macrocode} \cs_new:cpn { @@_parse_prefix_(:Nw } #1 @@ -1854,10 +1894,10 @@ \exp_after:wN \@@_parse_lparen_after:NwN \exp_after:wN #1 \exp:w - \if_int_compare:w #1 = \c_@@_prec_funcii_int + \if_int_compare:w #1 = \c_@@_prec_func_int \@@_parse_operand:Nw \c_@@_prec_comma_int \else: - \@@_parse_operand:Nw \c_@@_prec_paren_int + \@@_parse_operand:Nw \c_@@_prec_tuple_int \fi: \@@_parse_expand:w } @@ -1874,8 +1914,9 @@ \exp_not:N \@@_parse_expand:w } { - \exp_not:N \__msg_kernel_expandable_error:nnn + \exp_not:N \__kernel_msg_expandable_error:nnn { kernel } { fp-missing } { ) } + \exp_not:N \tl_if_empty:nT {#2} \exp_not:N \c_@@_empty_tuple_fp #2 @ \exp_not:N \use_none:n #3 } @@ -1884,18 +1925,23 @@ % \end{macro} % % \begin{macro}[EXP]{\@@_parse_prefix_):Nw} -% The right parenthesis can appear as unary prefixes when arguments of -% a multi-argument function end with a comma, or when there is no -% argument, as in |max(1,2,)| or in |rand()|. In single-argument -% functions (precedence~$0$ rather than~$1$) forbid this. +% The right parenthesis can appear as a prefix in two similar cases: +% in an empty tuple or tuple ending with a comma, or in an empty +% argument list or argument list ending with a comma, such as in +% |max(1,2,)| or in |rand()|. % \begin{macrocode} \cs_new:cpn { @@_parse_prefix_):Nw } #1 { \if_int_compare:w #1 = \c_@@_prec_comma_int \else: - \__msg_kernel_expandable_error:nnn - { kernel } { fp-missing-number } { ) } - \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w + \if_int_compare:w #1 = \c_@@_prec_tuple_int + \exp_after:wN \c_@@_empty_tuple_fp \exp:w + \else: + \__kernel_msg_expandable_error:nnn + { kernel } { fp-missing-number } { ) } + \exp_after:wN \c_nan_fp \exp:w + \fi: + \exp_end_continue_f:w \fi: \@@_parse_infix:NN #1 ) } @@ -2011,12 +2057,12 @@ } \cs_new:Npn \@@_parse_function:NNN #1#2#3 { - \exp_after:wN \@@_parse_apply_unary:NNNwN + \exp_after:wN \@@_parse_apply_function:NNNwN \exp_after:wN #3 \exp_after:wN #2 \exp_after:wN #1 \exp:w - \@@_parse_operand:Nw \c_@@_prec_funcii_int \@@_parse_expand:w + \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w } % \end{macrocode} % \end{macro} @@ -2086,18 +2132,79 @@ % \end{macro} % % \begin{macro}[EXP]{\@@_parse_apply_binary:NwNwN} +% \begin{macro}[EXP] +% {\@@_parse_apply_binary_chk:NN, \@@_parse_apply_binary_error:NNN} % Receives \meta{precedence} \meta{operand_1} |@| \meta{operation} % \meta{operand_2} |@| \meta{infix command}. Builds the appropriate -% call to the \meta{operation}~|#3|. +% call to the \meta{operation}~|#3|, dispatching on both types. +% If the resulting control sequence does not exist, the operation is +% not allowed. % % This is redefined in \pkg{l3fp-extras}. % \begin{macrocode} -\cs_new:Npn \@@_parse_apply_binary:NwNwN #1 #2@ #3 #4@ #5 +\cs_new:Npn \@@_parse_apply_binary:NwNwN #1 #2#3@ #4 #5#6@ #7 { \exp_after:wN \@@_parse_continue:NwN \exp_after:wN #1 - \exp:w \exp_end_continue_f:w \cs:w @@_#3_o:ww \cs_end: #2 #4 - \exp:w \exp_end_continue_f:w #5 #1 + \exp:w \exp_end_continue_f:w + \exp_after:wN \@@_parse_apply_binary_chk:NN + \cs:w + @@ + \@@_type_from_scan:N #2 + _#4 + \@@_type_from_scan:N #5 + _o:ww + \cs_end: + #4 + #2#3 #5#6 + \exp:w \exp_end_continue_f:w #7 #1 + } +\cs_new:Npn \@@_parse_apply_binary_chk:NN #1#2 + { + \if_meaning:w \scan_stop: #1 + \@@_parse_apply_binary_error:NNN #2 + \fi: + #1 + } +\cs_new:Npn \@@_parse_apply_binary_error:NNN #1#2#3 + { + #2 + \@@_invalid_operation_o:Nww #1 + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_binary_type_o:Nww, \@@_binary_rev_type_o:Nww} +% Applies the operator |#1| to its two arguments, dispatching +% according to their types, and expands once after the result. +% The |rev| version swaps its arguments before doing this. +% \begin{macrocode} +\cs_new:Npn \@@_binary_type_o:Nww #1 #2#3 ; #4 + { + \exp_after:wN \@@_parse_apply_binary_chk:NN + \cs:w + @@ + \@@_type_from_scan:N #2 + _ #1 + \@@_type_from_scan:N #4 + _o:ww + \cs_end: + #1 + #2 #3 ; #4 + } +\cs_new:Npn \@@_binary_rev_type_o:Nww #1 #2#3 ; #4#5 ; + { + \exp_after:wN \@@_parse_apply_binary_chk:NN + \cs:w + @@ + \@@_type_from_scan:N #4 + _ #1 + \@@_type_from_scan:N #2 + _o:ww + \cs_end: + #1 + #4 #5 ; #2 #3 ; } % \end{macrocode} % \end{macro} @@ -2111,40 +2218,40 @@ \@@_exp_after_f:nw { \@@_parse_infix:NN #1 } #2; } - \cs_new:Npn \@@_parse_infix:NN #1 #2 - { - \if_catcode:w \scan_stop: \exp_not:N #2 - \if_int_compare:w - \__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 - \else: - \exp_after:wN \exp_after:wN - \exp_after:wN \@@_parse_infix_juxtapose:N - \fi: +\cs_new:Npn \@@_parse_infix:NN #1 #2 + { + \if_catcode:w \scan_stop: \exp_not:N #2 + \if_int_compare:w + \__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 \else: - \if_int_compare:w - \__int_eval:w - ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26 - = 3 \exp_stop_f: - \exp_after:wN \exp_after:wN - \exp_after:wN \@@_parse_infix_juxtapose:N - \else: - \exp_after:wN \@@_parse_infix_check:NNN - \cs:w - @@_parse_infix_ \token_to_str:N #2 :N - \exp_after:wN \exp_after:wN \exp_after:wN - \cs_end: - \fi: + \exp_after:wN \exp_after:wN + \exp_after:wN \@@_parse_infix_mul:N \fi: - #1 - #2 - } + \else: + \if_int_compare:w + \__int_eval:w + ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26 + = 3 \exp_stop_f: + \exp_after:wN \exp_after:wN + \exp_after:wN \@@_parse_infix_mul:N + \else: + \exp_after:wN \@@_parse_infix_check:NNN + \cs:w + @@_parse_infix_ \token_to_str:N #2 :N + \exp_after:wN \exp_after:wN \exp_after:wN + \cs_end: + \fi: + \fi: + #1 + #2 + } \cs_new:Npx \@@_parse_infix_check:NNN #1#2#3 { \exp_not:N \if_meaning:w \scan_stop: #1 - \exp_not:N \__msg_kernel_expandable_error:nnn + \exp_not:N \__kernel_msg_expandable_error:nnn { kernel } { fp-missing } { * } \exp_not:N \exp_after:wN \exp_not:c { @@_parse_infix_*:N } @@ -2185,21 +2292,21 @@ % \begin{macro}[EXP]+\@@_parse_infix_):N+ % This is very similar to \cs{@@_parse_infix_end:N}, complaining about % an extra closing parenthesis if the previous operator was the -% beginning of the expression. +% beginning of the expression, with precedence \cs{c_@@_prec_end_int}. % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1 { \cs_new:Npn #1 ##1 { - \if_int_compare:w ##1 < \c_@@_prec_paren_int - \__msg_kernel_expandable_error:nnn { kernel } { fp-extra } { ) } - \exp_after:wN \@@_parse_infix:NN - \exp_after:wN ##1 - \exp:w \exp_after:wN \@@_parse_expand:w - \else: + \if_int_compare:w ##1 > \c_@@_prec_end_int \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN #1 + \else: + \__kernel_msg_expandable_error:nnn { kernel } { fp-extra } { ) } + \exp_after:wN \@@_parse_infix:NN + \exp_after:wN ##1 + \exp:w \exp_after:wN \@@_parse_expand:w \fi: } } @@ -2208,10 +2315,17 @@ % \end{macro} % % \begin{macro}[verb, EXP]{\__fp_parse_infix_,:N} -% \begin{macro}[EXP]{\@@_parse_infix_comma:w, \@@_parse_infix_comma_error:w} -% \begin{macro}[verb, EXP]{\__fp_,_o:ww} -% \cs{@@_,_o:ww} is a complicated way of replacing any number of -% floating point arguments by \texttt{nan}. +% \begin{macro}[EXP]{\@@_parse_infix_comma:w, \@@_parse_apply_comma:NwNwN} +% As for other infix operations, if the previous operations has higher +% precedence the comma waits. Otherwise we call +% \cs{@@_parse_operand:Nw} to read more comma-delimited arguments that +% \cs{@@_parse_infix_comma:w} simply concatenates into a |@|-delimited +% array. The first comma in a tuple that is not a function argument +% is distinguished: in that case call \cs{@@_parse_apply_comma:NwNwN} +% whose job is to convert the first item of the tuple and an array of +% the remaining items into a tuple. In contrast to +% \cs{@@_parse_apply_binary:NwNwN} this function's operands are not +% single-object arrays. % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1 { @@ -2223,10 +2337,15 @@ \exp_after:wN #1 \else: \if_int_compare:w ##1 < \c_@@_prec_comma_int - \@@_parse_infix_comma_error:w + \exp_after:wN @ + \exp_after:wN \@@_parse_apply_comma:NwNwN + \exp_after:wN , + \exp:w + \else: + \exp_after:wN \@@_parse_infix_comma:w + \exp:w \fi: - \exp_after:wN \@@_parse_infix_comma:w - \exp:w \@@_parse_operand:Nw \c_@@_prec_comma_int + \@@_parse_operand:Nw \c_@@_prec_comma_int \exp_after:wN \@@_parse_expand:w \fi: } @@ -2234,32 +2353,18 @@ \exp_args:Nc \@@_tmp:w { @@_parse_infix_,:N } \cs_new:Npn \@@_parse_infix_comma:w #1 @ { #1 @ \use_none:n } -\cs_new:Npn \@@_parse_infix_comma_error:w #1 \exp:w - { - \fi: - \__msg_kernel_expandable_error:nn { kernel } { fp-extra-comma } - \exp_after:wN @ - \exp_after:wN \@@_parse_apply_binary:NwNwN - \exp_after:wN , - \exp:w - } -\cs_set_protected:Npn \@@_tmp:w #1 +\cs_new:Npn \@@_parse_apply_comma:NwNwN #1 #2@ #3 #4@ #5 { - \cs_new:Npn #1 ##1 - { - \if_meaning:w \s_@@ ##1 - \exp_after:wN \@@_use_i_until_s:nw - \exp_after:wN #1 - \fi: - \exp_after:wN \c_nan_fp - ##1 - } + \exp_after:wN \@@_parse_continue:NwN + \exp_after:wN #1 + \exp:w \exp_end_continue_f:w + \@@_exp_after_tuple_f:nw { } + \s_@@_tuple \@@_tuple_chk:w { #2 #4 } ; + #5 #1 } -\exp_args:Nc \@@_tmp:w { @@_,_o:ww } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} % % \subsubsection{Usual infix operators} % @@ -2318,48 +2423,10 @@ % \begin{macro}[EXP]+\@@_parse_infix_(:N+ % When an opening parenthesis appears where we expect an infix % operator, we compute the product of the previous operand and the -% contents of the parentheses using \cs{@@_parse_infix_juxtapose:N}. +% contents of the parentheses using \cs{@@_parse_infix_mul:N}. % \begin{macrocode} \cs_new:cpn { @@_parse_infix_(:N } #1 - { \@@_parse_infix_juxtapose:N #1 ( } -% \end{macrocode} -% \end{macro} -% -% ^^A todo: can |...(1,2,3)pt| really occur? If not, simplify. -% \begin{macro}[EXP] -% {\@@_parse_infix_juxtapose:N, \@@_parse_apply_juxtapose:NwwN} -% Juxtaposition follows the same scheme as other binary operations, -% but calls \cs{@@_parse_apply_juxtapose:NwwN} rather than directly -% calling \cs{@@_parse_apply_binary:NwNwN}. This lets us catch errors -% such as |...(1,2,3)pt| where one operand of the juxtaposition is not -% a single number: both |#3| and~|#5| of the \texttt{apply} auxiliary -% must be empty. -% \begin{macrocode} -\cs_new:Npn \@@_parse_infix_juxtapose:N #1 - { - \if_int_compare:w #1 < \c_@@_prec_times_int - \exp_after:wN @ - \exp_after:wN \@@_parse_apply_juxtapose:NwwN - \exp:w - \@@_parse_operand:Nw \c_@@_prec_times_int - \exp_after:wN \@@_parse_expand:w - \else: - \exp_after:wN @ - \exp_after:wN \use_none:n - \exp_after:wN \@@_parse_infix_juxtapose:N - \fi: - } -\cs_new:Npn \@@_parse_apply_juxtapose:NwwN #1 #2;#3@ #4;#5@ - { - \if_catcode:w ^ \tl_to_str:n { #3 #5 } ^ - \else: - \@@_error:nffn { fp-invalid-ii } - { \@@_array_to_clist:n { #2; #3 } } - { \@@_array_to_clist:n { #4; #5 } } - { } - \fi: - \@@_parse_apply_binary:NwNwN #1 #2;@ * #4;@ - } + { \@@_parse_infix_mul:N #1 ( } % \end{macrocode} % \end{macro} % @@ -2436,7 +2503,7 @@ \exp_args:Nc \@@_tmp:w { @@_parse_infix_::N } \@@_ternary_auxii:NwwN \c_@@_prec_colon_int { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { fp-missing } { ? } { ~for~?: } } % \end{macrocode} @@ -2477,7 +2544,7 @@ } \cs_new:Npn \@@_parse_excl_error: { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { fp-missing } { = } { ~after~!. } } \cs_new:Npn \@@_parse_compare:NNNNNNN #1 @@ -2570,6 +2637,142 @@ % \end{macro} % \end{macro} % +% \subsection{Tools for functions} +% +% \begin{macro}[EXP]{\@@_parse_function_all_fp_o:fnw} +% Followed by \Arg{function name} \Arg{code} \meta{float array} |@| +% this checks all floats are floating point numbers (no tuples). +% \begin{macrocode} +\cs_new:Npn \@@_parse_function_all_fp_o:fnw #1#2#3 @ + { + \@@_array_if_all_fp:nTF {#3} + { #2 #3 @ } + { + \@@_error:nffn { fp-bad-args } + {#1} + { \fp_to_tl:n { \s_@@_tuple \@@_tuple_chk:w {#3} ; } } + { } + \exp_after:wN \c_nan_fp + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_parse_function_one_two:nnw} +% \begin{macro}[EXP] +% { +% \@@_parse_function_one_two_error_o:w, +% \@@_parse_function_one_two_aux:nnw, +% \@@_parse_function_one_two_auxii:nnw +% } +% This is followed by \Arg{function name} \Arg{code} \meta{float +% array} |@|. It checks that the \meta{float array} consists of one +% or two floating point numbers (not tuples), then leaves the +% \meta{code} (if there is one float) or its tail (if there are two +% floats) followed by the \meta{float array}. The \meta{code} should +% start with a single token such as \cs{@@_atan_default:w} that deals +% with the single-float case. +% +% The first \cs{@@_if_type_fp:NTwFw} test catches the case of no +% argument and the case of a tuple argument. The next one +% distinguishes the case of a single argument (no error, just add +% \cs{c_one_fp}) from a tuple second argument. Finally check there is +% no further argument. +% \begin{macrocode} +\cs_new:Npn \@@_parse_function_one_two:nnw #1#2#3 + { + \@@_if_type_fp:NTwFw + #3 { } \s_@@ \@@_parse_function_one_two_error_o:w \q_stop + \@@_parse_function_one_two_aux:nnw {#1} {#2} #3 + } +\cs_new:Npn \@@_parse_function_one_two_error_o:w #1#2#3#4 @ + { + \@@_error:nffn { fp-bad-args } + {#2} + { \fp_to_tl:n { \s_@@_tuple \@@_tuple_chk:w {#4} ; } } + { } + \exp_after:wN \c_nan_fp + } +\cs_new:Npn \@@_parse_function_one_two_aux:nnw #1#2 #3; #4 + { + \@@_if_type_fp:NTwFw + #4 { } + \s_@@ + { + \if_meaning:w @ #4 + \exp_after:wN \use_iv:nnnn + \fi: + \@@_parse_function_one_two_error_o:w + } + \q_stop + \@@_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4 + } +\cs_new:Npn \@@_parse_function_one_two_auxii:nnw #1#2#3; #4; #5 + { + \if_meaning:w @ #5 \else: + \exp_after:wN \@@_parse_function_one_two_error_o:w + \fi: + \use_ii:nn {#1} { \use_none:n #2 } #3; #4; #5 + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_tuple_map_o:nw, \@@_tuple_map_loop_o:nw} +% Apply |#1| to all items in the following tuple and expand once +% afterwards. The code |#1| should itself expand once after its +% result. +% \begin{macrocode} +\cs_new:Npn \@@_tuple_map_o:nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ; + { + \exp_after:wN \s_@@_tuple + \exp_after:wN \@@_tuple_chk:w + \exp_after:wN { + \exp:w \exp_end_continue_f:w + \@@_tuple_map_loop_o:nw {#1} #2 + { \s_@@ \__prg_break: } ; + \__prg_break_point: + \exp_after:wN } \exp_after:wN ; + } +\cs_new:Npn \@@_tuple_map_loop_o:nw #1#2#3 ; + { + \use_none:n #2 + #1 #2 #3 ; + \exp:w \exp_end_continue_f:w + \@@_tuple_map_loop_o:nw {#1} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_tuple_mapthread_o:nww, \@@_tuple_mapthread_loop_o:nw} +% Apply |#1| to pairs of items in the two following tuples and expand once +% afterwards. +% \begin{macrocode} +\cs_new:Npn \@@_tuple_mapthread_o:nww #1 + \s_@@_tuple \@@_tuple_chk:w #2 ; + \s_@@_tuple \@@_tuple_chk:w #3 ; + { + \exp_after:wN \s_@@_tuple + \exp_after:wN \@@_tuple_chk:w + \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: + \exp_after:wN } \exp_after:wN ; + } +\cs_new:Npn \@@_tuple_mapthread_loop_o:nw #1#2#3 ; #4 @ #5#6 ; + { + \use_none:n #2 + \use_none:n #5 + #1 #2 #3 ; #5 #6 ; + \exp:w \exp_end_continue_f:w + \@@_tuple_mapthread_loop_o:nw {#1} #4 @ + } +% \end{macrocode} +% \end{macro} +% % \subsection{Candidate: defining new \pkg{l3fp} functions} % % \begin{macro}[EXP]{\fp_function:Nw} @@ -2582,7 +2785,7 @@ \exp_after:wN \@@_function_apply:nw \exp_after:wN #1 \exp:w - \@@_parse_operand:Nw \c_@@_prec_funcii_int \@@_parse_expand:w + \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w } % \end{macrocode} % \end{macro} @@ -2618,7 +2821,7 @@ \__int_value:w #3 \exp_after:wN ; \exp_after:wN } \exp:w - \@@_parse_operand:Nw \c_@@_prec_funcii_int \@@_parse_expand:w + \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w } \cs_new:Npn #2 #4 {#5} } @@ -2628,7 +2831,7 @@ \int_compare:nNnTF { \tl_count:n {#3} } = {#2} { #1 #3 } { - \__msg_kernel_expandable_error:nnnnn + \__kernel_msg_expandable_error:nnnnn { kernel } { fp-num-args } { #1() } {#2} {#2} \c_nan_fp } @@ -2682,30 +2885,36 @@ % \subsection{Messages} % % \begin{macrocode} -\__msg_kernel_new:nnn { kernel } { fp-deprecated } +\__kernel_msg_new:nnn { kernel } { fp-deprecated } { '#1'~deprecated;~use~'#2' } -\__msg_kernel_new:nnn { kernel } { unknown-fp-word } +\__kernel_msg_new:nnn { kernel } { unknown-fp-word } { Unknown~fp~word~#1. } -\__msg_kernel_new:nnn { kernel } { fp-missing } +\__kernel_msg_new:nnn { kernel } { fp-missing } { Missing~#1~inserted #2. } -\__msg_kernel_new:nnn { kernel } { fp-extra } +\__kernel_msg_new:nnn { kernel } { fp-extra } { Extra~#1~ignored. } -\__msg_kernel_new:nnn { kernel } { fp-early-end } +\__kernel_msg_new:nnn { kernel } { fp-early-end } { Premature~end~in~fp~expression. } -\__msg_kernel_new:nnn { kernel } { fp-after-e } +\__kernel_msg_new:nnn { kernel } { fp-after-e } { Cannot~use~#1 after~'e'. } -\__msg_kernel_new:nnn { kernel } { fp-missing-number } +\__kernel_msg_new:nnn { kernel } { fp-missing-number } { Missing~number~before~'#1'. } -\__msg_kernel_new:nnn { kernel } { fp-unknown-symbol } +\__kernel_msg_new:nnn { kernel } { fp-unknown-symbol } { Unknown~symbol~#1~ignored. } -\__msg_kernel_new:nnn { kernel } { fp-extra-comma } - { Unexpected~comma:~extra~arguments~ignored. } -\__msg_kernel_new:nnn { kernel } { fp-num-args } +\__kernel_msg_new:nnn { kernel } { fp-extra-comma } + { Unexpected~comma~turned~to~nan~result. } +\__kernel_msg_new:nnn { kernel } { fp-no-arg } + { #1~got~no~argument;~used~nan. } +\__kernel_msg_new:nnn { kernel } { fp-multi-arg } + { #1~got~more~than~one~argument;~used~nan. } +\__kernel_msg_new:nnn { kernel } { fp-num-args } { #1~expects~between~#2~and~#3~arguments. } +\__kernel_msg_new:nnn { kernel } { fp-bad-args } + { Arguments~in~#1#2~are~invalid. } %<*package> \cs_if_exist:cT { @unexpandable@protect } { - \__msg_kernel_new:nnn { kernel } { fp-robust-cmd } + \__kernel_msg_new:nnn { kernel } { fp-robust-cmd } { Robust~command~#1 invalid~in~fp~expression! } } %</package> diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index cc1864eb9eb..f8ca2c4a81e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-random.dtx Copyright (C) 2016,2017 The LaTeX3 Project +%% File: l3fp-random.dtx Copyright (C) 2016-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@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -79,11 +79,11 @@ % \begin{macrocode} \cs_if_exist:NF \pdftex_uniformdeviate:D { - \__msg_kernel_new:nnn { kernel } { fp-no-random } + \__kernel_msg_new:nnn { kernel } { fp-no-random } { Random~numbers~unavailable } \cs_new:Npn \@@_rand_o:Nw ? #1 @ { - \__msg_kernel_expandable_error:nn { kernel } { fp-no-random } + \__kernel_msg_expandable_error:nn { kernel } { fp-no-random } \exp_after:wN \c_nan_fp } \cs_new_eq:NN \@@_randint_o:Nw \@@_rand_o:Nw @@ -197,7 +197,7 @@ \tl_if_empty:nTF {#1} { \@@_rand_o: } { - \__msg_kernel_expandable_error:nnnnn + \__kernel_msg_expandable_error:nnnnn { kernel } { fp-num-args } { rand() } { 0 } { 0 } \exp_after:wN \c_nan_fp } @@ -213,8 +213,9 @@ % \begin{macro}[EXP]{\@@_randint_o:Nw} % \begin{macro}[EXP] % { +% \@@_randint_default:w, % \@@_randint_badarg:w, -% \@@_randint_e:w, +% \@@_randint_o:w, % \@@_randint_e:wnn, % \@@_randint_e:wwNnn, % \@@_randint_e:wwwNnn, @@ -243,19 +244,13 @@ % bound. The result is compared to the upper bound and the process % repeats if needed. % \begin{macrocode} -\cs_new:Npn \@@_randint_o:Nw ? #1 @ +\cs_new:Npn \@@_randint_o:Nw ? { - \if_case:w - \__int_eval:w \@@_array_count:n {#1} - 1 \__int_eval_end: - \exp_after:wN \@@_randint_e:w \c_one_fp #1 - \or: \@@_randint_e:w #1 - \else: - \__msg_kernel_expandable_error:nnnnn - { kernel } { fp-num-args } { randint() } { 1 } { 2 } - \exp_after:wN \c_nan_fp \exp:w - \fi: - \exp_after:wN \exp_end: + \@@_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; @@ -269,7 +264,7 @@ } { 1 \exp_stop_f: } } -\cs_new:Npn \@@_randint_e:w #1; #2; +\cs_new:Npn \@@_randint_o:w #1; #2; @ { \if_case:w \@@_randint_badarg:w #1; @@ -282,6 +277,7 @@ { randint } { \@@_array_to_clist:n { #1; #2; } } \exp:w \fi: + \exp_after:wN \exp_end: } \cs_new:Npn \@@_randint_e:wnn #1; { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 2b088b5832e..10bc2370e7b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-round.dtx Copyright(C) 2011-2017 The LaTeX3 Project +%% File: l3fp-round.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -116,14 +116,13 @@ \@@_round_o:Nw \@@_round_to_nearest:NNN #1 #2 } -\__debug:TF +\__kernel_debug:TF { - \tl_gput_right:Nn \g__debug_deprecation_on_tl + \__kernel_deprecation_code:nn { \cs_set_eq:NN \@@_parse_round:Nw \@@_parse_round_deprecation_error:Nw } - \tl_gput_right:Nn \g__debug_deprecation_off_tl { \cs_set_eq:NN \@@_parse_round:Nw \@@_parse_round_no_error:Nw @@ -423,14 +422,21 @@ % % ^^A todo: This macro is intermingled with l3fp-parse. % ^^A todo: Add explanations. -% \begin{macro}[EXP]{\@@_round_o:Nw} +% \begin{macro}[EXP]{\@@_round_o:Nw, \@@_round_aux_o:Nw} +% First check that all arguments are floating point numbers. % The |trunc|, |ceil| and |floor| functions expect one or two % arguments (the second is $0$ by default), and the |round| function % also accepts a third argument (\texttt{nan} by default), which % changes |#1| from \cs{@@_round_to_nearest:NNN} to one of its % analogues. % \begin{macrocode} -\cs_new:Npn \@@_round_o:Nw #1#2 @ +\cs_new:Npn \@@_round_o:Nw #1 + { + \@@_parse_function_all_fp_o:fnw + { \@@_round_name_from_cs:N #1 } + { \@@_round_aux_o:Nw #1 } + } +\cs_new:Npn \@@_round_aux_o:Nw #1#2 @ { \if_case:w \__int_eval:w \@@_array_count:n {#2} \__int_eval_end: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index bdc717a2221..02b769a1691 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % \maketitle % % \begin{documentation} @@ -125,11 +125,11 @@ { invalid_operation , division_by_zero , overflow , underflow } {#1} { - \__msg_kernel_error:nnxx { kernel } + \__kernel_msg_error:nnxx { kernel } { unknown-fpu-trap-type } {#1} {#2} } { - \__msg_kernel_error:nnx + \__kernel_msg_error:nnx { kernel } { unknown-fpu-exception } {#1} } } @@ -336,7 +336,7 @@ % \begin{macro}[EXP]{\@@_error:nnnn, \@@_error:nnfn, \@@_error:nffn} % \begin{macrocode} \cs_new:Npn \@@_error:nnnn - { \__msg_kernel_expandable_error:nnnnn { kernel } } + { \__kernel_msg_expandable_error:nnnnn { kernel } } \cs_generate_variant:Nn \@@_error:nnnn { nnf, nff } % \end{macrocode} % \end{macro} @@ -345,7 +345,7 @@ % % Some messages. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception } +\__kernel_msg_new:nnnn { kernel } { unknown-fpu-exception } { The~FPU~exception~'#1'~is~not~known:~ that~trap~will~never~be~triggered. @@ -360,7 +360,7 @@ * ~ underflow } } -\__msg_kernel_new:nnnn { kernel } { unknown-fpu-trap-type } +\__kernel_msg_new:nnnn { kernel } { unknown-fpu-trap-type } { The~FPU~trap~type~'#2'~is~not~known. } { The~trap~type~must~be~one~of \\ @@ -371,18 +371,20 @@ * ~ none } } -\__msg_kernel_new:nnn { kernel } { fp-flow } +\__kernel_msg_new:nnn { kernel } { fp-flow } { An ~ #3 ~ occurred. } -\__msg_kernel_new:nnn { kernel } { fp-flow-to } +\__kernel_msg_new:nnn { kernel } { fp-flow-to } { #1 ~ #3 ed ~ to ~ #2 . } -\__msg_kernel_new:nnn { kernel } { fp-zero-div } +\__kernel_msg_new:nnn { kernel } { fp-zero-div } { Division~by~zero~in~ #1 (#2) } -\__msg_kernel_new:nnn { kernel } { fp-zero-div-ii } +\__kernel_msg_new:nnn { kernel } { fp-zero-div-ii } { Division~by~zero~in~ (#1) #3 (#2) } -\__msg_kernel_new:nnn { kernel } { fp-invalid } +\__kernel_msg_new:nnn { kernel } { fp-invalid } { Invalid~operation~ #1 (#2) } -\__msg_kernel_new:nnn { kernel } { fp-invalid-ii } +\__kernel_msg_new:nnn { kernel } { fp-invalid-ii } { Invalid~operation~ (#1) #3 (#2) } +\__kernel_msg_new:nnn { kernel } { fp-unknown-type } + { Unknown~type~for~'#1' } % \end{macrocode} % % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 73c97574dd4..2bccf65847a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3fp-trig.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3fp-trig.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@latex-project.org}^^A % }^^A % } -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1087,44 +1087,34 @@ % % \subsubsection{Arctangent and arccotangent} % -% \begin{macro}[EXP]{\@@_atan_o:Nw, \@@_acot_o:Nw} -% \begin{macro}[EXP]{\@@_atan_dispatch_o:NNnNw} +% \begin{macro}[EXP]{\@@_atan_o:Nw, \@@_acot_o:Nw, \@@_atan_default:w} % The parsing step manipulates \texttt{atan} and \texttt{acot} like % \texttt{min} and \texttt{max}, reading in an array of operands, but % also leaves \cs{use_i:nn} or \cs{use_ii:nn} depending on whether the -% result should be given in radians or in degrees. Here, we dispatch -% according to the number of arguments. The one-argument versions of -% arctangent and arccotangent are special cases of the two-argument -% ones: $\operatorname{atan}(y) = \operatorname{atan}(y, 1) = \operatorname{acot}(1, y)$ and -% $\operatorname{acot}(x) = \operatorname{atan}(1, x) = \operatorname{acot}(x, 1)$. +% result should be given in radians or in degrees. The helper +% \cs{@@_parse_function_one_two:nnw} checks that the operand is one or +% two floating point numbers (not tuples) and leaves its second +% argument or its tail accordingly (its first argument is used for +% error messages). More precisely if we are given a single floating +% point number \cs{@@_atan_default:w} places \cs{c_one_fp} (expanded) +% after it; otherwise \cs{@@_atan_default:w} is omitted by +% \cs{@@_parse_function_one_two:nnw}. % \begin{macrocode} -\cs_new:Npn \@@_atan_o:Nw +\cs_new:Npn \@@_atan_o:Nw #1 { - \@@_atan_dispatch_o:NNnNw - \@@_acotii_o:Nww \@@_atanii_o:Nww { atan } + \@@_parse_function_one_two:nnw + { #1 { atan } { atand } } + { \@@_atan_default:w \@@_atanii_o:Nww #1 } } -\cs_new:Npn \@@_acot_o:Nw +\cs_new:Npn \@@_acot_o:Nw #1 { - \@@_atan_dispatch_o:NNnNw - \@@_atanii_o:Nww \@@_acotii_o:Nww { acot } - } -\cs_new:Npn \@@_atan_dispatch_o:NNnNw #1#2#3#4#5@ - { - \if_case:w - \__int_eval:w \@@_array_count:n {#5} - 1 \__int_eval_end: - \exp_after:wN #1 \exp_after:wN #4 \c_one_fp #5 - \exp:w - \or: #2 #4 #5 \exp:w - \else: - \__msg_kernel_expandable_error:nnnnn - { kernel } { fp-num-args } { #3() } { 1 } { 2 } - \exp_after:wN \c_nan_fp \exp:w - \fi: - \exp_after:wN \exp_end: + \@@_parse_function_one_two:nnw + { #1 { acot } { acotd } } + { \@@_atan_default:w \@@_acotii_o:Nww #1 } } +\cs_new:Npx \@@_atan_default:w #1#2#3 @ { #1 #2 #3 \c_one_fp @ } % \end{macrocode} % \end{macro} -% \end{macro} % % \begin{macro}[EXP]{\@@_atanii_o:Nww, \@@_acotii_o:Nww} % If either operand is \texttt{nan}, we return it. If both are @@ -1139,7 +1129,7 @@ % \cs{@@_acotii_o:ww} simply reverses its two arguments. % \begin{macrocode} \cs_new:Npn \@@_atanii_o:Nww - #1 \s_@@ \@@_chk:w #2#3#4; \s_@@ \@@_chk:w #5 + #1 \s_@@ \@@_chk:w #2#3#4; \s_@@ \@@_chk:w #5 #6 @ { \if_meaning:w 3 #2 \@@_case_return_i_o:ww \fi: \if_meaning:w 3 #5 \@@_case_return_ii_o:ww \fi: @@ -1156,7 +1146,7 @@ \fi: \@@_atan_normal_o:NNnwNnw #1 \s_@@ \@@_chk:w #2#3#4; - \s_@@ \@@_chk:w #5 + \s_@@ \@@_chk:w #5 #6 } \cs_new:Npn \@@_acotii_o:Nww #1#2; #3; { \@@_atanii_o:Nww #1#3; #2; } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 54019a2baaf..1558b86d6f8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -408,7 +408,7 @@ % an optional leading~|!| (which negates the \meta{relation}), with % the restriction that the \meta{relation} may not start with~|?|, as % this symbol has a different meaning (in combination with~|:|) within -% floatin point expressions. The comparison $x$~\meta{relation}~$y$ +% floating point expressions. The comparison $x$~\meta{relation}~$y$ % is then \texttt{true} if the \meta{relation} does not start with~|!| % and the actual relation (|<|, |=|, |>|, or~|?|) between $x$ and~$y$ % appears within the \meta{relation}, or on the contrary if the @@ -884,7 +884,7 @@ % Each \meta{relation} consists of a non-empty string of |<|, |=|, % |>|, and~|?|, optionally preceded by~|!|, and may not start % with~|?|. This evaluates to $+1$ if all comparisons -% \meta{operand_i} \meta{relation_j} \meta{operand_{i+1}} are true, and +% \meta{operand_i} \meta{relation_i} \meta{operand_{i+1}} are true, and % $+0$ otherwise. All \meta{operands} are evaluated in all cases. % See \cs{fp_compare:nTF} for details. % \end{function} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 53945625ced..732c2b7b968 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3int.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% File: l3int.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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1035,8 +1035,8 @@ % or directly in the input stream. % When debugging, use parentheses to catch early termination. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_eval:n } } +\__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: } % \end{macrocode} @@ -1047,8 +1047,8 @@ % so as to produce an internal integer rather than expanding into % characters. This is for use in other modules. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } } +\__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} @@ -1065,8 +1065,8 @@ % evaluation. The absolute value is obtained by removing a leading % sign if any. All three functions expand in two steps. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_abs:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_abs:n } } \cs_new:Npn \int_abs:n #1 { \@@_value:w \exp_after:wN \@@_abs:N @@ -1075,10 +1075,10 @@ } \cs_new:Npn \@@_abs:N #1 { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_max:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_max:nn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_max:nn } + { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_max:nn } } \cs_set:Npn \int_max:nn #1#2 { @@ -1088,10 +1088,10 @@ > \exp_stop_f: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_min:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_min:nn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_min:nn } + { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_min:nn } } \cs_set:Npn \int_min:nn #1#2 { @@ -1137,10 +1137,10 @@ % truncating behaviour that we want. The details are thanks to Heiko % Oberdiek: getting things right in all cases is not so easy. % \begin{macrocode} -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_div_truncate:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_div_truncate:nn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_div_truncate:nn } + { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_div_truncate:nn } } \cs_new:Npn \int_div_truncate:nn #1#2 { @@ -1171,10 +1171,10 @@ % \end{macrocode} % Finally there's the modulus operation. % \begin{macrocode} -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_mod:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_mod:nn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_mod:nn } + { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_mod:nn } } \cs_new:Npn \int_mod:nn #1#2 { @@ -1224,10 +1224,10 @@ % We cannot use \cs{int_gset:Nn} because (when |check-declarations| is % enabled) this runs some checks that constants would fail. % \begin{macrocode} -\__debug_patch_args:nnnNNpn - { \__debug_chk_var_scope:NN c #1 } +\__kernel_patch_args:nnnNNpn + { \__kernel_chk_var_scope:NN c #1 } { } - { {#1} { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_const:Nn } } + { {#1} { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_const:Nn } } \cs_new_protected:Npn \int_const:Nn #1#2 { \int_compare:nNnTF {#2} < \c_zero @@ -1273,9 +1273,9 @@ % \UnitTested % Functions that reset an \meta{integer} register to zero. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_zero:N #1 { #1 = \c_zero } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero } \cs_generate_variant:Nn \int_zero:N { c } \cs_generate_variant:Nn \int_gzero:N { c } @@ -1305,10 +1305,10 @@ % another. Check that assigned integer is local/global. No need to % check that the other one is defined as \TeX{} does it for us. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc } % \end{macrocode} @@ -1335,10 +1335,10 @@ % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } - { {##1} { \__debug_chk_expr:nNnN {##2} \@@_eval:w { } #3 } } + { {##1} { \__kernel_chk_expr:nNnN {##2} \@@_eval:w { } #3 } } #2 #3 } % \end{macrocode} @@ -1356,16 +1356,16 @@ % assigned variable is correctly local/global and wraps the % expression in some checking code. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \int_add:Nn #1#2 { \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: } -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \int_sub:Nn #1#2 { \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \int_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \int_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: } \cs_generate_variant:Nn \int_add:Nn { c } @@ -1389,16 +1389,16 @@ % Incrementing and decrementing of integer registers is done with % the following functions. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_incr:N #1 { \tex_advance:D #1 \c_one } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_decr:N #1 { \tex_advance:D #1 - \c_one } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gincr:N #1 { \tex_global:D \tex_advance:D #1 \c_one } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gdecr:N #1 { \tex_global:D \tex_advance:D #1 - \c_one } \cs_generate_variant:Nn \int_incr:N { c } @@ -1420,10 +1420,10 @@ % existence as for token list variables. However, the code that % checks whether the assignment is local or global is still needed. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \int_set:Nn #1#2 { #1 ~ \@@_eval:w #2 \@@_eval_end: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \int_gset:Nn #1#2 { \tex_global:D #1 ~ \@@_eval:w #2 \@@_eval_end: } \cs_generate_variant:Nn \int_set:Nn { c } @@ -1474,7 +1474,7 @@ { { } \c_zero \fi: - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { unknown-comparison } {#1} \prg_return_false: } @@ -1627,11 +1627,11 @@ % \UnitTested % More efficient but less natural in typing. % \begin{macrocode} -\__debug_patch_conditional_args:nNNpnn +\__kernel_patch_conditional_args:nNNpnn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_compare:nNn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_compare:nNn } { \@@_eval_end: #2 } - { \__debug_chk_expr:nNnN {#3} \@@_eval:w { } \int_compare:nNn } + { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \int_compare:nNn } } \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF } { @@ -1691,8 +1691,8 @@ % \UnitTested % A predicate function. % \begin{macrocode} -\__debug_patch_conditional_args:nNNpnn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_odd:n } } +\__kernel_patch_conditional_args:nNNpnn + { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_odd:n } } \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF} { \if_int_odd:w \@@_eval:w #1 \@@_eval_end: @@ -1701,8 +1701,8 @@ \prg_return_false: \fi: } -\__debug_patch_conditional_args:nNNpnn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_even:n } } +\__kernel_patch_conditional_args:nNNpnn + { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_even:n } } \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF} { \if_int_odd:w \@@_eval:w #1 \@@_eval_end: @@ -1818,11 +1818,11 @@ % step size of zero before checking the sign, but we optimize for the % most frequent case (positive step). % \begin{macrocode} -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_step_function:nnnN } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_step_function:nnnN } - { \__debug_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 { @@ -1838,7 +1838,7 @@ { \int_compare:nNnTF {#2} = \c_zero { - \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4} + \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4} \use_none:nnnn } { \@@_step:NnnnN < } @@ -2593,14 +2593,9 @@ %<package>\cs_gset_eq:NN \c__deprecation_minus_one \m@ne %<initex>\int_const:Nn \c__deprecation_minus_one { -1 } \cs_new_eq:NN \c_minus_one \c__deprecation_minus_one -\__debug:TF - { - \tl_gput_right:Nn \g__debug_deprecation_on_tl - { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } } - \tl_gput_right:Nn \g__debug_deprecation_off_tl - { \tex_let:D \c_minus_one \c__deprecation_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 } % \end{macrocode} % \end{variable} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index a2bb2d9e1fd..a9af6f8f40d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -184,7 +184,7 @@ \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim } { \@@_gset_fast:Nnn #1 {#2} {#3} } { - \__msg_kernel_error:nnxxxx { kernel } { overflow } + \__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} @@ -192,7 +192,7 @@ } } { - \__msg_kernel_error:nnxxx { kernel } { out-of-bounds } + \__kernel_msg_error:nnxxx { kernel } { out-of-bounds } { \token_to_str:N #1 } {#2} { \@@_count:N #1 } } } @@ -213,7 +213,7 @@ \int_compare:nTF { 1 <= #2 <= \@@_count:N #1 } { \@@_item_fast:Nn #1 {#2} } { - \__msg_kernel_expandable_error:nnnnn { kernel } { out-of-bounds } + \__kernel_msg_expandable_error:nnnnn { kernel } { out-of-bounds } { \token_to_str:N #1 } {#2} { \@@_count:N #1 } 0 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 1ccd2b357c2..5e5a5399d42 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3keys.dtx Copyright (C) 2006-2017 The LaTeX3 Project +%% File: l3keys.dtx Copyright (C) 2006-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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1064,7 +1064,7 @@ } \else: \cs_set:Npn \@@_action: - { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } } + { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } } \fi: \fi: \@@_action: @@ -1079,7 +1079,7 @@ } \cs_new:Npn \@@_action: { } \cs_new_protected:Npn \@@_empty_key: - { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } } + { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } } % \end{macrocode} % \end{macro} % \end{macro} @@ -1105,7 +1105,7 @@ % % One message for the low level parsing system. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { misplaced-equals-sign } +\__kernel_msg_new:nnnn { kernel } { misplaced-equals-sign } { Misplaced~equals~sign~in~key-value~input~\msg_line_number: } { LaTeX~is~attempting~to~parse~some~key-value~input~but~found~ @@ -1295,7 +1295,7 @@ { \tl_if_empty:NF \l_@@_property_tl { - \__msg_kernel_error:nnxx { kernel } { property-unknown } + \__kernel_msg_error:nnxx { kernel } { property-unknown } { \l_@@_property_tl } { \l_keys_path_tl } } } @@ -1321,7 +1321,7 @@ \tl_if_blank:nTF {#3} { \tl_clear:N \l_@@_property_tl - \__msg_kernel_error:nnn { kernel } { key-no-property } {#4} + \__kernel_msg_error:nnn { kernel } { key-no-property } {#4} } { \str_if_eq:nnTF {#3} { . } @@ -1372,7 +1372,7 @@ \l_@@_property_tl \q_stop { \use:c { \c_@@_props_root_tl \l_@@_property_tl } } { - \__msg_kernel_error:nnxx { kernel } + \__kernel_msg_error:nnxx { kernel } { property-requires-value } { \l_@@_property_tl } { \l_keys_path_tl } } @@ -1406,7 +1406,7 @@ { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 } \@@_cmd_set:nn { \l_keys_path_tl / unknown } { - \__msg_kernel_error:nnx { kernel } { boolean-values-only } + \__kernel_msg_error:nnx { kernel } { boolean-values-only } { \l_keys_key_tl } } \@@_default_set:n { true } @@ -1428,7 +1428,7 @@ { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 } \@@_cmd_set:nn { \l_keys_path_tl / unknown } { - \__msg_kernel_error:nnx { kernel } { boolean-values-only } + \__kernel_msg_error:nnx { kernel } { boolean-values-only } { \l_keys_key_tl } } \@@_default_set:n { true } @@ -1457,7 +1457,7 @@ { \exp_not:v { \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl } } { choice } { - \__msg_kernel_error:nnxx { kernel } { nested-choice-key } + \__kernel_msg_error:nnxx { kernel } { nested-choice-key } { \l_keys_path_tl } { \@@_parent:o \l_keys_path_tl } } { \@@_choice_make_aux:N #1 } @@ -1470,7 +1470,7 @@ \@@_cmd_set:nn { \l_keys_path_tl } { #1 {##1} } \@@_cmd_set:nn { \l_keys_path_tl / unknown } { - \__msg_kernel_error:nnxx { kernel } { key-choice-unknown } + \__kernel_msg_error:nnxx { kernel } { key-choice-unknown } { \l_keys_path_tl } {##1} } } @@ -1513,10 +1513,10 @@ % Setting the code for a key first logs if appropriate that we are % defining a new key, then saves the code. % \begin{macrocode} -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { \cs_if_exist:cF { \c_@@_code_root_tl #1 } - { \__debug_log:x { Defining~key~#1~\msg_line_context: } } + { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } } } { } \cs_new_protected:Npn \@@_cmd_set:nn #1#2 @@ -1658,7 +1658,7 @@ } } { - \__msg_kernel_error:nnx { kernel } { property-boolean-values-only } + \__kernel_msg_error:nnx { kernel } { property-boolean-values-only } { .value_ #1 :n } } } @@ -1666,7 +1666,7 @@ { \bool_if:NF \l_@@_no_value_bool { - \__msg_kernel_error:nnxx { kernel } { value-forbidden } + \__kernel_msg_error:nnxx { kernel } { value-forbidden } { \l_keys_path_tl } { \l_keys_value_tl } \@@_validate_cleanup:w } @@ -1675,7 +1675,7 @@ { \bool_if:NT \l_@@_no_value_bool { - \__msg_kernel_error:nnx { kernel } { value-required } + \__kernel_msg_error:nnx { kernel } { value-required } { \l_keys_path_tl } \@@_validate_cleanup:w } @@ -2338,7 +2338,7 @@ \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } } { - \__msg_kernel_error:nnxx { kernel } { key-unknown } + \__kernel_msg_error:nnxx { kernel } { key-unknown } { \l_keys_path_tl } { \l_@@_module_tl } } } @@ -2471,16 +2471,16 @@ % % For when there is a need to complain. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { boolean-values-only } +\__kernel_msg_new:nnnn { kernel } { boolean-values-only } { Key~'#1'~accepts~boolean~values~only. } { The~key~'#1'~only~accepts~the~values~'true'~and~'false'. } -\__msg_kernel_new:nnnn { kernel } { key-choice-unknown } +\__kernel_msg_new:nnnn { kernel } { key-choice-unknown } { Key~'#1'~accepts~only~a~fixed~set~of~choices. } { The~key~'#1'~only~accepts~predefined~values,~ and~'#2'~is~not~one~of~these. } -\__msg_kernel_new:nnnn { kernel } { key-no-property } +\__kernel_msg_new:nnnn { kernel } { key-no-property } { No~property~given~in~definition~of~key~'#1'. } { \c__msg_coding_error_text_tl @@ -2489,51 +2489,51 @@ \iow_indent:n { #1 .<property> } \\ \\ LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property. } -\__msg_kernel_new:nnnn { kernel } { key-unknown } +\__kernel_msg_new:nnnn { kernel } { key-unknown } { The~key~'#1'~is~unknown~and~is~being~ignored. } { The~module~'#2'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } -\__msg_kernel_new:nnnn { kernel } { nested-choice-key } +\__kernel_msg_new:nnnn { kernel } { nested-choice-key } { Attempt~to~define~'#1'~as~a~nested~choice~key. } { The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~ itself~a~choice. } -\__msg_kernel_new:nnnn { kernel } { property-boolean-values-only } +\__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'. } -\__msg_kernel_new:nnnn { kernel } { property-requires-value } +\__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. } -\__msg_kernel_new:nnnn { kernel } { property-unknown } +\__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. } -\__msg_kernel_new:nnnn { kernel } { value-forbidden } +\__kernel_msg_new:nnnn { kernel } { value-forbidden } { The~key~'#1'~does~not~take~a~value. } { The~key~'#1'~should~be~given~without~a~value.\\ The~value~'#2'~was~present:~the~key~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { value-required } +\__kernel_msg_new:nnnn { kernel } { value-required } { The~key~'#1'~requires~a~value. } { The~key~'#1'~must~have~a~value.\\ No~value~was~present:~the~key~will~be~ignored. } -\__msg_kernel_new:nnn { kernel } { show-key } +\__kernel_msg_new:nnn { kernel } { show-key } { The~key~#1~ \tl_if_empty:nTF {#2} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 2cbe4a5b78f..2cf851e9184 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -210,7 +210,7 @@ { \cs_set:Npn #1 ##1 { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { luatex-required } { #1 } } } @@ -219,7 +219,7 @@ { \cs_set_protected:Npn #1 ##1 { - \__msg_kernel_error:nnn + \__kernel_msg_error:nnn { kernel } { luatex-required } { #1 } } } @@ -232,7 +232,7 @@ % \subsection{Messages} % % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { luatex-required } +\__kernel_msg_new:nnnn { kernel } { luatex-required } { LuaTeX~engine~not~in~use!~Ignoring~#1. } { The~feature~you~are~using~is~only~available~ diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 940c93558ed..a18c7b553ff 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3msg.dtx Copyright (C) 2009-2017 The LaTeX3 Project +%% File: l3msg.dtx Copyright (C) 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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -530,10 +530,10 @@ % 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}[updated = 2011-08-16] -% {\__msg_kernel_new:nnnn, \__msg_kernel_new:nnn} +% \begin{function}[added = 2017-12-17] +% {\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn} % \begin{syntax} -% \cs{__msg_kernel_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text} +% \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 @@ -544,9 +544,10 @@ % An error is raised if the \meta{message} already exists. % \end{function} % -% \begin{function}{\__msg_kernel_set:nnnn, \__msg_kernel_set:nnn} +% \begin{function}[added = 2017-12-17] +% {\__kernel_msg_set:nnnn, \__kernel_msg_set:nnn} % \begin{syntax} -% \cs{__msg_kernel_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text} +% \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 @@ -556,40 +557,40 @@ % these will be supplied and expanded at the time the message is used. % \end{function} % -% \begin{function}[updated = 2012-08-11] +% \begin{function}[added = 2017-12-17] % { -% \__msg_kernel_fatal:nnnnnn , -% \__msg_kernel_fatal:nnnnn , -% \__msg_kernel_fatal:nnnn , -% \__msg_kernel_fatal:nnn , -% \__msg_kernel_fatal:nn , -% \__msg_kernel_fatal:nnxxxx , -% \__msg_kernel_fatal:nnxxx , -% \__msg_kernel_fatal:nnxx , -% \__msg_kernel_fatal:nnx +% \__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{__msg_kernel_fatal:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four} +% \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}[updated = 2012-08-11] +% \begin{function}[added = 2017-12-17] % { -% \__msg_kernel_error:nnnnnn , -% \__msg_kernel_error:nnnnn , -% \__msg_kernel_error:nnnn , -% \__msg_kernel_error:nnn , -% \__msg_kernel_error:nn , -% \__msg_kernel_error:nnxxxx , -% \__msg_kernel_error:nnxxx , -% \__msg_kernel_error:nnxx , -% \__msg_kernel_error:nnx +% \__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{__msg_kernel_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four} +% \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 @@ -598,20 +599,20 @@ % the run continues. Cannot be redirected. % \end{function} % -% \begin{function}[updated = 2012-08-11] +% \begin{function}[added = 2017-12-17] % { -% \__msg_kernel_warning:nnnnnn , -% \__msg_kernel_warning:nnnnn , -% \__msg_kernel_warning:nnnn , -% \__msg_kernel_warning:nnn , -% \__msg_kernel_warning:nn , -% \__msg_kernel_warning:nnxxxx , -% \__msg_kernel_warning:nnxxx , -% \__msg_kernel_warning:nnxx , -% \__msg_kernel_warning:nnx +% \__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{__msg_kernel_warning:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four} +% \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 @@ -619,20 +620,20 @@ % is added to the log file, but the \TeX{} run is not interrupted. % \end{function} % -% \begin{function}[updated = 2012-08-11] +% \begin{function}[added = 2017-12-17] % { -% \__msg_kernel_info:nnnnnn , -% \__msg_kernel_info:nnnnn , -% \__msg_kernel_info:nnnn , -% \__msg_kernel_info:nnn , -% \__msg_kernel_info:nn , -% \__msg_kernel_info:nnxxxx , -% \__msg_kernel_info:nnxxx , -% \__msg_kernel_info:nnxx , -% \__msg_kernel_info:nnx +% \__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{__msg_kernel_info:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four} +% \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. @@ -649,16 +650,16 @@ % message text and arguments are not expanded, and messages should be % very short. % -% \begin{function}[EXP, added = 2011-11-23] +% \begin{function}[EXP, added = 2017-12-17] % { -% \__msg_kernel_expandable_error:nnnnnn, -% \__msg_kernel_expandable_error:nnnnn, -% \__msg_kernel_expandable_error:nnnn, -% \__msg_kernel_expandable_error:nnn, -% \__msg_kernel_expandable_error:nn +% \__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{__msg_kernel_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four} +% \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 @@ -750,13 +751,13 @@ % This auxiliary is similar to \cs{__chk_if_free_cs:N}, and is used when % defining messages with \cs{msg_new:nnnn}. % \begin{macrocode} -\__debug_patch:nnNNpn { } - { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } } +\__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 { \msg_if_exist:nnT {#1} {#2} { - \@@_kernel_error:nnxx { kernel } { message-already-defined } + \__kernel_msg_error:nnxx { kernel } { message-already-defined } {#1} {#2} } } @@ -1378,7 +1379,7 @@ \cs_new:Npn \@@_class_chk_exist:nT #1 { \cs_if_free:cTF { @@_ #1 _code:nnnnnn } - { \@@_kernel_error:nnx { kernel } { message-class-unknown } {#1} } + { \__kernel_msg_error:nnx { kernel } { message-class-unknown } {#1} } } % \end{macrocode} % \end{macro} @@ -1444,7 +1445,7 @@ \@@_use_redirect_name:n { #2 / #3 } } } - { \@@_kernel_error:nnxx { kernel } { message-unknown } {#2} {#3} } + { \__kernel_msg_error:nnxx { kernel } { message-unknown } {#2} {#3} } } \cs_new_protected:Npn \@@_use_code: { } % \end{macrocode} @@ -1592,7 +1593,7 @@ \tl_if_eq:NNTF \l_@@_class_tl \l_@@_current_class_tl { \prop_put:cnn { l_@@_redirect_ #2 _prop } {#3} {#2} - \@@_kernel_warning:nnxxxx + \__kernel_msg_warning:nnxxxx { kernel } { message-redirect-loop } { \seq_item:Nn \l_@@_class_loop_seq { 1 } } { \seq_item:Nn \l_@@_class_loop_seq { 2 } } @@ -1616,19 +1617,19 @@ % % \subsection{Kernel-specific functions} % -% \begin{macro}{\@@_kernel_new:nnnn, \@@_kernel_new:nnn} -% \begin{macro}{\@@_kernel_set:nnnn, \@@_kernel_set:nnn} +% \begin{macro}{\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn} +% \begin{macro}{\__kernel_msg_set:nnnn, \__kernel_msg_set:nnn} % The kernel needs some messages of its own. These are created using % pre-built functions. Two functions are provided: one more general % and one which only has the short text part. % \begin{macrocode} -\cs_new_protected:Npn \@@_kernel_new:nnnn #1#2 +\cs_new_protected:Npn \__kernel_msg_new:nnnn #1#2 { \msg_new:nnnn { LaTeX } { #1 / #2 } } -\cs_new_protected:Npn \@@_kernel_new:nnn #1#2 +\cs_new_protected:Npn \__kernel_msg_new:nnn #1#2 { \msg_new:nnn { LaTeX } { #1 / #2 } } -\cs_new_protected:Npn \@@_kernel_set:nnnn #1#2 +\cs_new_protected:Npn \__kernel_msg_set:nnnn #1#2 { \msg_set:nnnn { LaTeX } { #1 / #2 } } -\cs_new_protected:Npn \@@_kernel_set:nnn #1#2 +\cs_new_protected:Npn \__kernel_msg_set:nnn #1#2 { \msg_set:nnn { LaTeX } { #1 / #2 } } % \end{macrocode} % \end{macro} @@ -1644,10 +1645,10 @@ % \begin{macrocode} \group_begin: \cs_set_protected:Npn \@@_kernel_class_new:nN #1 - { \@@_kernel_class_new_aux:nN { kernel_ #1 } } + { \@@_kernel_class_new_aux:nN { __kernel_msg_ #1 } } \cs_set_protected:Npn \@@_kernel_class_new_aux:nN #1#2 { - \cs_new_protected:cpn { @@_ #1 :nnnnnn } ##1##2##3##4##5##6 + \cs_new_protected:cpn { #1 :nnnnnn } ##1##2##3##4##5##6 { \use:x { @@ -1656,29 +1657,29 @@ { \tl_to_str:n {##5} } { \tl_to_str:n {##6} } } } - \cs_new_protected:cpx { @@_ #1 :nnnnn } ##1##2##3##4##5 - { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } } - \cs_new_protected:cpx { @@_ #1 :nnnn } ##1##2##3##4 - { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } } - \cs_new_protected:cpx { @@_ #1 :nnn } ##1##2##3 - { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } } - \cs_new_protected:cpx { @@_ #1 :nn } ##1##2 - { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} { } { } { } { } } - \cs_new_protected:cpx { @@_ #1 :nnxxxx } ##1##2##3##4##5##6 + \cs_new_protected:cpx { #1 :nnnnn } ##1##2##3##4##5 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } } + \cs_new_protected:cpx { #1 :nnnn } ##1##2##3##4 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } } + \cs_new_protected:cpx { #1 :nnn } ##1##2##3 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} { } { } { } } + \cs_new_protected:cpx { #1 :nn } ##1##2 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} { } { } { } { } } + \cs_new_protected:cpx { #1 :nnxxxx } ##1##2##3##4##5##6 { \use:x { \exp_not:N \exp_not:n - { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} } + { \exp_not:c { #1 :nnnnnn } {##1} {##2} } {##3} {##4} {##5} {##6} } } - \cs_new_protected:cpx { @@_ #1 :nnxxx } ##1##2##3##4##5 - { \exp_not:c { @@_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } - \cs_new_protected:cpx { @@_ #1 :nnxx } ##1##2##3##4 - { \exp_not:c { @@_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } - \cs_new_protected:cpx { @@_ #1 :nnx } ##1##2##3 - { \exp_not:c { @@_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } + \cs_new_protected:cpx { #1 :nnxxx } ##1##2##3##4##5 + { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } + \cs_new_protected:cpx { #1 :nnxx } ##1##2##3##4 + { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } + \cs_new_protected:cpx { #1 :nnx } ##1##2##3 + { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } } % \end{macrocode} % \end{macro} @@ -1686,24 +1687,24 @@ % % \begin{macro} % { -% \@@_kernel_fatal:nnnnnn , -% \@@_kernel_fatal:nnnnn , -% \@@_kernel_fatal:nnnn , -% \@@_kernel_fatal:nnn , -% \@@_kernel_fatal:nn , -% \@@_kernel_fatal:nnxxxx , -% \@@_kernel_fatal:nnxxx , -% \@@_kernel_fatal:nnxx , -% \@@_kernel_fatal:nnx , -% \@@_kernel_error:nnnnnn , -% \@@_kernel_error:nnnnn , -% \@@_kernel_error:nnnn , -% \@@_kernel_error:nnn , -% \@@_kernel_error:nn , -% \@@_kernel_error:nnxxxx , -% \@@_kernel_error:nnxxx , -% \@@_kernel_error:nnxx , -% \@@_kernel_error:nnx +% \__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 , +% \__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 % } % Neither fatal kernel errors nor kernel errors can be redirected. We % directly use the code for (non-kernel) fatal errors and errors, @@ -1712,33 +1713,33 @@ % errors. % \begin{macrocode} \@@_kernel_class_new:nN { fatal } \@@_fatal_code:nnnnnn - \cs_undefine:N \@@_kernel_error:nnxx - \cs_undefine:N \@@_kernel_error:nnx - \cs_undefine:N \@@_kernel_error:nn + \cs_undefine:N \__kernel_msg_error:nnxx + \cs_undefine:N \__kernel_msg_error:nnx + \cs_undefine:N \__kernel_msg_error:nn \@@_kernel_class_new:nN { error } \@@_error_code:nnnnnn % \end{macrocode} % \end{macro} % % \begin{macro} % { -% \@@_kernel_warning:nnnnnn , -% \@@_kernel_warning:nnnnn , -% \@@_kernel_warning:nnnn , -% \@@_kernel_warning:nnn , -% \@@_kernel_warning:nn , -% \@@_kernel_warning:nnxxxx , -% \@@_kernel_warning:nnxxx , -% \@@_kernel_warning:nnxx , -% \@@_kernel_warning:nnx , -% \@@_kernel_info:nnnnnn , -% \@@_kernel_info:nnnnn , -% \@@_kernel_info:nnnn , -% \@@_kernel_info:nnn , -% \@@_kernel_info:nn , -% \@@_kernel_info:nnxxxx , -% \@@_kernel_info:nnxxx , -% \@@_kernel_info:nnxx , -% \@@_kernel_info:nnx +% \__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 , +% \__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 % } % Kernel messages which can be redirected simply use the machinery for % normal messages, with the module name \enquote{\LaTeX{}}. @@ -1756,7 +1757,7 @@ % Error messages needed to actually implement the message system % itself. % \begin{macrocode} -\@@_kernel_new:nnnn { kernel } { message-already-defined } +\__kernel_msg_new:nnnn { kernel } { message-already-defined } { Message~'#2'~for~module~'#1'~already~defined. } { \c_@@_coding_error_text_tl @@ -1764,7 +1765,7 @@ by~the~module~'#1':~this~message~already~exists. \c_@@_return_text_tl } -\@@_kernel_new:nnnn { kernel } { message-unknown } +\__kernel_msg_new:nnnn { kernel } { message-unknown } { Unknown~message~'#2'~for~module~'#1'. } { \c_@@_coding_error_text_tl @@ -1772,14 +1773,14 @@ by~the~module~'#1':~this~message~does~not~exist. \c_@@_return_text_tl } -\@@_kernel_new:nnnn { kernel } { message-class-unknown } +\__kernel_msg_new:nnnn { kernel } { message-class-unknown } { Unknown~message~class~'#1'. } { LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\ this~was~never~defined. \c_@@_return_text_tl } -\@@_kernel_new:nnnn { kernel } { message-redirect-loop } +\__kernel_msg_new:nnnn { kernel } { message-redirect-loop } { Message~redirection~loop~caused~by~ {#1} ~=>~ {#2} \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } . @@ -1794,7 +1795,7 @@ % % Messages for earlier kernel modules. % \begin{macrocode} -\@@_kernel_new:nnnn { kernel } { bad-number-of-arguments } +\__kernel_msg_new:nnnn { kernel } { bad-number-of-arguments } { Function~'#1'~cannot~be~defined~with~#2~arguments. } { \c_@@_coding_error_text_tl @@ -1802,17 +1803,17 @@ #2~arguments.~ TeX~allows~between~0~and~9~arguments~for~a~single~function. } -\@@_kernel_new:nnn { kernel } { char-active } +\__kernel_msg_new:nnn { kernel } { char-active } { Cannot~generate~active~chars. } -\@@_kernel_new:nnn { kernel } { char-invalid-catcode } +\__kernel_msg_new:nnn { kernel } { char-invalid-catcode } { Invalid~catcode~for~char~generation. } -\@@_kernel_new:nnn { kernel } { char-null-space } +\__kernel_msg_new:nnn { kernel } { char-null-space } { Cannot~generate~null~char~as~a~space. } -\@@_kernel_new:nnn { kernel } { char-out-of-range } +\__kernel_msg_new:nnn { kernel } { char-out-of-range } { Charcode~requested~out~of~engine~range. } -\@@_kernel_new:nnn { kernel } { char-space } +\__kernel_msg_new:nnn { kernel } { char-space } { Cannot~generate~space~chars. } -\@@_kernel_new:nnnn { kernel } { command-already-defined } +\__kernel_msg_new:nnnn { kernel } { command-already-defined } { Control~sequence~#1~already~defined. } { \c_@@_coding_error_text_tl @@ -1821,33 +1822,33 @@ The~current~meaning~is:\\ \ \ #2 } -\@@_kernel_new:nnnn { kernel } { command-not-defined } +\__kernel_msg_new:nnnn { kernel } { command-not-defined } { Control~sequence~#1~undefined. } { \c_@@_coding_error_text_tl LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\ this~has~not~been~defined~yet. } -\@@_kernel_new:nnn { kernel } { deprecated-command } +\__kernel_msg_new:nnn { kernel } { deprecated-command } { The~deprecated~command~'#2'~has~been~or~will~be~removed~on~#1. \tl_if_empty:nF {#3} { ~Use~instead~'#3'. } } -\@@_kernel_new:nnnn { kernel } { empty-search-pattern } +\__kernel_msg_new:nnnn { kernel } { empty-search-pattern } { Empty~search~pattern. } { \c_@@_coding_error_text_tl LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~ would~lead~to~an~infinite~loop! } -\@@_kernel_new:nnnn { kernel } { out-of-registers } +\__kernel_msg_new:nnnn { kernel } { out-of-registers } { No~room~for~a~new~#1. } { TeX~only~supports~\int_use:N \c_max_register_int \ % of~each~type.~All~the~#1~registers~have~been~used.~ This~run~will~be~aborted~now. } -\@@_kernel_new:nnnn { kernel } { non-base-function } +\__kernel_msg_new:nnnn { kernel } { non-base-function } { Function~'#1'~is~not~a~base~function } { \c_@@_coding_error_text_tl @@ -1856,7 +1857,7 @@ To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~ and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn. } -\@@_kernel_new:nnnn { kernel } { missing-colon } +\__kernel_msg_new:nnnn { kernel } { missing-colon } { Function~'#1'~contains~no~':'. } { \c_@@_coding_error_text_tl @@ -1865,47 +1866,47 @@ needed~when~defining~conditionals~or~variants,~or~when~building~a~ parameter~text~from~the~number~of~arguments~of~the~function. } -\@@_kernel_new:nnnn { kernel } { overflow } +\__kernel_msg_new:nnnn { kernel } { overflow } { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. } { An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~ The~largest~allowed~value~#4~will~be~used~instead. } -\@@_kernel_new:nnnn { kernel } { out-of-bounds } +\__kernel_msg_new:nnnn { kernel } { out-of-bounds } { Access~to~an~entry~beyond~an~array's~bounds. } { An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~ array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3. } -\@@_kernel_new:nnnn { kernel } { protected-predicate } +\__kernel_msg_new:nnnn { kernel } { protected-predicate } { Predicate~'#1'~must~be~expandable. } { \c_@@_coding_error_text_tl LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~ Only~expandable~tests~can~have~a~predicate~version. } -\@@_kernel_new:nnnn { kernel } { conditional-form-unknown } +\__kernel_msg_new:nnnn { kernel } { conditional-form-unknown } { Conditional~form~'#1'~for~function~'#2'~unknown. } { \c_@@_coding_error_text_tl LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~ the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist. } -\@@_kernel_new:nnnn { kernel } { scanmark-already-defined } +\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined } { Scan~mark~#1~already~defined. } { \c_@@_coding_error_text_tl LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~ but~this~name~has~already~been~used~for~a~scan~mark. } -\@@_kernel_new:nnnn { kernel } { variable-not-defined } +\__kernel_msg_new:nnnn { kernel } { variable-not-defined } { Variable~#1~undefined. } { \c_@@_coding_error_text_tl LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~ been~defined~yet. } -\@@_kernel_new:nnnn { kernel } { variant-too-long } +\__kernel_msg_new:nnnn { kernel } { variant-too-long } { Variant~form~'#1'~longer~than~base~signature~of~'#2'. } { \c_@@_coding_error_text_tl @@ -1913,7 +1914,7 @@ with~a~signature~starting~with~'#1',~but~that~is~longer~than~ the~signature~(part~after~the~colon)~of~'#2'. } -\@@_kernel_new:nnnn { kernel } { invalid-variant } +\__kernel_msg_new:nnnn { kernel } { invalid-variant } { Variant~form~'#1'~invalid~for~base~form~'#2'. } { \c_@@_coding_error_text_tl @@ -1921,6 +1922,17 @@ with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~ from~type~'#3'~to~type~'#4'. } +\__kernel_msg_new:nnn { kernel } { deprecated-variant } + { + Variant~form~'#1'~deprecated~for~base~form~'#2'.~ + One~should~not~change~an~argument~from~type~'#3'~to~type~'#4' + \str_case:nnF {#3} + { + { n } { :~use~a~'\token_if_eq_charcode:NNTF #4 c v V'~variant? } + { N } { :~base~form~only~accepts~a~single~token~argument. } + {#4} { :~base~form~is~already~a~variant. } + } { . } + } % \end{macrocode} % % Some errors are only needed in package mode if debugging is enabled by @@ -1931,15 +1943,15 @@ %<*package> \bool_if:NTF \l@expl@enable@debug@bool { - \@@_kernel_new:nnnn { kernel } { debug } + \__kernel_msg_new:nnnn { kernel } { debug } { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. } { The~functions~'\iow_char:N\\debug_on:n'~and~ '\iow_char:N\\debug_off:n'~only~accept~the~arguments~ 'check-declarations',~'deprecation',~'log-functions',~not~'#1'. } - \@@_kernel_new:nnn { kernel } { expr } { '#2'~in~#1 } - \@@_kernel_new:nnnn { kernel } { local-global } + \__kernel_msg_new:nnn { kernel } { expr } { '#2'~in~#1 } + \__kernel_msg_new:nnnn { kernel } { local-global } { Inconsistent~local/global~assignment } { \c_@@_coding_error_text_tl @@ -1948,7 +1960,7 @@ \if:w l #1 local \else: \if:w g #1 global \else: constant \fi: \fi: \ variable~'#3'. } - \@@_kernel_new:nnnn { kernel } { non-declared-variable } + \__kernel_msg_new:nnnn { kernel } { non-declared-variable } { The~variable~#1~has~not~been~declared~\msg_line_context:. } { Checking~is~active,~and~you~have~tried~do~so~something~like: \\ @@ -1960,7 +1972,7 @@ } } { - \@@_kernel_new:nnnn { kernel } { enable-debug } + \__kernel_msg_new:nnnn { kernel } { enable-debug } { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. } { The~function~'#1'~will~be~ignored~because~it~can~only~work~if~ @@ -1972,7 +1984,7 @@ } %</package> %<*initex> -\@@_kernel_new:nnnn { kernel } { enable-debug } +\__kernel_msg_new:nnnn { kernel } { enable-debug } { '#1'~cannot~be~used~in~format~mode. } { The~function~'#1'~will~be~ignored~because~it~can~only~work~if~ @@ -1987,48 +1999,48 @@ % Some errors only appear in expandable settings, % hence don't need a \enquote{more-text} argument. % \begin{macrocode} -\@@_kernel_new:nnn { kernel } { bad-exp-end-f } +\__kernel_msg_new:nnn { kernel } { bad-exp-end-f } { Misused~\exp_end_continue_f:w or~:nw } -\@@_kernel_new:nnn { kernel } { bad-variable } +\__kernel_msg_new:nnn { kernel } { bad-variable } { Erroneous~variable~#1 used! } -\@@_kernel_new:nnn { kernel } { misused-sequence } +\__kernel_msg_new:nnn { kernel } { misused-sequence } { A~sequence~was~misused. } -\@@_kernel_new:nnn { kernel } { misused-prop } +\__kernel_msg_new:nnn { kernel } { misused-prop } { A~property~list~was~misused. } -\@@_kernel_new:nnn { kernel } { negative-replication } +\__kernel_msg_new:nnn { kernel } { negative-replication } { Negative~argument~for~\prg_replicate:nn. } -\@@_kernel_new:nnn { kernel } { prop-keyval } +\__kernel_msg_new:nnn { kernel } { prop-keyval } { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') } -\@@_kernel_new:nnn { kernel } { unknown-comparison } +\__kernel_msg_new:nnn { kernel } { unknown-comparison } { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. } -\@@_kernel_new:nnn { kernel } { zero-step } +\__kernel_msg_new:nnn { kernel } { zero-step } { Zero~step~size~for~step~function~#1. } % \end{macrocode} % % Messages used by the \enquote{\texttt{show}} functions. % \begin{macrocode} -\@@_kernel_new:nnn { kernel } { show-clist } +\__kernel_msg_new:nnn { kernel } { show-clist } { The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ } \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~items~(without~outer~braces): #2 . } } -\@@_kernel_new:nnn { kernel } { show-prop } +\__kernel_msg_new:nnn { kernel } { show-prop } { The~property~list~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~pairs~(without~outer~braces): #2 . } } -\@@_kernel_new:nnn { kernel } { show-seq } +\__kernel_msg_new:nnn { kernel } { show-seq } { The~sequence~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~items~(without~outer~braces): #2 . } } -\@@_kernel_new:nnn { kernel } { show-streams } +\__kernel_msg_new:nnn { kernel } { show-streams } { \tl_if_empty:nTF {#2} { No~ } { The~following~ } \str_case:nn {#1} @@ -2087,18 +2099,18 @@ % % \begin{macro} % { -% \@@_kernel_expandable_error:nnnnnn, -% \@@_kernel_expandable_error:nnnnn, -% \@@_kernel_expandable_error:nnnn, -% \@@_kernel_expandable_error:nnn, -% \@@_kernel_expandable_error:nn +% \__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 % } % The command built from the csname % |\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} -\cs_new:Npn \@@_kernel_expandable_error:nnnnnn #1#2#3#4#5#6 +\cs_new:Npn \__kernel_msg_expandable_error:nnnnnn #1#2#3#4#5#6 { \exp_args:Nf \@@_expandable_error:n { @@ -2107,24 +2119,24 @@ {#3} {#4} {#5} {#6} } } -\cs_new:Npn \@@_kernel_expandable_error:nnnnn #1#2#3#4#5 +\cs_new:Npn \__kernel_msg_expandable_error:nnnnn #1#2#3#4#5 { - \@@_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } } -\cs_new:Npn \@@_kernel_expandable_error:nnnn #1#2#3#4 +\cs_new:Npn \__kernel_msg_expandable_error:nnnn #1#2#3#4 { - \@@_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } } -\cs_new:Npn \@@_kernel_expandable_error:nnn #1#2#3 +\cs_new:Npn \__kernel_msg_expandable_error:nnn #1#2#3 { - \@@_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } } -\cs_new:Npn \@@_kernel_expandable_error:nn #1#2 +\cs_new:Npn \__kernel_msg_expandable_error:nn #1#2 { - \@@_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } } % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index d41bd08ab72..0e9d5d082c6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3names.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3names.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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -779,8 +779,11 @@ \@@_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 @@ -795,6 +798,7 @@ \@@_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 @@ -811,15 +815,17 @@ \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D \@@_primitive:NN \luafunction \luatex_luafunction:D \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D - \@@_primitive:NN \luatexdatestamp \luatex_luatexdatestamp: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 @@ -838,9 +844,11 @@ \@@_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 @@ -849,6 +857,7 @@ \@@_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 @@ -1043,6 +1052,8 @@ \@@_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 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx index d24e44b4f9f..3577138d59f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 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 @@ -42,7 +42,7 @@ % } % % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -92,7 +92,6 @@ %<l3candidates>{l3candidates} %<l3clist>{l3clist} %<l3coffins>{l3coffins} -%<l3color>{l3color} %<l3expan>{l3expan} %<l3file>{l3file} %<l3fp>{l3fp} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index c6456f25a63..a8318bcaf42 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3prg.dtx Copyright (C) 2005-2017 The LaTeX3 Project +%% File: l3prg.dtx Copyright (C) 2005-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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -811,16 +811,16 @@ % make sure the boolean exists. This is needed because booleans are % not based on token lists nor on \TeX{} registers. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set_true:N #1 { \cs_set_eq:NN #1 \c_true_bool } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set_false:N #1 { \cs_set_eq:NN #1 \c_false_bool } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset_true:N #1 { \cs_gset_eq:NN #1 \c_true_bool } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset_false:N #1 { \cs_gset_eq:NN #1 \c_false_bool } \cs_generate_variant:Nn \bool_set_true:N { c } @@ -855,10 +855,10 @@ % argument the meaning \cs{c_true_bool} or \cs{c_false_bool}. % Again, we include some checking code. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set:Nn #1#2 { \tex_chardef:D #1 = \bool_if_p:n {#2} } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} } \cs_generate_variant:Nn \bool_set:Nn { c } @@ -1425,7 +1425,7 @@ \cs_new:cpn { @@_replicate_first_-:n } #1 { \exp_end: - \__msg_kernel_expandable_error:nn { kernel } { negative-replication } + \__kernel_msg_expandable_error:nn { kernel } { negative-replication } } \cs_new:cpn { @@_replicate_first_0:n } #1 { \exp_end: } \cs_new:cpn { @@_replicate_first_1:n } #1 { \exp_end: #1 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index ddbc1f46644..2657404a11a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -535,7 +535,7 @@ % error and removes its argument. % \begin{macrocode} \cs_new:Npn \@@_pair:wn #1 \s_@@ #2 - { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } } + { \__kernel_msg_expandable_error:nn { kernel } { misused-prop } } % \end{macrocode} % \end{macro} % @@ -694,7 +694,7 @@ \s_@@ { \exp_not:n {#1} } } { - \exp_args:Nnno \__msg_kernel_expandable_error:nnn + \exp_args:Nnno \__kernel_msg_expandable_error:nnn { kernel } { prop-keyval } {#4} } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 8a1adeb756a..b3afc35b97d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% File: l3quark.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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -375,7 +375,7 @@ % \UnitTested % Allocate a new quark. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN q #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN q #1 } { } \cs_new_protected:Npn \quark_new:N #1 { \__chk_if_free_cs:N #1 @@ -599,7 +599,7 @@ { \tl_if_in:NnTF \g_@@_marks_tl { #1 } { - \__msg_kernel_error:nnx { kernel } { scanmark-already-defined } + \__kernel_msg_error:nnx { kernel } { scanmark-already-defined } { \token_to_str:N #1 } } { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 3808ec66d17..e811b8c4db4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3regex.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3regex.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -120,8 +120,8 @@ % sign. % \item \verb*"[+\-\ ]*\d+\ *" matches an explicit integer with any % number of $+$ and $-$ signs, with spaces allowed except within the -% mantissa, and sourrounded by spaces. -% \item \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explict integer or +% mantissa, and surrounded by spaces. +% \item \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explicit integer or % decimal number; using \verb*"[.,]" instead of \verb*"\." would allow % the comma as a decimal marker. % \item @@ -537,7 +537,7 @@ % equal to the number of times % \meta{regular expression} appears in \meta{token list}. % The search starts by finding the left-most longest match, -% respecting greedy and ungreedy operators. Then the search +% respecting greedy and lazy (non-greedy) operators. Then the search % starts again from the character following the last character % of the previous match, until reaching the end of the token list. % Infinite loops are prevented in the case where the regular expression @@ -1457,11 +1457,11 @@ % \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|. % \begin{macrocode} -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn + \@@_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn \__tl_build:Nw \l_@@_internal_a_tl - \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn } + \__tl_build_one:n { \@@_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn } \use_none:nn } { } @@ -1536,7 +1536,7 @@ \cs_new:cpn { @@_escape_/break:w } { \if_false: { \fi: } - \__msg_kernel_error:nn { kernel } { trailing-backslash } + \__kernel_msg_error:nn { kernel } { trailing-backslash } \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } \cs_new:cpn { @@_escape_~:w } { } @@ -1575,7 +1575,7 @@ { \if_false: { \fi: } \__tl_build_one:o \l_@@_internal_b_tl - \__msg_kernel_error:nnx { kernel } { x-overflow } {#1} + \__kernel_msg_error:nnx { kernel } { x-overflow } {#1} \tl_set:Nx \l_@@_internal_b_tl { \if_false: } \fi: } @@ -1664,7 +1664,7 @@ { \if_false: { \fi: } \__tl_build_one:o \l_@@_internal_b_tl - \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1} + \__kernel_msg_error:nnx { kernel } { x-missing-rbrace } {#1} \tl_set:Nx \l_@@_internal_b_tl { \if_false: } \fi: \@@_escape_loop:N #1 } @@ -2080,7 +2080,7 @@ \if_int_compare:w \l_@@_mode_int = \c_@@_class_mode_int \exp_after:wN \exp_after:wN \exp_after:wN \use:n \else: - \__msg_kernel_error:nn { kernel } { c-bad-mode } + \__kernel_msg_error:nn { kernel } { c-bad-mode } \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n \fi: \fi: @@ -2129,13 +2129,13 @@ { \@@_if_in_class:TF { - \__msg_kernel_error:nn { kernel } { missing-rbrack } + \__kernel_msg_error:nn { kernel } { missing-rbrack } \use:c { @@_compile_]: } \prg_do_nothing: \prg_do_nothing: } { } \if_int_compare:w \l_@@_group_level_int > 0 \exp_stop_f: - \__msg_kernel_error:nnx { kernel } { missing-rparen } + \__kernel_msg_error:nnx { kernel } { missing-rparen } { \int_use:N \l_@@_group_level_int } \prg_replicate:nn { \l_@@_group_level_int } @@ -2186,10 +2186,10 @@ \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \int_compare:nNnT \l_@@_mode_int = \c_@@_catcode_mode_int - { \__msg_kernel_error:nn { kernel } { c-trailing } } + { \__kernel_msg_error:nn { kernel } { c-trailing } } \int_compare:nNnT \l_@@_mode_int < \c_@@_outer_mode_int { - \__msg_kernel_error:nn { kernel } { c-missing-rbrace } + \__kernel_msg_error:nn { kernel } { c-missing-rbrace } \@@_compile_end_cs: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: @@ -2296,7 +2296,7 @@ \cs_new_protected:Npn \@@_compile_quantifier_abort:xNN #1#2#3 { \@@_compile_quantifier_none: - \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3} + \__kernel_msg_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3} \@@_compile_abort_tokens:x {#1} #2 #3 } @@ -2409,7 +2409,7 @@ { #1 #2 } { \@@_compile_special:N \c_right_brace_str } { \if_int_compare:w \l_@@_internal_a_int > \l_@@_internal_b_int - \__msg_kernel_error:nnxx { kernel } { backwards-quantifier } + \__kernel_msg_error:nnxx { kernel } { backwards-quantifier } { \int_use:N \l_@@_internal_a_int } { \int_use:N \l_@@_internal_b_int } \int_zero:N \l_@@_internal_b_int @@ -2443,7 +2443,7 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_compile_raw_error:N #1 { - \__msg_kernel_error:nnx { kernel } { bad-escape } {#1} + \__kernel_msg_error:nnx { kernel } { bad-escape } {#1} \@@_compile_raw:N #1 } % \end{macrocode} @@ -2502,7 +2502,7 @@ \@@_if_end_range:NNTF #2 #3 { \if_int_compare:w `#1 > `#3 \exp_stop_f: - \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3} + \__kernel_msg_error:nnxx { kernel } { range-backwards } {#1} {#3} \else: \__tl_build_one:x { @@ -2516,7 +2516,7 @@ \fi: } { - \__msg_kernel_warning:nnxx { kernel } { range-missing-end } + \__kernel_msg_warning:nnxx { kernel } { range-missing-end } {#1} { \c_backslash_str #3 } \__tl_build_one:x { @@ -2794,8 +2794,8 @@ \str_case:nn { #2 } { : { \@@_compile_class_posix:NNNNw } - = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } } - . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } } + = { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { = } } + . { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { . } } } } \@@_compile_raw:N [ #1 #2 @@ -2834,7 +2834,7 @@ } } { - \__msg_kernel_warning:nnx { kernel } { posix-unknown } + \__kernel_msg_warning:nnx { kernel } { posix-unknown } { \l_@@_internal_a_tl } \@@_compile_abort_tokens:x { @@ -2844,7 +2844,7 @@ } } { - \__msg_kernel_error:nnxx { kernel } { posix-missing-close } + \__kernel_msg_error:nnxx { kernel } { posix-missing-close } { [: \l_@@_internal_a_tl } { #2 #4 } \@@_compile_abort_tokens:x { [: \l_@@_internal_a_tl } #1 #2 #3 #4 @@ -2886,7 +2886,7 @@ \__tl_build_one:o \l_@@_internal_regex \exp_after:wN \@@_compile_quantifier:w \else: - \__msg_kernel_warning:nn { kernel } { extra-rparen } + \__kernel_msg_warning:nn { kernel } { extra-rparen } \exp_after:wN \@@_compile_raw:N \exp_after:wN ) \fi: } @@ -2910,7 +2910,7 @@ \cs_if_exist_use:cF { @@_compile_special_group_\token_to_str:N #4 :w } { - \__msg_kernel_warning:nnx { kernel } { special-group-unknown } + \__kernel_msg_warning:nnx { kernel } { special-group-unknown } { (? #4 } \@@_compile_group_begin:N \@@_group:nnnN \@@_compile_raw:N ? #3 #4 @@ -2977,7 +2977,7 @@ \cs_set:Npn \@@_item_range:nn { \@@_item_caseless_range:nn } } { - \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 } + \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?i #2 } \@@_compile_raw:N ( \@@_compile_raw:N ? \@@_compile_raw:N i @@ -2993,7 +2993,7 @@ \cs_set:Npn \@@_item_range:nn { \@@_item_caseful_range:nn } } { - \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 } + \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?-#2#4 } \@@_compile_raw:N ( \@@_compile_raw:N ? \@@_compile_raw:N - @@ -3031,7 +3031,7 @@ } { \cs_if_exist_use:cF { @@_compile_c_#2:w } } { - \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2} + \__kernel_msg_error:nnx { kernel } { c-missing-category } {#2} #1 #2 } } @@ -3052,7 +3052,7 @@ { \token_if_eq_charcode:NNF #2 ( } % ) } { \use:n } - { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} } + { \__kernel_msg_error:nnn { kernel } { c-C-invalid } {#2} } #1 #2 } % \end{macrocode} @@ -3105,7 +3105,7 @@ { \@@_compile_c_lbrack_end: } } { - \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2} + \__kernel_msg_error:nnx { kernel } { c-missing-rbrack } {#2} \@@_compile_c_lbrack_end: #1 #2 } @@ -3251,7 +3251,7 @@ \@@_compile_u_loop:NN } { - \__msg_kernel_error:nn { kernel } { u-missing-lbrace } + \__kernel_msg_error:nn { kernel } { u-missing-lbrace } \@@_compile_raw:N u #1 #2 } } @@ -3269,7 +3269,7 @@ } { \if_false: { \fi: } - \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2} + \__kernel_msg_error:nnx { kernel } { u-missing-rbrace } {#2} \@@_compile_u_end: #1 #2 } @@ -3685,11 +3685,11 @@ \@@_compile:n {#1} \@@_build:N \l_@@_internal_regex } -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \@@_build:N } +\__kernel_patch:nnNNpn + { \@@_trace_push:nnN { regex } { 1 } \@@_build:N } { \@@_trace_states:n { 2 } - \__debug_trace_pop:nnN { regex } { 1 } \@@_build:N + \@@_trace_pop:nnN { regex } { 1 } \@@_build:N } \cs_new_protected:Npn \@@_build:N #1 { @@ -3714,11 +3714,11 @@ % work properly at the outer level, we need to put the appropriate % \texttt{left} and \texttt{right} states in their sequence. % \begin{macrocode} -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \@@_build_for_cs:n } +\__kernel_patch:nnNNpn + { \@@_trace_push:nnN { regex } { 1 } \@@_build_for_cs:n } { \@@_trace_states:n { 2 } - \__debug_trace_pop:nnN { regex } { 1 } \@@_build_for_cs:n + \@@_trace_pop:nnN { regex } { 1 } \@@_build_for_cs:n } \cs_new_protected:Npn \@@_build_for_cs:n #1 { @@ -3786,9 +3786,9 @@ % \texttt{right} state is the new empty state, and the \texttt{left} % state points to the previously \enquote{current} state. % \begin{macrocode} -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_trace:nnx { regex } { 2 } + \@@_trace:nnx { regex } { 2 } { regex~new~state~ L=\int_use:N \l_@@_left_state_int ~ -> ~ @@ -3952,9 +3952,9 @@ % auxiliaries expects \texttt{left_state} and \texttt{right_state} to % be set properly. % \begin{macrocode} -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \@@_group_aux:nnnnN } - { \__debug_trace_pop:nnN { regex } { 1 } \@@_group_aux:nnnnN } +\__kernel_patch:nnNNpn + { \@@_trace_push:nnN { regex } { 1 } \@@_group_aux:nnnnN } + { \@@_trace_pop:nnN { regex } { 1 } \@@_group_aux:nnnnN } \cs_new_protected:Npn \@@_group_aux:nnnnN #1#2#3#4#5 { \if_int_compare:w #3 = 0 \exp_stop_f: @@ -4035,9 +4035,9 @@ % the group. The left and right states of the group are extracted from % the relevant sequences. % \begin{macrocode} -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \@@_branch:n } - { \__debug_trace_pop:nnN { regex } { 1 } \@@_branch:n } +\__kernel_patch:nnNNpn + { \@@_trace_push:nnN { regex } { 1 } \@@_branch:n } + { \@@_trace_pop:nnN { regex } { 1 } \@@_branch:n } \cs_new_protected:Npn \@@_branch:n #1 { \@@_build_new_state: @@ -4533,12 +4533,12 @@ % smothering an empty match at the start). Once all this is set up, we % are ready for the ride. Find the first match. % \begin{macrocode} -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_trace_push:nnN { regex } { 1 } \@@_match:n - \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list } + \@@_trace_push:nnN { regex } { 1 } \@@_match:n + \@@_trace:nnx { regex } { 1 } { analyzing~query~token~list } } - { \__debug_trace_pop:nnN { regex } { 1 } \@@_match:n } + { \@@_trace_pop:nnN { regex } { 1 } \@@_match:n } \cs_new_protected:Npn \@@_match:n #1 { \int_zero:N \l_@@_balance_int @@ -4552,8 +4552,8 @@ \@@_match_init: \@@_match_once: } -\__debug_patch:nnNNpn - { \__debug_trace:nnx { regex } { 1 } { initializing } } +\__kernel_patch:nnNNpn + { \@@_trace:nnx { regex } { 1 } { initializing } } { } \cs_new_protected:Npn \@@_match_init: { @@ -4733,8 +4733,8 @@ % state is marked as $\texttt{step}+1$: any thread hitting it at that % point will be terminated. % \begin{macrocode} -\__debug_patch:nnNNpn - { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int } } +\__kernel_patch:nnNNpn + { \@@_trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int } } { } \cs_new_protected:Npn \@@_use_state: { @@ -5098,9 +5098,9 @@ % parsed, make sure that there is no open csname. Finally, define the % \texttt{balance_one_match} and \texttt{do_one_match} functions. % \begin{macrocode} -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \@@_replacement:n } - { \__debug_trace_pop:nnN { regex } { 1 } \@@_replacement:n } +\__kernel_patch:nnNNpn + { \@@_trace_push:nnN { regex } { 1 } \@@_replacement:n } + { \@@_trace_pop:nnN { regex } { 1 } \@@_replacement:n } \cs_new_protected:Npn \@@_replacement:n #1 { \__tl_build:Nw \l_@@_internal_a_tl @@ -5120,14 +5120,14 @@ {#1} \prg_do_nothing: \prg_do_nothing: \if_int_compare:w \l_@@_replacement_csnames_int > 0 \exp_stop_f: - \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace } + \__kernel_msg_error:nnx { kernel } { replacement-missing-rbrace } { \int_use:N \l_@@_replacement_csnames_int } \__tl_build_one:x { \prg_replicate:nn \l_@@_replacement_csnames_int \cs_end: } \fi: \seq_if_empty:NF \l_@@_replacement_category_seq { - \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen } + \__kernel_msg_error:nnx { kernel } { replacement-missing-rparen } { \seq_count:N \l_@@_replacement_category_seq } \seq_clear:N \l_@@_replacement_category_seq } @@ -5361,11 +5361,11 @@ \cs_new_protected:Npn \@@_replacement_cat:NNN #1#2#3 { \token_if_eq_meaning:NNTF \prg_do_nothing: #3 - { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } } + { \__kernel_msg_error:nn { kernel } { replacement-catcode-end } } { \int_compare:nNnTF { \l_@@_replacement_csnames_int } > 0 { - \__msg_kernel_error:nnnn + \__kernel_msg_error:nnnn { kernel } { replacement-catcode-in-cs } {#1} {#3} #2 #3 } @@ -5381,7 +5381,7 @@ { \@@_char_if_alphanumeric:NTF #3 { - \__msg_kernel_error:nnnn + \__kernel_msg_error:nnnn { kernel } { replacement-catcode-escaped } {#1} {#3} } @@ -5543,7 +5543,7 @@ \cs_new_protected:Npn \@@_replacement_c_S:w #1#2 { \if_int_compare:w `#2 = 0 \exp_stop_f: - \__msg_kernel_error:nn { kernel } { replacement-null-space } + \__kernel_msg_error:nn { kernel } { replacement-null-space } \fi: \tex_lccode:D `\ = `#2 \scan_stop: \tex_lowercase:D { \__tl_build_one:n {~} } @@ -5586,7 +5586,7 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_replacement_error:NNN #1#2#3 { - \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3} + \__kernel_msg_error:nnx { kernel } { replacement-#1 } {#3} #2 #3 } % \end{macrocode} @@ -5948,7 +5948,7 @@ { \flag_height:n { @@_begin } + \flag_height:n { @@_end } } = 0 { - \__msg_kernel_error:nnxxx { kernel } { result-unbalanced } + \__kernel_msg_error:nnxxx { kernel } { result-unbalanced } { splitting~or~extracting~submatches } { \flag_height:n { @@_end } } { \flag_height:n { @@_begin } } @@ -6139,7 +6139,7 @@ { \if_int_compare:w \l_@@_balance_int = 0 \exp_stop_f: \else: - \__msg_kernel_error:nnxxx { kernel } { result-unbalanced } + \__kernel_msg_error:nnxxx { kernel } { result-unbalanced } { replacing } { \int_max:nn { - \l_@@_balance_int } { 0 } } { \int_max:nn { \l_@@_balance_int } { 0 } } @@ -6170,20 +6170,20 @@ % % Messages for the preparsing phase. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { trailing-backslash } +\__kernel_msg_new:nnnn { kernel } { trailing-backslash } { Trailing~escape~character~'\iow_char:N\\'. } { A~regular~expression~or~its~replacement~text~ends~with~ the~escape~character~'\iow_char:N\\'.~It~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { x-missing-rbrace } +\__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. } -\__msg_kernel_new:nnnn { kernel } { x-overflow } +\__kernel_msg_new:nnnn { kernel } { x-overflow } { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. } { You~wrote~something~like~ @@ -6195,7 +6195,7 @@ % % Invalid quantifier. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { invalid-quantifier } +\__kernel_msg_new:nnnn { kernel } { invalid-quantifier } { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. } { The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~ @@ -6207,13 +6207,13 @@ % Messages for missing or extra closing brackets and parentheses, with % some fancy singular/plural handling for the case of parentheses. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { missing-rbrack } +\__kernel_msg_new:nnnn { kernel } { missing-rbrack } { Missing~right~bracket~inserted~in~regular~expression. } { LaTeX~was~given~a~regular~expression~where~a~character~class~ was~started~with~'[',~but~the~matching~']'~is~missing. } -\__msg_kernel_new:nnnn { kernel } { missing-rparen } +\__kernel_msg_new:nnnn { kernel } { missing-rparen } { Missing~right~ \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~ @@ -6223,7 +6223,7 @@ LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~ more~left~parentheses~than~right~parentheses. } -\__msg_kernel_new:nnnn { kernel } { extra-rparen } +\__kernel_msg_new:nnnn { kernel } { extra-rparen } { Extra~right~parenthesis~ignored~in~regular~expression. } { LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~ @@ -6233,7 +6233,7 @@ % % Some escaped alphanumerics are not allowed everywhere. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { bad-escape } +\__kernel_msg_new:nnnn { kernel } { bad-escape } { Invalid~escape~'\iow_char:N\\#1'~ \@@_if_in_cs:TF { within~a~control~sequence. } @@ -6261,14 +6261,14 @@ % % Range errors. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { range-missing-end } +\__kernel_msg_new:nnnn { kernel } { range-missing-end } { Invalid~end-point~for~range~'#1-#2'~in~character~class. } { The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~ end-point~for~a~range:~alphanumeric~characters~should~not~be~ escaped,~and~non-alphanumeric~characters~should~be~escaped. } -\__msg_kernel_new:nnnn { kernel } { range-backwards } +\__kernel_msg_new:nnnn { kernel } { range-backwards } { Range~'[#1-#2]'~out~of~order~in~character~class. } { In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~ @@ -6280,34 +6280,34 @@ % % Errors related to |\c| and |\u|. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { c-bad-mode } +\__kernel_msg_new:nnnn { kernel } { c-bad-mode } { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. } { The~'\iow_char:N\\c'~escape~cannot~be~used~within~ a~control~sequence~test~'\iow_char:N\\c{...}'.~ To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'. } -\__msg_kernel_new:nnnn { kernel } { c-C-invalid } +\__kernel_msg_new:nnnn { kernel } { c-C-invalid } { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. } { The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~ control~sequence~or~the~next~group~to~be~made~of~control~sequences.~ It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group. } -\__msg_kernel_new:nnnn { kernel } { c-missing-rbrace } +\__kernel_msg_new:nnnn { kernel } { c-missing-rbrace } { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. } { LaTeX~was~given~a~regular~expression~where~a~ '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~ with~a~closing~brace~'\iow_char:N\}'. } -\__msg_kernel_new:nnnn { kernel } { c-missing-rbrack } +\__kernel_msg_new:nnnn { kernel } { c-missing-rbrack } { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. } { A~construction~'\iow_char:N\\c[...'~appears~in~a~ regular~expression,~but~the~closing~']'~is~not~present. } -\__msg_kernel_new:nnnn { kernel } { c-missing-category } +\__kernel_msg_new:nnnn { kernel } { c-missing-category } { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. } { In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~ @@ -6315,19 +6315,19 @@ capital~letter~representing~a~character~category,~namely~ one~of~'ABCDELMOPSTU'. } -\__msg_kernel_new:nnnn { kernel } { c-trailing } +\__kernel_msg_new:nnnn { kernel } { c-trailing } { Trailing~category~code~escape~'\iow_char:N\\c'... } { A~regular~expression~ends~with~'\iow_char:N\\c'~followed~ by~a~letter.~It~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { u-missing-lbrace } +\__kernel_msg_new:nnnn { kernel } { u-missing-lbrace } { Missing~left~brace~following~'\iow_char:N\\u'~escape. } { The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~ a~brace~group~with~the~name~of~the~variable~to~use. } -\__msg_kernel_new:nnnn { kernel } { u-missing-rbrace } +\__kernel_msg_new:nnnn { kernel } { u-missing-rbrace } { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. } { LaTeX~ @@ -6340,14 +6340,14 @@ % % Errors when encountering the \textsc{posix} syntax |[:...:]|. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { posix-unsupported } +\__kernel_msg_new:nnnn { kernel } { posix-unsupported } { POSIX~collating~element~'[#1 ~ #1]'~not~supported. } { The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~ in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~ Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class? } -\__msg_kernel_new:nnnn { kernel } { posix-unknown } +\__kernel_msg_new:nnnn { kernel } { posix-unknown } { POSIX~class~'[:#1:]'~unknown. } { '[:#1:]'~is~not~among~the~known~POSIX~classes~ @@ -6356,7 +6356,7 @@ '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~ '[:word:]',~and~'[:xdigit:]'. } -\__msg_kernel_new:nnnn { kernel } { posix-missing-close } +\__kernel_msg_new:nnnn { kernel } { posix-missing-close } { Missing~closing~':]'~for~POSIX~class. } { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. } % \end{macrocode} @@ -6365,7 +6365,7 @@ % with an unbalanced token list, which we must re-balance by adding % begin-group or end-group character tokens. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { result-unbalanced } +\__kernel_msg_new:nnnn { kernel } { result-unbalanced } { Missing~brace~inserted~when~#1. } { LaTeX~was~asked~to~do~some~regular~expression~operation,~ @@ -6377,13 +6377,13 @@ % % Error message for unknown options. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { unknown-option } +\__kernel_msg_new:nnnn { kernel } { unknown-option } { Unknown~option~'#1'~for~regular~expressions. } { The~only~available~option~is~'case-insensitive',~toggled~by~ '(?i)'~and~'(?-i)'. } -\__msg_kernel_new:nnnn { kernel } { special-group-unknown } +\__kernel_msg_new:nnnn { kernel } { special-group-unknown } { Unknown~special~group~'#1~...'~in~a~regular~expression. } { The~only~valid~constructions~starting~with~'(?'~are~ @@ -6393,21 +6393,21 @@ % % Errors in the replacement text. % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { replacement-c } +\__kernel_msg_new:nnnn { kernel } { replacement-c } { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~ can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~ or~a~brace~group,~not~by~'#1'. } -\__msg_kernel_new:nnnn { kernel } { replacement-u } +\__kernel_msg_new:nnnn { kernel } { replacement-u } { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~ must~be~~followed~by~a~brace~group~holding~the~name~of~the~ variable~to~use. } -\__msg_kernel_new:nnnn { kernel } { replacement-g } +\__kernel_msg_new:nnnn { kernel } { replacement-g } { Missing~brace~for~the~'\iow_char:N\\g'~construction~ in~a~replacement~text. @@ -6417,7 +6417,7 @@ submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~ or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing. } -\__msg_kernel_new:nnnn { kernel } { replacement-catcode-end } +\__kernel_msg_new:nnnn { kernel } { replacement-catcode-end } { Missing~character~for~the~'\iow_char:N\\c<category><character>'~ construction~in~a~replacement~text. @@ -6428,7 +6428,7 @@ the~character~category.~Then,~a~character~must~follow.~LaTeX~ reached~the~end~of~the~replacement~when~looking~for~that. } -\__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped } +\__kernel_msg_new:nnnn { kernel } { replacement-catcode-escaped } { Escaped~letter~or~digit~after~category~code~in~replacement~text. } @@ -6438,7 +6438,7 @@ the~character~category.~Then,~a~character~must~follow,~not~ '\iow_char:N\\#2'. } -\__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs } +\__kernel_msg_new:nnnn { kernel } { replacement-catcode-in-cs } { Category~code~'\iow_char:N\\c#1#3'~ignored~inside~ '\iow_char:N\\c\{...\}'~in~a~replacement~text. @@ -6448,7 +6448,7 @@ '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~ sequence~name. } -\__msg_kernel_new:nnnn { kernel } { replacement-null-space } +\__kernel_msg_new:nnnn { kernel } { replacement-null-space } { TeX~cannot~build~a~space~token~with~character~code~0. } { You~asked~for~a~character~token~with~category~space,~ @@ -6457,13 +6457,13 @@ This~specific~case~is~impossible~and~will~be~replaced~ by~a~normal~space. } -\__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace } +\__kernel_msg_new:nnnn { kernel } { replacement-missing-rbrace } { Missing~right~brace~inserted~in~replacement~text. } { There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~ missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } . } -\__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen } +\__kernel_msg_new:nnnn { kernel } { replacement-missing-rparen } { Missing~right~parenthesis~inserted~in~replacement~text. } { There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~ @@ -6473,7 +6473,7 @@ % % Used when showing a regex. % \begin{macrocode} -\__msg_kernel_new:nnn { kernel } { show-regex } +\__kernel_msg_new:nnn { kernel } { show-regex } { >~Compiled~regex~ \tl_if_empty:nTF {#1} { variable~ #2 } { {#1} } : @@ -6513,21 +6513,21 @@ % be merged. % % \begin{macro} -% {\__debug_trace_push:nnN, \__debug_trace_pop:nnN, \__debug_trace:nnx} +% {\@@_trace_push:nnN, \@@_trace_pop:nnN, \@@_trace:nnx} % Here |#1| is the module name (\texttt{regex}) and |#2| is % typically~1. If the module's current tracing level is less than % |#2| show nothing, otherwise write |#3| to the terminal. % \begin{macrocode} -\__debug:TF +\__kernel_debug:TF { - \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3 - { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } } - \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3 - { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } } - \cs_new_protected:Npn \__debug_trace:nnx #1#2#3 + \cs_new_protected:Npn \@@_trace_push:nnN #1#2#3 + { \@@_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } } + \cs_new_protected:Npn \@@_trace_pop:nnN #1#2#3 + { \@@_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } } + \cs_new_protected:Npn \@@_trace:nnx #1#2#3 { \int_compare:nNnF - { \int_use:c { g__debug_trace_#1_int } } < {#2} + { \int_use:c { g_@@_trace_#1_int } } < {#2} { \iow_term:x { Trace:~#3 } } } } @@ -6535,10 +6535,10 @@ % \end{macrocode} % \end{macro} % -% \begin{variable}{\g__debug_trace_regex_int} +% \begin{variable}{\g_@@_trace_regex_int} % No tracing when that is zero. % \begin{macrocode} -\int_new:N \g__debug_trace_regex_int +\int_new:N \g_@@_trace_regex_int % \end{macrocode} % \end{variable} % @@ -6547,7 +6547,7 @@ % stored in \tn{toks} from $0$ to \cs{l_@@_max_state_int} % (excluded). % \begin{macrocode} -\__debug:TF +\__kernel_debug:TF { \cs_new_protected:Npn \@@_trace_states:n #1 { @@ -6556,7 +6556,7 @@ { 1 } { \l_@@_max_state_int - 1 } { - \__debug_trace:nnx { regex } {#1} + \@@_trace:nnx { regex } {#1} { \iow_char:N \\toks ##1 = { \@@_toks_use:w ##1 } } } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 0182e9bf0b5..69a8db98fcc 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -735,7 +735,7 @@ % implement sets, one should be careful not to rely on the order of % items in the sequence representing the set. % -% Sets should not contain several occurences of a given item. To make +% Sets should not contain several occurrences of a given item. To make % sure that a \meta{sequence variable} only has distinct items, use % \cs{seq_remove_duplicates:N} \meta{sequence variable}. This function % is relatively slow, and to avoid performance issues one should only @@ -926,7 +926,7 @@ % \begin{macrocode} \cs_new:Npn \@@_item:n { - \__msg_kernel_expandable_error:nn { kernel } { misused-sequence } + \__kernel_msg_expandable_error:nn { kernel } { misused-sequence } \use_none:n } % \end{macrocode} @@ -1871,7 +1871,7 @@ } } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index be237db6c17..ed740f3a2f0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: l3skip.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 @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -386,6 +386,54 @@ % \texttt{false}. % \end{function} % +% \section{Dimension step functions} +% +% \begin{function}[added = 2018-02-18, rEXP] +% {\dim_step_function:nnnN} +% \begin{syntax} +% \cs{dim_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} +% and \meta{final value}, all of which should be dimension expressions. +% The \meta{function} is then placed in front of each \meta{value} +% from the \meta{initial value} to the \meta{final value} in turn +% (using \meta{step} between each \meta{value}). The \meta{step} must +% be non-zero. If the \meta{step} is positive, the loop stops when +% the \meta{value} becomes larger than the \meta{final value}. If the +% \meta{step} is negative, the loop stops when the \meta{value} +% becomes smaller than the \meta{final value}. The \meta{function} +% should absorb one argument. +% \end{function} +% +% \begin{function}[added = 2018-02-18] +% {\dim_step_inline:nnnn} +% \begin{syntax} +% \cs{dim_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} +% and \meta{final value}, all of which should be dimension expressions. +% Then for each \meta{value} from the \meta{initial value} to the +% \meta{final value} in turn (using \meta{step} between each +% \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|). +% \end{function} +% +% \begin{function}[added = 2018-02-18] +% {\dim_step_variable:nnnNn} +% \begin{syntax} +% \cs{dim_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 dimension expressions. +% Then for each \meta{value} from the \meta{initial value} to the +% \meta{final value} in turn (using \meta{step} between each +% \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}. +% \end{function} +% % \section{Using \texttt{dim} expressions and variables} % % \begin{function}[updated = 2011-10-22, EXP]{\dim_eval:n} @@ -1074,7 +1122,7 @@ % \cs{dim_eval:n} to avoid needing a debugging patch that wraps the % expression in checking code. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \dim_const:Nn #1#2 { \dim_new:N #1 @@ -1090,9 +1138,9 @@ % case where the variable passed is incorrectly a skip (for example a % \LaTeXe{} length). % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \dim_zero:N #1 { #1 \c_zero_skip } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \dim_gzero:N #1 { \tex_global:D #1 \c_zero_skip } \cs_generate_variant:Nn \dim_zero:N { c } @@ -1134,10 +1182,10 @@ % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } - { {##1} { \__debug_chk_expr:nNnN {##2} \@@_eval:w { } #3 } } + { {##1} { \__kernel_chk_expr:nNnN {##2} \@@_eval:w { } #3 } } #2 #3 } % \end{macrocode} @@ -1150,10 +1198,10 @@ % where the variable passed is a skip (for example a \LaTeXe{} % length). % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \dim_set:Nn #1#2 { #1 ~ \@@_eval:w #2 \@@_eval_end: \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \dim_gset:Nn #1#2 { \tex_global:D #1 ~ \@@_eval:w #2 \@@_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_set:Nn { c } @@ -1168,11 +1216,11 @@ % All straightforward, with a \cs{scan_stop:} to deal with the case % where |#1| is (incorrectly) a skip. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \dim_set_eq:NN #1#2 { #1 = #2 \scan_stop: } \cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \dim_gset_eq:NN #1#2 { \tex_global:D #1 = #2 \scan_stop: } \cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc } @@ -1191,18 +1239,18 @@ % the local versions. The debugging code is inserted by % \cs{@@_tmp:w}. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \dim_add:Nn #1#2 { \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_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: } \cs_generate_variant:Nn \dim_add:Nn { c } \cs_generate_variant:Nn \dim_gadd:Nn { c } -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \dim_sub:Nn #1#2 { \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_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: } \cs_generate_variant:Nn \dim_sub:Nn { c } @@ -1226,8 +1274,8 @@ % Functions for $\min$, $\max$, and absolute value with only one evaluation. % The absolute value is evaluated by removing a leading~|-| if present. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_abs:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_abs:n } } \cs_new:Npn \dim_abs:n #1 { \exp_after:wN \@@_abs:N @@ -1235,10 +1283,10 @@ } \cs_new:Npn \@@_abs:N #1 { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_max:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \dim_max:nn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_max:nn } + { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \dim_max:nn } } \cs_new:Npn \dim_max:nn #1#2 { @@ -1248,10 +1296,10 @@ > \@@_eval_end: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_min:nn } - { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \dim_min:nn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_min:nn } + { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \dim_min:nn } } \cs_new:Npn \dim_min:nn #1#2 { @@ -1296,11 +1344,11 @@ % \begin{macro}[pTF, EXP]{\dim_compare:nNn} % Simple comparison. % \begin{macrocode} -\__debug_patch_conditional_args:nNNpnn +\__kernel_patch_conditional_args:nNNpnn { - { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_compare:nNn } + { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_compare:nNn } { \@@_eval_end: #2 } - { \__debug_chk_expr:nNnN {#3} \@@_eval:w { } \dim_compare:nNn } + { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \dim_compare:nNn } } \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF } { @@ -1494,13 +1542,106 @@ % \end{macro} % \end{macro} % +% \subsection{Dimension step functions} +% +% \begin{macro}{\dim_step_function:nnnN} +% \begin{macro}{\@@_step:wwwN, \@@_step:NnnnN} +% 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 +% step and loop around. It would be more symmetrical to test for a +% step size of zero before checking the sign, but we optimize for the +% most frequent case (positive step). +% \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 } + } +\cs_new:Npn \dim_step_function:nnnN #1#2#3 + { + \exp_after:wN \@@_step:wwwN + \tex_the:D \@@_eval:w #1 \exp_after:wN ; + \tex_the:D \@@_eval:w #2 \exp_after:wN ; + \tex_the:D \@@_eval:w #3 ; + } +\cs_new:Npn \@@_step:wwwN #1; #2; #3; #4 + { + \dim_compare:nNnTF {#2} > \c_zero_dim + { \@@_step:NnnnN > } + { + \dim_compare:nNnTF {#2} = \c_zero_dim + { + \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4} + \use_none:nnnn + } + { \@@_step:NnnnN < } + } + {#1} {#2} {#3} #4 + } +\cs_new:Npn \@@_step:NnnnN #1#2#3#4#5 + { + \dim_compare:nNnF {#2} #1 {#4} + { + #5 {#2} + \exp_args:NNf \@@_step:NnnnN + #1 { \dim_eval:n { #2 + #3 } } {#3} {#4} #5 + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dim_step_inline:nnnn} +% \begin{macro}{\dim_step_variable:nnnNn} +% \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{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} +% 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 \dim_step_inline:nnnn + { + \int_gincr:N \g__prg_map_int + \exp_args:NNc \@@_step:NNnnnn + \cs_gset_protected:Npn + { __prg_map_ \int_use:N \g__prg_map_int :w } + } +\cs_new_protected:Npn \dim_step_variable:nnnNn #1#2#3#4#5 + { + \int_gincr:N \g__prg_map_int + \exp_args:NNc \@@_step:NNnnnn + \cs_gset_protected:Npx + { __prg_map_ \int_use:N \g__prg_map_int :w } + {#1}{#2}{#3} + { + \tl_set:Nn \exp_not:N #4 {##1} + \exp_not:n {#5} + } + } +\cs_new_protected:Npn \@@_step:NNnnnn #1#2#3#4#5#6 + { + #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 } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Using \texttt{dim} expressions and variables} % % \begin{macro}{\dim_eval:n} % Evaluating a dimension expression expandably. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_eval:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_eval:n } } \cs_new:Npn \dim_eval:n #1 { \dim_use:N \@@_eval:w #1 \@@_eval_end: } % \end{macrocode} @@ -1512,8 +1653,8 @@ % 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} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } } +\__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} @@ -1539,8 +1680,8 @@ % terminating early and leaving extra tokens lying around. This is % used a lot by low-level manipulations. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal:n } } \cs_new:Npn \dim_to_decimal:n #1 { \exp_after:wN @@ -1575,8 +1716,8 @@ % Another hard-coded conversion: this one is necessary to avoid things going % off-scale. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal_in_sp:n } } +\__kernel_patch_args:nNNpn + { { \__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: } } % \end{macrocode} @@ -1677,7 +1818,7 @@ % even for constants. See \cs{dim_const:Nn} for why we cannot use % \cs{skip_gset:Nn}. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \skip_const:Nn #1#2 { \skip_new:N #1 @@ -1691,9 +1832,9 @@ % \begin{macro}{\skip_gzero:N, \skip_gzero:c} % Reset the register to zero. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \skip_zero:N #1 { #1 \c_zero_skip } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \skip_gzero:N #1 { \tex_global:D #1 \c_zero_skip } \cs_generate_variant:Nn \skip_zero:N { c } \cs_generate_variant:Nn \skip_gzero:N { c } @@ -1733,10 +1874,10 @@ % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } - { {##1} { \__debug_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } } + { {##1} { \__kernel_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } } #2 #3 } % \end{macrocode} @@ -1745,10 +1886,10 @@ % \begin{macro}{\skip_gset:Nn, \skip_gset:cn} % Much the same as for dimensions. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \skip_set:Nn #1#2 { #1 ~ \etex_glueexpr:D #2 \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \skip_gset:Nn #1#2 { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_set:Nn { c } @@ -1777,18 +1918,18 @@ % \begin{macro}{\skip_gsub:Nn, \skip_gsub:cn} % Using |by| here deals with the (incorrect) case |\skip123|. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \skip_add:Nn #1#2 { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \skip_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_add:Nn { c } \cs_generate_variant:Nn \skip_gadd:Nn { c } -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \skip_sub:Nn #1#2 { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \skip_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_sub:Nn { c } @@ -1830,10 +1971,10 @@ % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1 { - \__debug_patch_conditional_args:nNNpnn + \__kernel_patch_conditional_args:nNNpnn { { - \__debug_chk_expr:nNnN + \__kernel_chk_expr:nNnN {##1} \etex_glueexpr:D { } \skip_if_finite:n } } @@ -1855,8 +1996,8 @@ % \begin{macro}{\skip_eval:n} % Evaluating a skip expression expandably. % \begin{macrocode} -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } } \cs_new:Npn \skip_eval:n #1 { \skip_use:N \etex_glueexpr:D #1 \scan_stop: } % \end{macrocode} @@ -1878,13 +2019,13 @@ % Inserting skips. % \begin{macrocode} \cs_new_eq:NN \skip_horizontal:N \tex_hskip:D -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } } +\__kernel_patch_args:nNNpn + { { \__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 -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } } +\__kernel_patch_args:nNNpn + { { \__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 } @@ -1967,7 +2108,7 @@ % \begin{macro}{\muskip_const:Nn, \muskip_const:cn} % See \cs{skip_const:Nn}. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \muskip_const:Nn #1#2 { \muskip_new:N #1 @@ -1981,10 +2122,10 @@ % \begin{macro}{\muskip_gzero:N, \muskip_gzero:c} % Reset the register to zero. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \muskip_zero:N #1 { #1 \c_zero_muskip } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \muskip_gzero:N #1 { \tex_global:D #1 \c_zero_muskip } \cs_generate_variant:Nn \muskip_zero:N { c } @@ -2025,13 +2166,13 @@ % \begin{macrocode} \cs_set_protected:Npn \@@_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } { {##1} { - \__debug_chk_expr:nNnN {##2} + \__kernel_chk_expr:nNnN {##2} \etex_muexpr:D { \etex_mutoglue:D } #3 } } @@ -2043,10 +2184,10 @@ % \begin{macro}{\muskip_gset:Nn, \muskip_gset:cn} % This should be pretty familiar. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \muskip_set:Nn #1#2 { #1 ~ \etex_muexpr:D #2 \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \muskip_gset:Nn #1#2 { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_set:Nn { c } @@ -2067,10 +2208,10 @@ % } % All straightforward. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \muskip_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \muskip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc } % \end{macrocode} @@ -2083,18 +2224,18 @@ % \begin{macro}{\muskip_gsub:Nn, \muskip_gsub:cn} % Using |by| here deals with the (incorrect) case |\muskip123|. % \begin{macrocode} -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \muskip_add:Nn #1#2 { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \muskip_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_add:Nn { c } \cs_generate_variant:Nn \muskip_gadd:Nn { c } -\@@_tmp:w \__debug_chk_var_local:N +\@@_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \muskip_sub:Nn #1#2 { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: } -\@@_tmp:w \__debug_chk_var_global:N +\@@_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \muskip_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_sub:Nn { c } @@ -2110,10 +2251,10 @@ % \begin{macro}{\muskip_eval:n} % Evaluating a muskip expression expandably. % \begin{macrocode} -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { { - \__debug_chk_expr:nNnN {#1} \etex_muexpr:D + \__kernel_chk_expr:nNnN {#1} \etex_muexpr:D { \etex_mutoglue:D } \muskip_eval:n } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index d4fa71146b4..31eba1be4f9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx @@ -1,6 +1,6 @@ % \iffalse % -%% File l3sort.dtx (C) Copyright 2012-2017 The LaTeX3 Project +%% File l3sort.dtx (C) Copyright 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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -585,14 +585,14 @@ \cs_new_protected:Npn \@@_return_mark:N #1 { } \cs_new_protected:Npn \@@_return_none_error: { - \__msg_kernel_error:nnxx { kernel } { return-none } + \__kernel_msg_error:nnxx { kernel } { return-none } { \tex_the:D \tex_toks:D \l_@@_A_int } { \tex_the:D \tex_toks:D \l_@@_C_int } \@@_return_same: } \cs_new_protected:Npn \@@_return_two_error:w #1 \@@_return_none_error: - { \__msg_kernel_error:nn { kernel } { return-two } } + { \__kernel_msg_error:nn { kernel } { return-two } } % \end{macrocode} % \end{macro} % \end{macro} @@ -1013,12 +1013,12 @@ { \cs_set_eq:NN \toksdef \@@_disabled_toksdef:n } \cs_new_protected:Npn \@@_disabled_toksdef:n #1 { - \__msg_kernel_error:nnx { kernel } { toksdef } + \__kernel_msg_error:nnx { kernel } { toksdef } { \token_to_str:N #1 } \@@_error: \tex_toksdef:D #1 } -\__msg_kernel_new:nnnn { kernel } { toksdef } +\__kernel_msg_new:nnnn { kernel } { toksdef } { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. } { The~comparison~code~used~for~sorting~a~list~has~attempted~to~ @@ -1037,13 +1037,13 @@ \cs_new_protected:Npn \@@_too_long_error:NNw #1#2 \fi: { \fi: - \__msg_kernel_error:nnxxx { kernel } { too-large } + \__kernel_msg_error:nnxxx { kernel } { too-large } { \token_to_str:N #2 } { \int_eval:n { \l_@@_true_max_int - \l_@@_min_int } } { \int_eval:n { \l_@@_top_int - \l_@@_min_int } } #1 \@@_error: } -\__msg_kernel_new:nnnn { kernel } { too-large } +\__kernel_msg_new:nnnn { kernel } { too-large } { The~list~#1~is~too~long~to~be~sorted~by~TeX. } { TeX~has~#2~toks~registers~still~available:~ @@ -1054,7 +1054,7 @@ % \end{macro} % % \begin{macrocode} -\__msg_kernel_new:nnnn { kernel } { return-none } +\__kernel_msg_new:nnnn { kernel } { return-none } { The~comparison~code~did~not~return. } { When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~ @@ -1063,7 +1063,7 @@ \iow_char:N\\sort_return_swapped: .~ Exactly~one~of~these~should~be~called. } -\__msg_kernel_new:nnnn { kernel } { return-two } +\__kernel_msg_new:nnnn { kernel } { return-two } { The~comparison~code~returned~multiple~times. } { When~sorting~a~list,~the~code~to~compare~items~called~ @@ -1078,9 +1078,9 @@ % \begin{macro}[deprecated = 2018-12-31]{\sort_ordered:, \sort_reversed:} % These functions were renamed for consistency. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: } \cs_new_protected:Npn \sort_ordered: { \sort_return_same: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: } \cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index f192b81948d..bcf24c33bc5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3str.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 @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1012,7 +1012,7 @@ { \tl_if_empty:nTF {#4} { - \__msg_kernel_error:nnx { kernel } { empty-search-pattern } {#5} + \__kernel_msg_error:nnx { kernel } { empty-search-pattern } {#5} } { \use:x @@ -1496,7 +1496,7 @@ } \cs_new:Npn \str_item_ignore_spaces:nn #1 { \exp_args:No \@@_item:nn { \tl_to_str:n {#1} } } -\__debug_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } } +\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } } \cs_new:Npn \@@_item:nn #1#2 { \exp_after:wN \@@_item:w @@ -1593,7 +1593,7 @@ } \cs_new:Npn \str_range_ignore_spaces:nnn #1 { \exp_args:No \@@_range:nnn { \tl_to_str:n {#1} } } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } } \cs_new:Npn \@@_range:nnn #1#2#3 { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index dc275b1236e..a3314333f0a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index f84510166f1..0e3a85e268e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -1078,7 +1078,7 @@ % \end{variable} % % \begin{macrocode} -\__msg_kernel_new:nnn { kernel } { show-tl-analysis } +\__kernel_msg_new:nnn { kernel } { show-tl-analysis } { The~token~list~ \tl_if_empty:nF {#1} { #1 ~ } \tl_if_empty:nTF {#2} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx index a6a7a25e4cd..00a4308c2e7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 086b68ffdde..ef429b9d7dd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3tl.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% File: l3tl.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 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -988,7 +988,7 @@ % appropriate item from the \meta{token list} in the input stream. % If the \meta{integer expression} is negative, indexing occurs from % the right of the token list, starting at $-1$ for the right-most item. -% If the index is out of bounds, then thr function expands to nothing. +% If the index is out of bounds, then the function expands to nothing. % \begin{texnote} % The result is returned within the \tn{unexpanded} % primitive (\cs{exp_not:n}), which means that the \meta{item} @@ -1131,13 +1131,13 @@ % \begin{macro}{\tl_const:Nn, \tl_const:Nx, \tl_const:cn, \tl_const:cx} % Constants are also easy to generate. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__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 \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__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 @@ -1186,14 +1186,14 @@ \tex_ifodd:D \l@expl@enable@debug@bool \cs_new_protected:Npn \tl_set_eq:NN #1#2 { - \__debug_chk_var_local:N #1 - \__debug_chk_var_exist:N #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 { - \__debug_chk_var_global:N #1 - \__debug_chk_var_exist:N #2 + \__kernel_chk_var_global:N #1 + \__kernel_chk_var_exist:N #2 \cs_gset_eq:NN #1 #2 } \else: @@ -1212,18 +1212,18 @@ % three arguments must be checked: a token list |#2| or |#3| equal to % \cs{scan_stop:} would lead to problems later on. % \begin{macrocode} -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_chk_var_exist:N #2 - \__debug_chk_var_exist:N #3 + \__kernel_chk_var_exist:N #2 + \__kernel_chk_var_exist:N #3 } { } \cs_new_protected:Npn \tl_concat:NNN #1#2#3 { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_chk_var_exist:N #2 - \__debug_chk_var_exist:N #3 + \__kernel_chk_var_exist:N #2 + \__kernel_chk_var_exist:N #3 } { } \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3 @@ -1292,25 +1292,25 @@ % which makes the token list registers provided by \TeX{} % more or less redundant. The \cs{tl_set:No} version is done % \enquote{by hand} as it is used quite a lot. Each definition is -% prefixed by a call to \cs{__debug_patch:nnNNpn} which adds an +% prefixed by a call to \cs{__kernel_patch:nnNNpn} which adds an % existence check to the definition. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:Nx #1#2 { \cs_set_nopar:Npx #1 {#2} } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:Nx #1#2 { \cs_gset_nopar:Npx #1 {#2} } \cs_generate_variant:Nn \tl_set:Nn { NV , Nv , Nf } @@ -1335,28 +1335,28 @@ % } % Adding to the left is done directly to gain a little performance. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:NV #1#2 { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:Nx #1#2 { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:NV #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:Nx #1#2 { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } } \cs_generate_variant:Nn \tl_put_left:Nn { c } @@ -1385,28 +1385,28 @@ % } % The same on the right. % \begin{macrocode} -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:NV #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:Nx #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:NV #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:Nx #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } } \cs_generate_variant:Nn \tl_put_right:Nn { c } @@ -1757,7 +1757,7 @@ { \tl_if_empty:nTF {#6} { - \__msg_kernel_error:nnx { kernel } { empty-search-pattern } + \__kernel_msg_error:nnx { kernel } { empty-search-pattern } { \tl_to_str:n {#7} } } { @@ -2316,7 +2316,7 @@ { \tl_if_exist:NTF #1 {#1} { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} } } @@ -3041,9 +3041,9 @@ % \begin{macro}[deprecated=2017-12-31]{\tl_to_lowercase:n, \tl_to_uppercase:n} % For removal after 2017-12-31. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D } \cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} } -\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D } \cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index cca43cdd93c..b6d06510a9a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project +%% File: l3token.dtx Copyright (C) 2005-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 @@ -12,6 +12,7 @@ % 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 @@ -41,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/12/16} +% \date{Released 2018/02/21} % % \maketitle % @@ -701,7 +702,7 @@ % \cs{token_if_toks_register:NTF} \meta{token} \Arg{true code} \Arg{false code} % \end{syntax} % Tests if the \meta{token} is defined to be a toks register -% (not used by\LaTeX3). +% (not used by \LaTeX3). % \end{function} % % \begin{function}[updated = 2011-05-23, EXP,pTF]{\token_if_primitive:N} @@ -1367,7 +1368,7 @@ % the interface layer, turn the two arguments into integers up-front so % this is only done once. % \begin{macrocode} -\__debug_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } } +\__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 @@ -1393,13 +1394,13 @@ \cs_new:Npn \@@_generate_aux:w #1 ; #2 ; { \if_int_compare:w #2 = 13 \exp_stop_f: - \__msg_kernel_expandable_error:nn { kernel } { char-active } + \__kernel_msg_expandable_error:nn { kernel } { char-active } \else: \if_int_compare:w #2 = 10 \exp_stop_f: \if_int_compare:w #1 = 0 \exp_stop_f: - \__msg_kernel_expandable_error:nn { kernel } { char-null-space } + \__kernel_msg_expandable_error:nn { kernel } { char-null-space } \else: - \__msg_kernel_expandable_error:nn { kernel } { char-space } + \__kernel_msg_expandable_error:nn { kernel } { char-space } \fi: \else: \if_int_odd:w 0 @@ -1407,13 +1408,13 @@ \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: - \__msg_kernel_expandable_error:nn { kernel } + \__kernel_msg_expandable_error:nn { kernel } { char-invalid-catcode } \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: - \__msg_kernel_expandable_error:nn { kernel } + \__kernel_msg_expandable_error:nn { kernel } { char-out-of-range } \else: \@@_generate_aux:nnw {#1} {#2} @@ -2556,7 +2557,7 @@ % \begin{macro}[deprecated=2018-12-31]{\token_new:Nn} % For removal after 2018-12-31. % \begin{macrocode} -\__debug_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN } +\__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 } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty b/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty new file mode 100644 index 00000000000..9b5e7cabac5 --- /dev/null +++ b/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty @@ -0,0 +1,360 @@ +%% +%% This is file `l3color.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% l3color.dtx (with options: `package') +%% +%% 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 license or (at your option) any later version. The latest +%% version of this license is in the file: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This file is part of the "l3experimental bundle" (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% File: l3color.dtx Copyright(C) 2017-2018 The LaTeX3 Project +\RequirePackage{expl3} +\ProvidesExplPackage{l3color}{2018/02/21}{} + {L3 Experimental color support} +\tl_new:N \l__color_tmp_tl +\prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF } + { + \tl_if_exist:cTF { l__color_named_ #1 _tl } + \prg_return_true: + \prg_return_false: + } +\cs_new_protected:Npn \__color_extract:nNN #1#2#3 + { + \exp_after:wN \exp_after:wN \exp_after:wN + \__color_extract:NNw + \exp_after:wN \exp_after:wN \exp_after:wN #2 + \exp_after:wN \exp_after:wN \exp_after:wN #3 + \cs:w l__color_named_ #1 _tl \cs_end: \q_stop + } +\cs_generate_variant:Nn \__color_extract:nNN { V } +\cs_new_protected:Npn \__color_extract:NNw #1#2 #3 ~ #4 \q_stop + { + \tl_set:Nn #1 {#3} + \tl_set:Nn #2 {#4} + } +\cs_new_protected:Npn \__color_convert:nnN #1#2#3 + { \__color_convert:nnVN {#1} {#2} #3 #3 } +\cs_generate_variant:Nn \__color_convert:nnN { VV } +\cs_new_protected:Npn \__color_convert:nnnN #1#2#3#4 + { + \str_if_eq_x:nnT {#1} { spot } % TO DO!!! + { } + \tl_set:Nx #4 + { \use:c { __color_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \q_stop } + } +\cs_generate_variant:Nn \__color_convert:nnnN { nnV } +\cs_new:Npn \__color_convert_gray_rgb:w #1 ~ #2 \q_stop + { #1 ~ #1 ~ #1 } +\cs_new:Npn \__color_convert_gray_cmyk:w #1 ~ #2 \q_stop + { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } } +\cs_new:Npn \__color_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \q_stop + { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } } +\cs_new:Npn \__color_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop + { + \exp_args:Nf \__color_convert_rgb_cmyk:nnnn + { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3} + } +\cs_new:Npn \__color_convert_rgb_cmyk:nnnn #1#2#3#4 + { + \fp_eval:n { min ( 1 , max ( 0 , 1 - #2 - #1 ) ) } \c_space_tl + \fp_eval:n { min ( 1 , max ( 0 , 1 - #3 - #1 ) ) } \c_space_tl + \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl + #1 + } +\cs_new:Npn \__color_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop + { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } } +\cs_new:Npn \__color_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop + { + \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl + \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl + \fp_eval:n { 1 - min ( 1 , #3 + #4 ) } + } +\tl_new:N \l__color_model_tl +\tl_new:N \l__color_value_tl +\tl_new:N \l__color_next_model_tl +\tl_new:N \l__color_next_value_tl +\cs_new_protected:Npn \color_parse:nN #1#2 + { + \group_begin: + \seq_map_inline:Nn \l_char_active_seq + { + \tl_set:Nx \l__color_tmp_tl { \cs_to_str:N ##1 } + \char_set_active_eq:NN ##1 \l__color_tmp_tl + } + \tl_set:Nx \l__color_tmp_tl {#1} + \exp_args:NNV \group_end: + \__color_parse:nN \l__color_tmp_tl #2 + } +\cs_new_protected:Npn \__color_parse:nN #1#2 + { + \tl_if_exist:cTF { l__color_named_ #1 _tl } + { \tl_set_eq:Nc #2 { l__color_named_ #1 _tl } } + { \__color_parse:Nw #2#1 ! \q_stop } + } +\cs_new_protected:Npn \__color_parse:Nw #1#2 ! #3 \q_stop + { + \__color_if_defined:nTF {#2} + { + \tl_if_blank:nTF {#3} + { \tl_set_eq:Nc #1 { l__color_named_ #2 _tl } } + { \__color_parse_loop_init:Nnn #1 {#2} {#3} } + } + { + \__kernel_msg_error:nnn { color } { unknown-color } {#3} + \tl_set_eq:NN \l__color_current_tl \l__color_named_black_tl + } + } +\cs_new_protected:Npn \__color_parse_loop_init:Nnn #1#2#3 + { + \group_begin: + \__color_extract:nNN {#2} \l__color_model_tl \l__color_value_tl + \__color_parse_loop:w #3 ! ! ! ! \q_stop + \tl_set:Nx \l__color_tmp_tl + { \l__color_model_tl \c_space_tl \l__color_value_tl } + \exp_args:NNNV \group_end: + \tl_set:Nn #1 \l__color_tmp_tl + } +\cs_new_protected:Npn \__color_parse_loop:w #1 ! #2 ! #3 ! #4 ! #5 \q_stop + { + \bool_lazy_or:nnF + { \tl_if_blank_p:n {#1} } + { \int_compare_p:nNn {#1} = { 100 } } + { + \int_compare:nNnTF {#1} = { 0 } + { + \tl_if_blank:nTF {#2} + { \__color_extract:nNN { white } } + { \__color_extract:nNN {#2} } + \l__color_model_tl \l__color_value_tl + } + { + \use:x + { + \__color_parse_loop:nn {#1} + { \tl_if_blank:nTF {#2} { white } {#2} } + } + } + } + \tl_if_blank:nF {#3} + { \__color_parse_loop:w #3 ! #4 ! #5 \q_stop } + \__color_parse_end: + } +\cs_new_protected:Npn \__color_parse_loop:nn #1#2 + { + \__color_if_defined:nTF {#2} + { + \__color_extract:nNN {#2} \l__color_next_model_tl \l__color_next_value_tl + \tl_if_eq:NNF \l__color_model_tl \l__color_next_model_tl + { + \str_if_eq_x:nnT { \l__color_model_tl } { gray } + { + \use:x + { + \tl_set:Nn \exp_not:N \l__color_model_tl + { \l__color_next_model_tl } + \tl_set:Nn \exp_not:N \l__color_value_tl + { \l__color_next_value_tl } + \tl_set:Nn \exp_not:N \l_next__color_model_tl + { \l__color_model_tl } + \tl_set:Nn \exp_not:N \l_next__color_value_tl + { \l__color_value_tl } + } + } + \__color_convert:VVN + \l__color_next_model_tl + \l__color_model_tl + \l__color_next_value_tl + } + \tl_set:Nx \l__color_value_tl + { + \__color_parse_mix:NVVn + \l__color_model_tl \l__color_value_tl \l__color_next_value_tl {#1} + } + } + { + \__kernel_msg_error:nnn { color } { unknown-color } {#2} + \__color_extract:nNN { black } \l__color_model_tl \l__color_value_tl + \__color_parse_break:w + } + } +\cs_new_protected:Npn \__color_parse_break:w #1 \__color_parse_end: { } +\cs_new_protected:Npn \__color_parse_end: { } +\cs_new:Npn \__color_parse_mix:Nnnn #1#2#3#4 + { + \exp_args:Nf \__color_parse_mix:nNnn + { \fp_eval:n { #4 / 100 } } + #1 {#2} {#3} + } +\cs_generate_variant:Nn \__color_parse_mix:Nnnn { NVV } +\cs_new:Npn \__color_parse_mix:nNnn #1#2#3#4 + { + \use:c { __color_parse_mix_ #2 :nw } {#1} + #3 \q_mark #4 \q_stop + } +\cs_new:Npn \__color_parse_mix_gray:nw #1#2 \q_mark #3 \q_stop + { \fp_eval:n { #2 * #1 + #3 * ( 1 - #1 ) } } +\cs_new:Npn \__color_parse_mix_rgb:nw + #1#2 ~ #3 ~ #4 \q_mark #5 ~ #6 ~ #7 \q_stop + { + \fp_eval:n { #2 * #1 + #5 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #3 * #1 + #6 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #4 * #1 + #7 * ( 1 - #1 ) } + } +\cs_new:Npn \__color_parse_mix_cmyk:nw + #1#2 ~ #3 ~ #4 ~ #5 \q_mark #6 ~ #7 ~ #8 ~ #9 \q_stop + { + \fp_eval:n { #2 * #1 + #6 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #3 * #1 + #7 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #4 * #1 + #8 * ( 1 - #1 ) } \c_space_tl + \fp_eval:n { #5 * #1 + #9 * ( 1 - #1 ) } + } +\cs_new:Npn \__color_parse_gray:w #1 , #2 \q_stop {#1} +\cs_new:Npn \__color_parse_rgb:w #1 , #2 , #3 , #4 \q_stop { #1 ~ #2 ~ #3 } +\cs_new:Npn \__color_parse_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop + { #1 ~ #2 ~ #3 ~ #4 } +\cs_new:Npn \__color_parse_spot:w #1 , #2 \q_stop + { \__color_parse_spot_aux:w #1 ! 100 ! \q_stop } +\cs_new:Npn \__color_parse_spot_aux:w #1 ! #2 ! #3 \q_stop + { #1 ~ \fp_eval:n { #2 / 100 } } +\tl_new:N \l_color_fixed_model_tl +\cs_new_protected:Npn \__color_select: + { + \__color_finalise:N \l__color_current_tl + \tl_set_eq:cN { l__color_named_ . _tl } \l__color_current_tl + \__color_select:V \l__color_current_tl + } +\cs_new_protected:Npn \__color_finalise:N #1 + { + \tl_if_empty:NF \l_color_fixed_model_tl + { + \exp_after:wN \__color_finalise:w #1 \q_stop + \tl_if_eq:NNF \l__color_model_tl \l_color_fixed_model_tl + { + \__color_convert:VVN \l__color_model_tl \l_color_fixed_model_tl + \l__color_value_tl + } + \tl_set:Nx #1 + { \l_color_fixed_model_tl \c_space_tl \l__color_value_tl } + } + } +\cs_new_protected:Npn \__color_finalise:w #1 ~ #2 \q_stop + { + \tl_set:Nn \l__color_model_tl {#1} + \tl_set:Nn \l__color_value_tl {#2} + } +\cs_new_protected:Npn \color_select:n #1 + { + \color_parse:nN {#1} \l__color_current_tl + \__color_select: + } +\cs_new_protected:Npn \color_select:nn #1#2 + { + \__color_direct:nnN {#1} {#2} \l__color_current_tl + \__color_select: + } +\cs_new_protected:Npn \__color_direct:nnN #1#2#3 + { + \cs_if_exist:cTF { __color_parse_ #1 :w } + { + \tl_set:Nx #3 + { #1 ~ \use:c { __color_parse_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop } + } + { + \__kernel_msg_error:nnn { color } { invalid-model } {#1} + } + } +\tl_new:N \l__color_named_tl +\cs_new_protected:Npn \__color_store:Nn #1#2 + { + \str_if_eq:nnF {#2} { . } + { + \tl_clear_new:c { l__color_named_ #2 _tl } + \tl_set_eq:cN { l__color_named_ #2 _tl } #1 + } + } +\cs_new_protected:Npn \color_set:nn #1#2 + { + \color_parse:nN {#2} \l__color_named_tl + \__color_store:Nn \l__color_named_tl {#1} + } +\cs_new_protected:Npn \color_set:nnn #1#2#3 + { + \__color_direct:nnN {#2} {#3} \l__color_named_tl + \__color_store:Nn \l__color_named_tl {#1} + } +\cs_new_protected:Npn \color_set_eq:nn #1#2 + { + \__color_if_defined:nTF {#2} + { + \tl_clear_new:c { l__color_named_ #1 _tl } + \str_if_eq:nnTF {#2} { . } + { \tl_set_eq:cN { l__color_named_ #1 _tl } \l__color_current_tl } + { \tl_set_eq:cc { l__color_named_ #1 _tl } { l__color_named_ #2 _tl } } + } + { + \__kernel_msg_error:nnn { color } { unknown-color } {#2} + } + } +\color_set:nnn { black } { gray } { 0 } +\color_set:nnn { white } { gray } { 1 } +\color_set:nnn { cyan } { cmyk } { 1 , 0 , 0 , 0 } +\color_set:nnn { magenta } { cmyk } { 0 , 1 , 0 , 0 } +\color_set:nnn { yellow } { cmyk } { 0 , 0 , 1 , 0 } +\color_set:nnn { red } { rgb } { 1 , 0 , 0 } +\color_set:nnn { green } { rgb } { 0 , 1 , 0 } +\color_set:nnn { blue } { rgb } { 0 , 0 , 1 } +\tl_new:c { l__color_named_._tl } +\cs_new_protected:Npn \color_show:n #1 + { + \msg_show:nnxxxx { LaTeX / color } { show } + {#1} + { + \__color_if_defined:nTF {#1} + { \exp_last_unbraced:Nv \__color_show:w { l__color_named_ #1 _tl } \q_stop } + { } + } + { } + { } + } +\cs_new:Npn \__color_show:w #1 ~ #2 \q_stop + { + \msg_show_item_unbraced:nn { model } {#1} + \exp_args:Nnf \msg_show_item_unbraced:nn { value } + { \use:c { __color_show_ #1 :w } #2 \q_stop } + } +\cs_new:Npn \__color_show_gray:w #1 \q_stop { #1 } +\cs_new:Npn \__color_show_rgb:w #1 ~ #2 ~ #3 \q_stop { #1 ,~ #2 ,~ #3 } +\cs_new:Npn \__color_show_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop { #1 ,~ #2 ,~ #3 ,~ #4 } +\__kernel_msg_new:nnnn { color } { invalid-model } + { Invalid~color~model~'#1'. } + { + LaTeX~has~been~asked~to~use~a~color~model~called~'#1',~ + but~this~model~is~not~set~up. + } +\__kernel_msg_new:nnnn { color } { unknown-color } + { Unknown~color~'#1'. } + { + LaTeX~has~been~asked~to~use~a~color~named~'#1',~ + but~this~has~never~been~defined. + } +\__kernel_msg_new:nnn { color } { show } + { + The~color~#1~ + \tl_if_empty:nTF {#2} + { is~undefined. } + { has~the~properties: #2 } + } +%% +%% +%% End of file `l3color.sty'. diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty new file mode 100644 index 00000000000..d485673b419 --- /dev/null +++ b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty @@ -0,0 +1,1347 @@ +%% +%% This is file `l3draw.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% l3draw.dtx (with options: `package') +%% l3draw-paths.dtx (with options: `package') +%% l3draw-points.dtx (with options: `package') +%% l3draw-scopes.dtx (with options: `package') +%% l3draw-softpath.dtx (with options: `package') +%% l3draw-state.dtx (with options: `package') +%% l3draw-transforms.dtx (with options: `package') +%% +%% 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: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This file is part of the "l3experimental bundle" (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% File: l3draw.dtx Copyright(C) 2018 The LaTeX3 Project +\RequirePackage{expl3} +\ProvidesExplPackage{l3draw}{2018/02/21}{} + {L3 Experimental core drawing support} +\RequirePackage { l3color } +%% File: l3draw-paths.dtx Copyright(C) 2018 The LaTeX3 Project +\tl_new:N \l__draw_path_tmp_tl +\fp_new:N \l__draw_path_tmpa_fp +\fp_new:N \l__draw_path_tmpb_fp +\dim_new:N \g__draw_path_lastx_dim +\dim_new:N \g__draw_path_lasty_dim +\dim_new:N \g__draw_path_xmax_dim +\dim_new:N \g__draw_path_xmin_dim +\dim_new:N \g__draw_path_ymax_dim +\dim_new:N \g__draw_path_ymin_dim +\cs_new_protected:Npn \__draw_path_update_limits:nn #1#2 + { + \dim_gset:Nn \g__draw_path_xmax_dim + { \dim_max:nn \g__draw_path_xmax_dim {#1} } + \dim_gset:Nn \g__draw_path_xmin_dim + { \dim_min:nn \g__draw_path_xmin_dim {#1} } + \dim_gset:Nn \g__draw_path_ymax_dim + { \dim_max:nn \g__draw_path_ymax_dim {#2} } + \dim_gset:Nn \g__draw_path_ymin_dim + { \dim_min:nn \g__draw_path_ymin_dim {#2} } + \bool_if:NT \l__draw_update_bb_bool + { + \dim_gset:Nn \g__draw_xmax_dim + { \dim_max:nn \g__draw_xmax_dim {#1} } + \dim_gset:Nn \g__draw_xmin_dim + { \dim_min:nn \g__draw_xmin_dim {#1} } + \dim_gset:Nn \g__draw_ymax_dim + { \dim_max:nn \g__draw_ymax_dim {#2} } + \dim_gset:Nn \g__draw_ymin_dim + { \dim_min:nn \g__draw_ymin_dim {#2} } + } + } +\cs_new_protected:Npn \__draw_path_reset_limits: + { + \dim_gset:Nn \g__draw_path_xmax_dim { -\c_max_dim } + \dim_gset:Nn \g__draw_path_xmin_dim { \c_max_dim } + \dim_gset:Nn \g__draw_path_ymax_dim { -\c_max_dim } + \dim_gset:Nn \g__draw_path_ymin_dim { \c_max_dim } + } +\cs_new_protected:Npn \__draw_path_update_last:nn #1#2 + { + \dim_gset:Nn \g__draw_path_lastx_dim {#1} + \dim_gset:Nn \g__draw_path_lasty_dim {#2} + } +\dim_new:N \l__draw_corner_xarc_dim +\dim_new:N \l__draw_corner_yarc_dim +\bool_new:N \l__draw_corner_arc_bool +\cs_new_protected:Npn \draw_path_corner_arc:n #1 + { + \__draw_point_process:nn { \__draw_path_corner_arc:nn } {#1} + } +\cs_new_protected:Npn \__draw_path_corner_arc:nn #1#2 + { + \dim_set:Nn \l__draw_corner_xarc_dim {#1} + \dim_set:Nn \l__draw_corner_yarc_dim {#2} + \bool_lazy_and:nnTF + { \dim_compare_p:nNn \l__draw_corner_xarc_dim = { 0pt } } + { \dim_compare_p:nNn \l__draw_corner_yarc_dim = { 0pt } } + { \bool_set_false:N \l__draw_corner_arc_bool } + { \bool_set_true:N \l__draw_corner_arc_bool } + } +\cs_new_protected:Npn \__draw_path_mark_corner: + { + \bool_if:NT \l__draw_corner_arc_bool + { + \__draw_softpath_roundpoint:VV + \l__draw_corner_xarc_dim + \l__draw_corner_yarc_dim + } + } +\cs_new_protected:Npn \draw_path_moveto:n #1 + { + \__draw_point_process:nn + { \__draw_path_moveto:nn } + { \draw_point_transform:n {#1} } + } +\cs_new_protected:Npn \__draw_path_moveto:nn #1#2 + { + \__draw_path_update_limits:nn {#1} {#2} + \__draw_softpath_moveto:nn {#1} {#2} + \__draw_path_update_last:nn {#1} {#2} + } +\cs_new_protected:Npn \draw_path_lineto:n #1 + { + \__draw_point_process:nn + { \__draw_path_lineto:nn } + { \draw_point_transform:n {#1} } + } +\cs_new_protected:Npn \__draw_path_lineto:nn #1#2 + { + \__draw_path_mark_corner: + \__draw_path_update_limits:nn {#1} {#2} + \__draw_softpath_lineto:nn {#1} {#2} + \__draw_path_update_last:nn {#1} {#2} + } +\cs_new_protected:Npn \draw_path_curveto:nnn #1#2#3 + { + \__draw_point_process:nnn + { + \__draw_point_process:nn + { + \__draw_path_mark_corner: + \__draw_path_curveto:nnnnnn + } + { \draw_point_transform:n {#1} } + } + { \draw_point_transform:n {#2} } + { \draw_point_transform:n {#3} } + } +\cs_new_protected:Npn \__draw_path_curveto:nnnnnn #1#2#3#4#5#6 + { + \__draw_path_update_limits:nn {#1} {#2} + \__draw_path_update_limits:nn {#3} {#4} + \__draw_path_update_limits:nn {#5} {#6} + \__draw_softpath_curveto:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \__draw_path_update_last:nn {#5} {#6} + } +\cs_new_protected:Npn \draw_path_close: + { + \__draw_path_mark_corner: + \__draw_softpath_closepath: + } +\cs_new_protected:Npn \draw_path_curveto:nn #1#2 + { + \__draw_point_process:nnn + { \__draw_path_curveto:nnnn } + { \draw_point_transform:n {#1} } + { \draw_point_transform:n {#2} } + } +\cs_new_protected:Npn \__draw_path_curveto:nnnn #1#2#3#4 + { + \fp_set:Nn \l__draw_path_tmpa_fp { \c__draw_path_curveto_b_fp * #1 } + \fp_set:Nn \l__draw_path_tmpb_fp { \c__draw_path_curveto_b_fp * #2 } + \use:x + { + \__draw_path_mark_corner: + \__draw_path_curveto:nnnnnn + { + \fp_to_dim:n + { + \c__draw_path_curveto_a_fp * \g__draw_path_lastx_dim + + \l__draw_path_tmpa_fp + } + } + { + \fp_to_dim:n + { + \c__draw_path_curveto_a_fp * \g__draw_path_lasty_dim + + \l__draw_path_tmpb_fp + } + } + { + \fp_to_dim:n + { \c__draw_path_curveto_a_fp * #3 + \l__draw_path_tmpa_fp } + } + { + \fp_to_dim:n + { \c__draw_path_curveto_a_fp * #4 + \l__draw_path_tmpb_fp } + } + {#3} + {#4} + } + } +\fp_const:Nn \c__draw_path_curveto_a_fp { 1 / 3 } +\fp_const:Nn \c__draw_path_curveto_b_fp { 2 / 3 } +\cs_new_protected:Npn \draw_path_arc:nnn #1#2#3 + { \draw_path_arc:nnnn {#1} {#2} {#3} {#3} } +\cs_new_protected:Npn \draw_path_arc:nnnn #1#2#3#4 + { + \use:x + { + \__draw_path_arc:nnnn + { \fp_eval:n {#1} } + { \fp_eval:n {#2} } + { \fp_to_dim:n {#3} } + { \fp_to_dim:n {#4} } + } + } +\cs_new_protected:Npn \__draw_path_arc:nnnn #1#2#3#4 + { + \fp_compare:nNnTF {#1} > {#2} + { \__draw_path_arc:nnNnn {#1} {#2} - {#3} {#4} } + { \__draw_path_arc:nnNnn {#1} {#2} + {#3} {#4} } + } +\cs_new_protected:Npn \__draw_path_arc:nnNnn #1#2#3#4#5 + { + \fp_set:Nn \l__draw_path_arc_start_fp {#1} + \fp_set:Nn \l__draw_path_arc_delta_fp { abs( #1 - #2 ) } + \fp_while_do:nNnn { \l__draw_path_arc_delta_fp } > { 90 } + { + \fp_compare:nNnTF \l__draw_path_arc_delta_fp > { 115 } + { + \__draw_path_arc_auxi:ffnnNnn + { \fp_to_decimal:N \l__draw_path_arc_start_fp } + { \fp_eval:n { \l__draw_path_arc_start_fp #3 90 } } + { 90 } {#2} + #3 {#4} {#5} + } + { + \__draw_path_arc_auxi:ffnnNnn + { \fp_to_decimal:N \l__draw_path_arc_start_fp } + { \fp_eval:n { \l__draw_path_arc_start_fp #3 60 } } + { 60 } {#2} + #3 {#4} {#5} + } + } + \__draw_path_mark_corner: + \__draw_path_arc_auxi:fnfnNnn + { \fp_to_decimal:N \l__draw_path_arc_start_fp } + {#2} + { \fp_eval:n { abs( \l__draw_path_arc_start_fp - #2 ) } } + {#2} + #3 {#4} {#5} + } +\cs_new_protected:Npn \__draw_path_arc_auxi:nnnnNnn #1#2#3#4#5#6#7 + { + \use:x + { + \__draw_path_arc_auxii:nnnNnnnn + {#1} {#2} {#4} #5 {#6} {#7} + { + \fp_to_dim:n + { + \cs_if_exist_use:cF + { c__draw_path_arc_ #3 _fp } + { 4/3 * tand( 0.25 * #3 ) } + * #6 + } + } + { + \fp_to_dim:n + { + \cs_if_exist_use:cF + { c__draw_path_arc_ #3 _fp } + { 4/3 * tand( 0.25 * #3 ) } + * #7 + } + } + } + } +\cs_generate_variant:Nn \__draw_path_arc_auxi:nnnnNnn { fnf , ff } +\cs_new_protected:Npn \__draw_path_arc_auxii:nnnNnnnn #1#2#3#4#5#6#7#8 + { + \tl_clear:N \l__draw_path_tmp_tl + \__draw_point_process:nn + { \__draw_path_arc_auxiii:nn } + { + \__draw_point_transform_noshift:n + { \draw_point_polar:nnn { #1 #4 90 } {#7} {#8} } + } + \__draw_point_process:nn + { + \__draw_point_process:nn + { \__draw_path_arc_auxiv:nnnn } + { + \draw_point_transform:n + { \draw_point_polar:nnn {#1} {#5} {#6} } + } + } + { + \draw_point_transform:n + { \draw_point_polar:nnn {#2} {#5} {#6} } + } + \__draw_point_process:nn + { \__draw_path_arc_auxv:nn } + { + \__draw_point_transform_noshift:n + { \draw_point_polar:nnn { #2 #4 -90 } {#7} {#8} } + } + \exp_after:wN \__draw_path_curveto:nnnnnn \l__draw_path_tmp_tl + \fp_set:Nn \l__draw_path_arc_delta_fp { abs ( #2 - #3 ) } + \fp_set:Nn \l__draw_path_arc_start_fp {#2} + } +\cs_new_protected:Npn \__draw_path_arc_auxiii:nn #1#2 + { + \__draw_path_arc_aux_add:nn + { \g__draw_path_lastx_dim + #1 } + { \g__draw_path_lasty_dim + #2 } + } +\cs_new_protected:Npn \__draw_path_arc_auxiv:nnnn #1#2#3#4 + { + \__draw_path_arc_aux_add:nn + { \g__draw_path_lastx_dim - #1 + #3 } + { \g__draw_path_lasty_dim - #2 + #4 } + } +\cs_new_protected:Npn \__draw_path_arc_auxv:nn #1#2 + { + \exp_after:wN \__draw_path_arc_auxvi:nn + \l__draw_path_tmp_tl {#1} {#2} + } +\cs_new_protected:Npn \__draw_path_arc_auxvi:nn #1#2#3#4#5#6 + { + \tl_set:Nn \l__draw_path_tmp_tl { {#1} {#2} } + \__draw_path_arc_aux_add:nn + { #5 + #3 } + { #6 + #4 } + \tl_put_right:Nn \l__draw_path_tmp_tl { {#3} {#4} } + } +\cs_new_protected:Npn \__draw_path_arc_aux_add:nn #1#2 + { + \tl_put_right:Nx \l__draw_path_tmp_tl + { { \fp_to_dim:n {#1} } { \fp_to_dim:n {#2} } } + } +\fp_new:N \l__draw_path_arc_delta_fp +\fp_new:N \l__draw_path_arc_start_fp +\fp_const:cn { c__draw_path_arc_90_fp } { 4/3 * (sqrt(2) - 1) } +\fp_const:cn { c__draw_path_arc_60_fp } { 4/3 * tand(15) } +\cs_new_protected:Npn \draw_path_arc_axes:nnnn #1#2#3#4 + { + \draw_transform_triangle:nnn { 0cm , 0cm } {#3} {#4} + \draw_path_arc:nnn {#1} {#2} { 1pt } + } +\cs_new_protected:Npn \draw_path_ellipse:nnn #1#2#3 + { + \__draw_point_process:nnn + { + \__draw_point_process:nn + { \__draw_path_ellipse:nnnnnn } + { \draw_point_transform:n {#1} } + } + { \__draw_point_transform_noshift:n {#2} } + { \__draw_point_transform_noshift:n {#3} } + } +\cs_new_protected:Npn \__draw_path_ellipse:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \__draw_path_moveto:nn + { \fp_to_dim:n { #1 + #3 } } { \fp_to_dim:n { #2 + #4 } } + \__draw_path_ellipse_arci:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \__draw_path_ellipse_arcii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \__draw_path_ellipse_arciii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + \__draw_path_ellipse_arciv:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} + } + \__draw_softpath_closepath: + \__draw_path_moveto:nn {#1} {#2} + } +\cs_new:Npn \__draw_path_ellipse_arci:nnnnnn #1#2#3#4#5#6 + { + \__draw_path_curveto:nnnnnn + { \fp_to_dim:n { #1 + #3 + #5 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #2 + #4 + #6 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #1 + #3 * \c__draw_path_ellipse_fp + #5 } } + { \fp_to_dim:n { #2 + #4 * \c__draw_path_ellipse_fp + #6 } } + { \fp_to_dim:n { #1 + #5 } } + { \fp_to_dim:n { #2 + #6 } } + } +\cs_new:Npn \__draw_path_ellipse_arcii:nnnnnn #1#2#3#4#5#6 + { + \__draw_path_curveto:nnnnnn + { \fp_to_dim:n { #1 - #3 * \c__draw_path_ellipse_fp + #5 } } + { \fp_to_dim:n { #2 - #4 * \c__draw_path_ellipse_fp + #6 } } + { \fp_to_dim:n { #1 - #3 + #5 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #2 - #4 + #6 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #1 - #3 } } + { \fp_to_dim:n { #2 - #4 } } + } +\cs_new:Npn \__draw_path_ellipse_arciii:nnnnnn #1#2#3#4#5#6 + { + \__draw_path_curveto:nnnnnn + { \fp_to_dim:n { #1 - #3 - #5 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #2 - #4 - #6 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #1 - #3 * \c__draw_path_ellipse_fp - #5 } } + { \fp_to_dim:n { #2 - #4 * \c__draw_path_ellipse_fp - #6 } } + { \fp_to_dim:n { #1 - #5 } } + { \fp_to_dim:n { #2 - #6 } } + } +\cs_new:Npn \__draw_path_ellipse_arciv:nnnnnn #1#2#3#4#5#6 + { + \__draw_path_curveto:nnnnnn + { \fp_to_dim:n { #1 + #3 * \c__draw_path_ellipse_fp - #5 } } + { \fp_to_dim:n { #2 + #4 * \c__draw_path_ellipse_fp - #6 } } + { \fp_to_dim:n { #1 + #3 - #5 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #2 + #4 - #6 * \c__draw_path_ellipse_fp } } + { \fp_to_dim:n { #1 + #3 } } + { \fp_to_dim:n { #2 + #4 } } + } +\fp_const:Nn \c__draw_path_ellipse_fp { \fp_use:c { c__draw_path_arc_90_fp } } +\cs_new_protected:Npn \draw_path_circle:nn #1#2 + { \draw_path_ellipse:nnn {#1} { #2 , 0pt } { 0pt , #2 } } +\cs_new_protected:Npn \draw_path_rectangle:nn #1#2 + { + \__draw_point_process:nnn + { + \bool_if:NTF \l__draw_corner_arc_bool + { \__draw_path_rectangle_rounded:nnnn } + { \__draw_path_rectangle:nnnn } + } + { \draw_point_transform:n {#1} } + {#2} + } +\cs_new_protected:Npn \__draw_path_rectangle:nnnn #1#2#3#4 + { + \__draw_path_update_limits:nn {#1} {#2} + \__draw_path_update_limits:nn { #1 + #3 } { #2 + #4 } + \__draw_softpath_rectangle:nnnn {#1} {#2} {#3} {#4} + \__draw_path_update_last:nn {#1} {#2} + } +\cs_new_protected:Npn \__draw_path_rectangle_rounded:nnnn #1#2#3#4 + { + \draw_path_moveto:n { #1 + #3 , #2 + #4 } + \draw_path_lineto:n { #1 , #2 + #4 } + \draw_path_lineto:n { #1 , #2 } + \draw_path_lineto:n { #1 + #3 , #2 } + \draw_path_close: + \draw_path_moveto:n { #1 , #2 } + } +\cs_new_protected:Npn \draw_path_rectangle_corners:nn #1#2 + { + \__draw_point_process:nnn + { \__draw_path_rectangle_corners:nnnnn {#1} } + {#1} {#2} + } +\cs_new_protected:Npn \__draw_path_rectangle_corners:nnnnn #1#2#3#4#5 + { \draw_path_rectangle:nn {#1} { #4 - #2 , #5 - #3 } } +\cs_new_protected:Npn \draw_path_grid:nnnn #1#2#3#4 + { + \__draw_point_process:nnn + { \__draw_path_grid:nnnnnn {#1} {#2} } + {#3} {#4} + } +\cs_new_protected:Npn \__draw_path_grid:nnnnnn #1#2#3#4#5#6 + { + \dim_step_inline:nnnn + {#3} { \dim_compare:nNnF {#3} < {#5} { - } \dim_abs:n {#1} } {#5} + { + \draw_path_moveto:n { ##1 , #4 } + \draw_path_lineto:n { ##1 , #6 } + } + \dim_step_inline:nnnn + {#4} { \dim_compare:nNnF {#4} < {#6} { - } \dim_abs:n {#2} } {#6} + { + \draw_path_moveto:n { #3 , ##1 } + \draw_path_lineto:n { #5 , ##1 } + } + } +\bool_new:N \l__draw_path_use_clip_bool +\bool_new:N \l__draw_path_use_fill_bool +\bool_new:N \l__draw_path_use_stroke_bool +\bool_new:N \l__draw_path_use_bb_bool +\bool_new:N \l__draw_path_use_clear_bool +\cs_new_protected:Npn \draw_path_use:n #1 + { + \tl_if_blank:nF {#1} + { \__draw_path_use:n {#1} } + } +\cs_new_protected:Npn \draw_path_use_clear:n #1 + { + \bool_lazy_or:nnTF + { \tl_if_blank_p:n {#1} } + { \str_if_eq_p:nn {#1} { clear } } + { + \__draw_softpath_clear: + \__draw_path_reset_limits: + } + { \__draw_path_use:n { #1 , clear } } + } +\cs_new_protected:Npn \__draw_path_use:n #1 + { + \bool_set_false:N \l__draw_path_use_clip_bool + \bool_set_false:N \l__draw_path_use_fill_bool + \bool_set_false:N \l__draw_path_use_stroke_bool + \clist_map_inline:nn {#1} + { + \cs_if_exist:cTF { l__draw_path_use_ ##1 _ bool } + { \bool_set_true:c { l__draw_path_use_ ##1 _ bool } } + { + \cs_if_exist_use:cF { __draw_path_use_action_ ##1 : } + { \ERROR } + } + } + \bool_lazy_and:nnT + { \l__draw_update_bb_bool } + { \l__draw_path_use_stroke_bool } + { \__draw_path_use_stroke_bb: } + \bool_if:NTF \l__draw_path_use_clear_bool + { \__draw_softpath_use_clear: } + { \__draw_softpath_use: } + \bool_if:NT \l__draw_path_use_clip_bool + { \driver_draw_clip: } + \bool_lazy_or:nnT + { \l__draw_path_use_fill_bool } + { \l__draw_path_use_stroke_bool } + { + \use:c + { + driver_draw_ + \bool_if:NT \l__draw_path_use_fill_bool { fill } + \bool_if:NT \l__draw_path_use_stroke_bool { stroke } + : + } + } + } +\cs_new_protected:Npn \__draw_path_use_action_draw: + { + \bool_set_true:N \l__draw_path_use_stroke_bool + } +\cs_new_protected:Npn \__draw_path_use_stroke_bb: + { + \__draw_path_use_stroke_bb_aux:NnN x { max } + + \__draw_path_use_stroke_bb_aux:NnN y { max } + + \__draw_path_use_stroke_bb_aux:NnN x { min } - + \__draw_path_use_stroke_bb_aux:NnN y { min } - + } +\cs_new_protected:Npn \__draw_path_use_stroke_bb_aux:NnN #1#2#3 + { + \dim_compare:nNnF { \dim_use:c { g__draw_ #1#2 _dim } } = { #3 -\c_max_dim } + { + \dim_gset:cn { g__draw_ #1#2 _dim } + { + \use:c { dim_ #2 :nn } + { \dim_use:c { g__draw_ #1#2 _dim } } + { + \dim_use:c { g__draw_path_ #1#2 _dim } + #3 0.5 \g__draw_linewidth_dim + } + } + } + } +%% File: l3draw-points.dtx Copyright(C) 2018 The LaTeX3 Project +\cs_new:Npn \__draw_point_process:nn #1#2 + { + \__draw_point_process_auxi:fn + { \__draw_point_to_dim:n {#2} } + {#1} + } +\cs_new:Npn \__draw_point_process_auxi:nn #1#2 + { \__draw_point_process_auxii:nw {#2} #1 \q_stop } +\cs_generate_variant:Nn \__draw_point_process_auxi:nn { f } +\cs_new:Npn \__draw_point_process_auxii:nw #1 #2 , #3 \q_stop + { #1 {#2} {#3} } +\cs_new:Npn \__draw_point_process:nnn #1#2#3 + { + \__draw_point_process_auxiii:ffn + { \__draw_point_to_dim:n {#2} } + { \__draw_point_to_dim:n {#3} } + {#1} + } +\cs_new:Npn \__draw_point_process_auxiii:nnn #1#2#3 + { \__draw_point_process_auxiv:nw {#3} #1 \q_mark #2 \q_stop } +\cs_generate_variant:Nn \__draw_point_process_auxiii:nnn { ff } +\cs_new:Npn \__draw_point_process_auxiv:nw #1 #2 , #3 \q_mark #4 , #5 \q_stop + { #1 {#2} {#3} {#4} {#5} } +\cs_new:Npn \__draw_point_to_dim:n #1 + { \__draw_point_to_dim_aux:f { \fp_eval:n {#1} } } +\cs_new:Npn \__draw_point_to_dim_aux:n #1 + { \__draw_point_to_dim_aux:w #1 } +\cs_generate_variant:Nn \__draw_point_to_dim_aux:n { f } +\cs_new:Npn \__draw_point_to_dim_aux:w ( #1 , ~ #2 ) { #1pt , #2pt } +\cs_new:Npn \draw_point:nn #1#2 + { \__draw_point_to_dim:n { #1 , #2 } } +\cs_new:Npn \draw_point_polar:nn #1#2 + { \draw_point_polar:nnn {#1} {#2} {#2} } +\cs_new:Npn \draw_point_polar:nnn #1#2#3 + { \__draw_draw_polar:fnn { \fp_eval:n {#1} } {#2} {#3} } +\cs_new:Npn \__draw_draw_polar:nnn #1#2#3 + { \__draw_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } } +\cs_generate_variant:Nn \__draw_draw_polar:nnn { f } +\cs_new:Npn \draw_point_add:nn #1#2 + { \__draw_point_to_dim:n { (#1) + (#2) } } +\cs_new:Npn \draw_point_diff:nn #1#2 + { \__draw_point_to_dim:n { (#2) - (#1) } } +\cs_new:Npn \draw_point_scale:nn #1#2 + { \__draw_point_to_dim:n { #1 * (#2) } } +\cs_new:Npn \draw_point_unit_vector:n #1 + { \__draw_point_process:nn { \__draw_point_unit_vector:nn } {#1} } +\cs_new:Npn \__draw_point_unit_vector:nn #1#2 + { + \__draw_point_to_dim:n + { ( #1 , #2 ) / (sqrt(#1 * #1 + #2 * #2)) } + } +\cs_new:Npn \draw_point_intersect_lines:nnnn #1#2#3#4 + { + \__draw_point_process:nnn + { + \__draw_point_process:nnn + { \__draw_point_intersect_lines:nnnnnnnn } {#3} {#4} + } + {#1} {#2} + } +\cs_new:Npn \__draw_point_intersect_lines:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \__draw_point_intersect_lines_aux:ffffff + { \fp_eval:n { #1 * #4 - #2 * #3 } } + { \fp_eval:n { #5 * #8 - #6 * #7 } } + { \fp_eval:n { #1 - #3 } } + { \fp_eval:n { #5 - #7 } } + { \fp_eval:n { #2 - #4 } } + { \fp_eval:n { #6 - #8 } } + } +\cs_new:Npn \__draw_point_intersect_lines_aux:nnnnnn #1#2#3#4#5#6 + { + \__draw_point_to_dim:n + { + ( #2 * #3 - #1 * #4 , #2 * #5 - #1 * #6 ) + / ( #4 * #5 - #6 * #3 ) + } + } +\cs_generate_variant:Nn \__draw_point_intersect_lines_aux:nnnnnn { ffffff } +\cs_new:Npn \draw_point_intersect_circles:nnnnn #1#2#3#4#5 + { + \__draw_point_process:nnn + { \__draw_point_intersect_circles_auxi:nnnnnnn {#2} {#4} {#5} } + {#1} {#3} + } +\cs_new:Npn \__draw_point_intersect_circles_auxi:nnnnnnn #1#2#3#4#5#6#7 + { + \__draw_point_intersect_circles_auxii:ffnnnnn + { \fp_eval:n {#1} } { \fp_eval:n {#2} } {#4} {#5} {#6} {#7} {#3} + } +\cs_new:Npn \__draw_point_intersect_circles_auxii:nnnnnnn #1#2#3#4#5#6#7 + { + \__draw_point_intersect_circles_auxiii:ffnnnnn + { \fp_eval:n { #5 - #3 } } + { \fp_eval:n { #6 - #4 } } + {#1} {#2} {#3} {#4} {#7} + } +\cs_generate_variant:Nn \__draw_point_intersect_circles_auxii:nnnnnnn { ff } +\cs_new:Npn \__draw_point_intersect_circles_auxiii:nnnnnnn #1#2#3#4#5#6#7 + { + \__draw_point_intersect_circles_auxiv:fnnnnnnn + { \fp_eval:n { sqrt( #1 * #1 + #2 * #2 ) } } + {#1} {#2} {#3} {#4} {#5} {#6} {#7} + } +\cs_generate_variant:Nn \__draw_point_intersect_circles_auxiii:nnnnnnn { ff } +\cs_new:Npn \__draw_point_intersect_circles_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \__draw_point_intersect_circles_auxv:ffnnnnnnn + { \fp_eval:n { 1 / #1 } } + { \fp_eval:n { #4 * #4 } } + {#1} {#2} {#3} {#5} {#6} {#7} {#8} + } +\cs_generate_variant:Nn \__draw_point_intersect_circles_auxiv:nnnnnnnn { f } +\cs_new:Npn \__draw_point_intersect_circles_auxv:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \__draw_point_intersect_circles_auxvi:fnnnnnnn + { \fp_eval:n { 0.5 * #1 * ( #2 + #3 * #3 - #6 * #6 ) } } + {#1} {#2} {#4} {#5} {#7} {#8} {#9} + } +\cs_generate_variant:Nn \__draw_point_intersect_circles_auxv:nnnnnnnnn { ff } +\cs_new:Npn \__draw_point_intersect_circles_auxvi:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \__draw_point_intersect_circles_auxvii:fffnnnn + { \fp_eval:n { #1 * #2 } } + { \int_if_odd:nTF {#8} { 1 } { -1 } } + { \fp_eval:n { sqrt ( #3 - #1 * #1 ) * #2 } } + {#4} {#5} {#6} {#7} + } +\cs_generate_variant:Nn \__draw_point_intersect_circles_auxvi:nnnnnnnn { f } +\cs_new:Npn \__draw_point_intersect_circles_auxvii:nnnnnnn #1#2#3#4#5#6#7 + { + \__draw_point_to_dim:n + { #6 + #4 * #1 + #2 * #3 * #5 , #7 + #5 * #1 + -1 * #2 * #3 * #4 } + } +\cs_generate_variant:Nn \__draw_point_intersect_circles_auxvii:nnnnnnn { fff } +\cs_new:Npn \draw_point_interpolate_line:nnn #1#2#3 + { + \__draw_point_process:nnn + { \__draw_point_interpolate_line_aux:fnnnn { \fp_eval:n {#1} } } + {#2} {#3} + } +\cs_new:Npn \__draw_point_interpolate_line_aux:nnnnn #1#2#3#4#5 + { + \__draw_point_interpolate_line_aux:fnnnnn { \fp_eval:n { 1 - #1 } } + {#1} {#2} {#3} {#4} {#5} + } +\cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnn { f } +\cs_new:Npn \__draw_point_interpolate_line_aux:nnnnnn #1#2#3#4#5#6 + { \__draw_point_to_dim:n { #2 * #3 + #1 * #5 , #2 * #4 + #1 * #6 } } +\cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnnn { f } +\cs_new:Npn \draw_point_interpolate_distance:nnn #1#2#3 + { + \__draw_point_process:nnn + { \__draw_point_interpolate_distance:nnnnn {#1} } + {#2} {#3} + } +\cs_new:Npn \__draw_point_interpolate_distance:nnnnn #1#2#3#4#5 + { + \__draw_point_interpolate_distance_aux:nnnnnnn + { \fp_eval:n { #4 - #2 } } + { \fp_eval:n { #5 - #3 } } + {#2} {#3} {#4} {#5} {#1} + } +\cs_new:Npn \__draw_point_interpolate_distance_aux:nnnnnnn #1#2#3#4#5#6#7 + { + \__draw_point_interpolate_distance_aux:fnnnn + { \fp_eval:n { (#7) / (sqrt ( #1 * #1 + #2 * #2 )) } } + {#3} {#4} {#5} {#6} + } +\cs_generate_variant:Nn \__draw_point_interpolate_distance_aux:nnnnnnn { ff } +\cs_new:Npn \__draw_point_interpolate_distance_aux:nnnnn #1#2#3#4#5 + { \__draw_point_to_dim:n { #2 + #1 * #4 , #3 + #1 * #5 } } +\cs_generate_variant:Nn \__draw_point_interpolate_distance_aux:nnnnn { f } +\cs_new:Npn \draw_point_interpolate_arcaxes:nnnnnn #1#2#3#4#5#6 + { + \__draw_point_process:nnn + { + \__draw_point_process:nn + { \__draw_point_interpolate_arcaxes_auxi:nnnnnnnnn {#1} {#5} {#6} } + {#4} + } + {#2} {#3} + } +\cs_new:Npn \__draw_point_interpolate_arcaxes_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \__draw_point_interpolate_arcaxes_auxii:fnnnnnnnn + { \fp_eval:n {#1} } {#2} {#3} {#6} {#7} {#8} {#9} {#4} {#5} + } +\cs_new:Npn \__draw_point_interpolate_arcaxes_auxii:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \__draw_point_interpolate_arcaxes_auxiii:fnnnnnn + { \fp_eval:n { #1 * (#3) + ( 1 - #1 ) * (#2) } } + {#4} {#5} {#6} {#7} {#8} {#9} + } +\cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxii:nnnnnnnnn { f } +\cs_new:Npn \__draw_point_interpolate_arcaxes_auxiii:nnnnnnn #1#2#3#4#5#6#7 + { + \__draw_point_interpolate_arcaxes_auxiv:ffnnnnnn + { \fp_eval:n { cosd (#1) } } + { \fp_eval:n { sind (#1) } } + {#2} {#3} {#4} {#5} {#6} {#7} + } +\cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxiii:nnnnnnn { f } +\cs_new:Npn \__draw_point_interpolate_arcaxes_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \__draw_point_to_dim:n + { #3 + #1 * #5 + #2 * #7 , #4 + #1 * #6 + #2 * #8 } + } +\cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxiv:nnnnnnnn { ff } +\cs_new:Npn \draw_point_interpolate_curve:nnnnnn #1#2#3#4#5 + { + \__draw_point_process:nnn + { + \__draw_point_process:nnn + { \__draw_point_interpolate_curve_auxi:nnnnnnnnn {#1} } + {#4} {#5} + } + {#2} {#3} + } +\cs_new:Npn \__draw_point_interpolate_curve_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9 + { + \__draw_point_interpolate_curve_auxii:fnnnnnnnn + { \fp_eval:n {#1} } + {#6} {#7} {#8} {#9} {#2} {#3} {#4} {#5} + } +\cs_new:Npn \__draw_point_interpolate_curve_auxii:nnnnnnnnn + #1#2#3#4#5#6#7#8#9 + { + \__draw_point_interpolate_curve_auxiii:fnnnnn + { \fp_eval:n { 1 - #1 } } + {#1} + { {#2} {#3} } { {#4} {#5} } { {#6} {#7} } { {#8} {#9} } + } +\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxii:nnnnnnnnn { f } +\cs_new:Npn \__draw_point_interpolate_curve_auxiii:nnnnnn #1#2#3#4#5#6 + { + \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #3 #4 + \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #4 #5 + \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #5 #6 + \prg_do_nothing: + \__draw_point_interpolate_curve_auxvi:n { {#1} {#2} } + } +\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxiii:nnnnnn { f } +\cs_new:Npn \__draw_point_interpolate_curve_auxiv:nnnnnn #1#2#3#4#5#6 + { + \__draw_point_interpolate_curve_auxv:ffw + { \fp_eval:n { #1 * #3 + #2 * #5 } } + { \fp_eval:n { #1 * #4 + #2 * #6 } } + } +\cs_new:Npn \__draw_point_interpolate_curve_auxv:nnw + #1#2#3 \prg_do_nothing: #4#5 + { + #3 + \prg_do_nothing: + #4 { #5 {#1} {#2} } + } +\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxv:nnw { ff } +\cs_new:Npn \__draw_point_interpolate_curve_auxvi:n #1 + { \__draw_point_interpolate_curve_auxvii:nnnnnnnn #1 } +\cs_new:Npn \__draw_point_interpolate_curve_auxvii:nnnnnnnn #1#2#3#4#5#6#7#8 + { + \__draw_point_interpolate_curve_auxviii:ffffnn + { \fp_eval:n { #1 * #5 + #2 * #3 } } + { \fp_eval:n { #1 * #6 + #2 * #4 } } + { \fp_eval:n { #1 * #7 + #2 * #5 } } + { \fp_eval:n { #1 * #8 + #2 * #6 } } + {#1} {#2} + } +\cs_new:Npn \__draw_point_interpolate_curve_auxviii:nnnnnn #1#2#3#4#5#6 + { + \__draw_point_to_dim:n + { #5 * #3 + #6 * #1 , #5 * #4 + #6 * #2 } + } +\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxviii:nnnnnn { ffff } +\dim_new:N \l__draw_xvec_x_dim +\dim_new:N \l__draw_xvec_y_dim +\dim_new:N \l__draw_yvec_x_dim +\dim_new:N \l__draw_yvec_y_dim +\dim_new:N \l__draw_zvec_x_dim +\dim_new:N \l__draw_zvec_y_dim +\cs_new_protected:Npn \draw_xvec:n #1 + { \__draw_vec:nn { x } {#1} } +\cs_new_protected:Npn \draw_yvec:n #1 + { \__draw_vec:nn { y } {#1} } +\cs_new_protected:Npn \draw_zvec:n #1 + { \__draw_vec:nn { z } {#1} } +\cs_new_protected:Npn \__draw_vec:nn #1#2 + { + \__draw_point_process:nn { \__draw_vec:nnn {#1} } {#2} + } +\cs_new_protected:Npn \__draw_vec:nnn #1#2#3 + { + \dim_set:cn { l__draw_ #1 vec_x_dim } {#2} + \dim_set:cn { l__draw_ #1 vec_y_dim } {#3} + } +\draw_xvec:n { 1cm , 0cm } +\draw_yvec:n { 0cm , 1cm } +\draw_zvec:n { -0.385cm , -0.385cm } +\cs_new:Npn \draw_point_vec:nn #1#2 + { \__draw_point_vec:ff { \fp_eval:n {#1} } { \fp_eval:n {#2} } } +\cs_new:Npn \__draw_point_vec:nn #1#2 + { + \__draw_point_to_dim:n + { + #1 * \l__draw_xvec_x_dim + #2 * \l__draw_yvec_x_dim , + #1 * \l__draw_xvec_y_dim + #2 * \l__draw_yvec_y_dim + } + } +\cs_generate_variant:Nn \__draw_point_vec:nn { ff } +\cs_new:Npn \draw_point_vec:nnn #1#2#3 + { + \__draw_point_vec:fff + { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_eval:n {#3} } + } +\cs_new:Npn \__draw_point_vec:nnn #1#2#3 + { + \__draw_point_to_dim:n + { + #1 * \l__draw_xvec_x_dim + + #2 * \l__draw_yvec_x_dim + + #3 * \l__draw_zvec_x_dim + , + #1 * \l__draw_xvec_y_dim + + #2 * \l__draw_yvec_y_dim + + #3 * \l__draw_zvec_y_dim + } + } +\cs_generate_variant:Nn \__draw_point_vec:nnn { fff } +\cs_new:Npn \draw_point_vec_polar:nn #1#2 + { \draw_point_vec_polar:nnn {#1} {#2} {#2} } +\cs_new:Npn \draw_point_vec_polar:nnn #1#2#3 + { \__draw_draw_vec_polar:fnn { \fp_eval:n {#1} } {#2} {#3} } +\cs_new:Npn \__draw_draw_vec_polar:nnn #1#2#3 + { + \__draw_point_to_dim:n + { + cosd(#1) * (#2) * \l__draw_xvec_x_dim , + sind(#1) * (#3) * \l__draw_yvec_y_dim + } + } +\cs_generate_variant:Nn \__draw_draw_vec_polar:nnn { f } +\cs_new:Npn \draw_point_transform:n #1 + { + \__draw_point_process:nn + { \__draw_point_transform:nn } {#1} + } +\cs_new:Npn \__draw_point_transform:nn #1#2 + { + \bool_if:NTF \l__draw_transformcm_active_bool + { + \__draw_point_to_dim:n + { + ( + \l__draw_transformcm_aa_fp * #1 + + \l__draw_transformcm_ba_fp * #2 + + \l__draw_transformcm_xshift_dim + ) + , + ( + \l__draw_transformcm_ab_fp * #1 + + \l__draw_transformcm_bb_fp * #2 + + \l__draw_transformcm_yshift_dim + ) + } + } + { + \__draw_point_to_dim:n + { + (#1, #2) + + ( \l__draw_transformcm_xshift_dim , + \l__draw_transformcm_yshift_dim ) + } + } + } +\cs_new:Npn \__draw_point_transform_noshift:n #1 + { + \__draw_point_process:nn + { \__draw_point_transform_noshift:nn } {#1} + } +\cs_new:Npn \__draw_point_transform_noshift:nn #1#2 + { + \bool_if:NTF \l__draw_transformcm_active_bool + { + \__draw_point_to_dim:n + { + ( + \l__draw_transformcm_aa_fp * #1 + + \l__draw_transformcm_ba_fp * #2 + ) + , + ( + \l__draw_transformcm_ab_fp * #1 + + \l__draw_transformcm_bb_fp * #2 + ) + } + } + { \__draw_point_to_dim:n { (#1, #2) } } + } +%% File: l3draw-scopes.dtx Copyright(C) 2018 The LaTeX3 Project +\dim_new:N \g__draw_xmax_dim +\dim_new:N \g__draw_xmin_dim +\dim_new:N \g__draw_ymax_dim +\dim_new:N \g__draw_ymin_dim +\bool_new:N \l__draw_update_bb_bool +\box_new:N \l__draw_main_box +\cs_new_protected:Npn \draw_begin: + { + \vbox_set:Nw \l__draw_main_box + \driver_draw_begin: + \dim_gset:Nn \g__draw_xmax_dim { -\c_max_dim } + \dim_gset:Nn \g__draw_xmin_dim { \c_max_dim } + \dim_gset:Nn \g__draw_ymax_dim { -\c_max_dim } + \dim_gset:Nn \g__draw_ymin_dim { \c_max_dim } + \bool_set_true:N \l__draw_update_bb_bool + \draw_transform_reset: + \draw_linewidth:n { \l_draw_default_linewidth_dim } + } +\cs_new_protected:Npn \draw_end: + { + \driver_draw_end: + \vbox_set_end: + \hbox_set:Nn \l__draw_main_box + { + \skip_horizontal:n { -\g__draw_xmin_dim } + \box_move_down:nn { \g__draw_ymin_dim } + { \box_use_drop:N \l__draw_main_box } + } + \box_set_ht:Nn \l__draw_main_box + { \g__draw_ymax_dim - \g__draw_ymin_dim } + \box_set_dp:Nn \l__draw_main_box { 0pt } + \box_set_wd:Nn \l__draw_main_box + { \g__draw_xmax_dim - \g__draw_xmin_dim } + \mode_leave_vertical: + \box_use_drop:N \l__draw_main_box + } +%% File: l3draw-softpath.dtx Copyright(C) 2018 The LaTeX3 Project +\tl_new:N \g__draw_softpath_main_tl +\tl_new:N \g__draw_softpath_buffer_a_tl +\tl_new:N \g__draw_softpath_buffer_b_tl +\int_new:N \g__draw_softpath_buffer_a_int +\int_new:N \g__draw_softpath_buffer_b_int +\cs_new_protected:Npn \__draw_softpath_add:n #1 + { + \int_compare:nNnTF \g__draw_softpath_buffer_a_int < { 40 } + { + \int_gincr:N \g__draw_softpath_buffer_a_int + \tl_gput_right:Nn \g__draw_softpath_buffer_a_tl {#1} + } + { + \int_compare:nNnTF \g__draw_softpath_buffer_b_int < { 40 } + { + \int_gincr:N \g__draw_softpath_buffer_b_int + \tl_gset:Nx \g__draw_softpath_buffer_b_tl + { + \exp_not:V \g__draw_softpath_buffer_b_tl + \exp_not:V \g__draw_softpath_buffer_a_tl + \exp_not:n {#1} + } + \int_gzero:N \g__draw_softpath_buffer_a_int + \tl_gclear:N \g__draw_softpath_buffer_a_tl + } + { \__draw_softpath_concat:n {#1} } + } + } +\cs_generate_variant:Nn \__draw_softpath_add:n { x } +\cs_new_protected:Npn \__draw_softpath_concat:n #1 + { + \tl_gset:Nx \g__draw_softpath_main_tl + { + \exp_not:V \g__draw_softpath_main_tl + \exp_not:V \g__draw_softpath_buffer_b_tl + \exp_not:V \g__draw_softpath_buffer_a_tl + \exp_not:n {#1} + } + \__draw_softpath_reset_buffers: + } +\cs_new_protected:Npn \__draw_softpath_reset_buffers: + { + \int_gzero:N \g__draw_softpath_buffer_a_int + \tl_gclear:N \g__draw_softpath_buffer_a_tl + \int_gzero:N \g__draw_softpath_buffer_b_int + \tl_gclear:N \g__draw_softpath_buffer_b_tl + } +\cs_new_protected:Npn \__draw_softpath_get:N #1 + { + \__draw_softpath_concat:n { } + \tl_set_eq:NN #1 \g__draw_softpath_main_tl + } +\cs_new_protected:Npn \__draw_softpath_set_eq:N #1 + { + \tl_gset_eq:NN \g__draw_softpath_main_tl #1 + \__draw_softpath_reset_buffers: + } +\cs_new_protected:Npn \__draw_softpath_use: + { + \g__draw_softpath_main_tl + \g__draw_softpath_buffer_b_tl + \g__draw_softpath_buffer_a_tl + } +\cs_new_protected:Npn \__draw_softpath_clear: + { + \tl_gclear:N \g__draw_softpath_main_tl + \tl_gclear:N \g__draw_softpath_buffer_a_tl + \tl_gclear:N \g__draw_softpath_buffer_b_tl + } +\cs_new_protected:Npn \__draw_softpath_use_clear: + { + \__draw_softpath_use: + \__draw_softpath_clear: + } +\dim_new:N \g__draw_softpath_lastx_dim +\dim_new:N \g__draw_softpath_lasty_dim +\bool_new:N \g__draw_softpath_move_bool +\bool_gset_true:N \g__draw_softpath_move_bool +\cs_new_protected:Npn \__draw_softpath_closepath: + { + \__draw_softpath_add:x + { + \__draw_softpath_close_op:nn + { \dim_use:N \g__draw_softpath_lastx_dim } + { \dim_use:N \g__draw_softpath_lasty_dim } + } + } +\cs_new_protected:Npn \__draw_softpath_curveto:nnnnnn #1#2#3#4#5#6 + { + \__draw_softpath_add:n + { + \__draw_softpath_curveto_opi:nn {#1} {#2} + \__draw_softpath_curveto_opii:nn {#3} {#4} + \__draw_softpath_curveto_opiii:nn {#5} {#6} + } + } +\cs_new_protected:Npn \__draw_softpath_lineto:nn #1#2 + { + \__draw_softpath_add:n + { \__draw_softpath_lineto_op:nn {#1} {#2} } + } +\cs_new_protected:Npn \__draw_softpath_moveto:nn #1#2 + { + \__draw_softpath_add:n + { \__draw_softpath_moveto_op:nn {#1} {#2} } + \bool_if:NT \g__draw_softpath_move_bool + { + \dim_gset:Nn \g__draw_softpath_lastx_dim {#1} + \dim_gset:Nn \g__draw_softpath_lasty_dim {#2} + } + } +\cs_new_protected:Npn \__draw_softpath_rectangle:nnnn #1#2#3#4 + { + \__draw_softpath_add:n + { + \__draw_softpath_rectangle_opi:nn {#1} {#2} + \__draw_softpath_rectangle_opii:nn {#3} {#4} + } + } +\cs_new_protected:Npn \__draw_softpath_roundpoint:nn #1#2 + { + \__draw_softpath_add:n + { \__draw_softpath_roundpoint_op:nn {#1} {#2} } + } +\cs_generate_variant:Nn \__draw_softpath_roundpoint:nn { VV } +\cs_new_protected:Npn \__draw_softpath_close_op:nn #1#2 + { \driver_draw_closepath: } +\cs_new_protected:Npn \__draw_softpath_curveto_opi:nn #1#2 + { \__draw_softpath_curveto_opi:nnNnnNnn {#1} {#2} } +\cs_new_protected:Npn \__draw_softpath_curveto_opi:nnNnnNnn #1#2#3#4#5#6#7#8 + { \driver_draw_curveto:nnnnnn {#1} {#2} {#4} {#5} {#7} {#8} } +\cs_new_protected:Npn \__draw_softpath_curveto_opii:nn #1#2 { } +\cs_new_protected:Npn \__draw_softpath_curveto_opiii:nn #1#2 { } +\cs_new_protected:Npn \__draw_softpath_lineto_op:nn #1#2 + { \driver_draw_lineto:nn {#1} {#2} } +\cs_new_protected:Npn \__draw_softpath_moveto_op:nn #1#2 + { \driver_draw_moveto:nn {#1} {#2} } +\cs_new_protected:Npn \__draw_softpath_roundpoint_op:nn #1#2 { } +\cs_new_protected:Npn \__draw_softpath_rectangle_opi:nn #1#2 + { \__draw_softpath_rectangle_opi:nnNnn {#1} {#2} } +\cs_new_protected:Npn \__draw_softpath_rectangle_opi:nnNnn #1#2#3#4#5 + { \driver_draw_rectangle:nnnn {#1} {#2} {#4} {#5} } + \cs_new_protected:Npn \__draw_softpath_rectangle_opii:nn #1#2 { } +%% File: l3draw-state.dtx Copyright(C) 2018 The LaTeX3 Project +\dim_new:N \g__draw_linewidth_dim +\dim_new:N \g__draw_inner_linewidth_dim +\dim_new:N \l_draw_default_linewidth_dim +\dim_set:Nn \l_draw_default_linewidth_dim { 0.4pt } +\cs_new_protected:Npn \draw_linewidth:n #1 + { + \dim_gset:Nn \g__draw_linewidth_dim { \fp_to_dim:n {#1} } + \driver_draw_linewidth:n \g__draw_linewidth_dim + } +\cs_new_protected:Npn \draw_inner_linewidth:n #1 + { \dim_gset:Nn \g__draw_inner_linewidth_dim { \fp_to_dim:n {#1} } } +\cs_new_protected:Npn \draw_miterlimit:n #1 + { \driver_draw_miterlimit:n { \fp_to_dim:n {#1} } } +\cs_new_protected:Npn \draw_cap_butt: { \driver_draw_cap_butt: } +\cs_new_protected:Npn \draw_cap_rectangle: { \driver_draw_cap_rectangle: } +\cs_new_protected:Npn \draw_cap_round: { \driver_draw_cap_round: } +\cs_new_protected:Npn \draw_evenodd_rule: { \driver_draw_evenodd_rule: } +\cs_new_protected:Npn \draw_nonzero_rule: { \driver_draw_nonzero_rule: } +\cs_new_protected:Npn \draw_join_bevel: { \driver_draw_join_bevel: } +\cs_new_protected:Npn \draw_join_miter: { \driver_draw_join_miter: } +\cs_new_protected:Npn \draw_join_round: { \driver_draw_join_round: } +\tl_new:N \l__draw_color_tmp_tl +\tl_new:N \g__draw_fill_color_tl +\tl_new:N \g__draw_stroke_color_tl +\cs_new_protected:Npn \draw_color:n #1 + { \__draw_color:nn { } {#1} } +\cs_new_protected:Npn \draw_color_fill:n #1 + { \__draw_color:nn { fill } {#1} } +\cs_new_protected:Npn \draw_color_stroke:n #1 + { \__draw_color:nn { stroke } {#1} } +\cs_new_protected:Npn \__draw_color:nn #1#2 + { + \color_parse:nN {#2} \l__draw_color_tmp_tl + \tl_if_blank:nTF {#1} + { + \tl_gset_eq:NN \g__draw_fill_color_tl \l__draw_color_tmp_tl + \tl_gset_eq:NN \g__draw_stroke_color_tl \l__draw_color_tmp_tl + \__draw_color_aux:Vn \l__draw_color_tmp_tl { color } + } + { + \tl_gset_eq:cN { g__draw_ #1 _color_tl } \l__draw_color_tmp_tl + \__draw_color_aux:Vn \l__draw_color_tmp_tl { #1 } + } + } +\cs_new_protected:Npn \__draw_color_aux:nn #1#2 + { \__draw_color:nw {#2} #1 \q_stop } +\cs_generate_variant:Nn \__draw_color_aux:nn { V } +\cs_new_protected:Npn \__draw_color:nw #1#2 ~ #3 \q_stop + { \use:c { __draw_color_ #2 :nw } {#1} #3 \q_stop } +\cs_new_protected:Npn \__draw_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop + { \use:c { driver_draw_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} } +\cs_new_protected:Npn \__draw_color_gray:nw #1#2 \q_stop + { \use:c { driver_draw_ #1 _gray:n } {#2} } +\cs_new_protected:Npn \__draw_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop + { \use:c { driver_draw_ #1 _rgb:nnn } {#2} {#3} {#4} } +\cs_new_protected:Npn \__draw_color_spot:nw #1#2 ~ #3 \q_stop + { \use:c { driver_draw_ #1 _spot:nn } {#2} {#3} } +%% File: l3draw-transforms.dtx Copyright(C) 2018 The LaTeX3 Project +\bool_new:N \l__draw_transformcm_active_bool +\fp_new:N \l__draw_transformcm_aa_fp +\fp_new:N \l__draw_transformcm_ab_fp +\fp_new:N \l__draw_transformcm_ba_fp +\fp_new:N \l__draw_transformcm_bb_fp +\dim_new:N \l__draw_transformcm_xshift_dim +\dim_new:N \l__draw_transformcm_yshift_dim +\cs_new_protected:Npn \draw_transform_reset: + { + \fp_set:Nn \l__draw_transformcm_aa_fp { 1} + \fp_zero:N \l__draw_transformcm_ab_fp + \fp_zero:N \l__draw_transformcm_ba_fp + \fp_set:Nn \l__draw_transformcm_bb_fp { 1 } + \dim_zero:N \l__draw_transformcm_xshift_dim + \dim_zero:N \l__draw_transformcm_yshift_dim + } +\draw_transform_reset: +\cs_new_protected:Npn \draw_transform:nnnnn #1#2#3#4#5 + { + \__draw_point_process:nn + { \__draw_transform:nnnnnnn {#1} {#2} {#3} {#4} } + {#5} + } +\cs_new_protected:Npn \__draw_transform:nnnnnnn #1#2#3#4#5#6 + { + \fp_set:Nn \l__draw_transformcm_aa_fp {#1} + \fp_set:Nn \l__draw_transformcm_ab_fp {#2} + \fp_set:Nn \l__draw_transformcm_ba_fp {#3} + \fp_set:Nn \l__draw_transformcm_bb_fp {#4} + \dim_set:Nn \l__draw_transformcm_xshift_dim {#5} + \dim_set:Nn \l__draw_transformcm_yshift_dim {#6} + \bool_lazy_all:nTF + { + { \fp_compare_p:nNn \l__draw_transformcm_aa_fp = \c_one_fp } + { \fp_compare_p:nNn \l__draw_transformcm_ab_fp = \c_zero_fp } + { \fp_compare_p:nNn \l__draw_transformcm_ba_fp = \c_zero_fp } + { \fp_compare_p:nNn \l__draw_transformcm_bb_fp = \c_one_fp } + } + { \bool_set_false:N \l__draw_transformcm_active_bool } + { \bool_set_true:N \l__draw_transformcm_active_bool } + } +\cs_new_protected:Npn \draw_transform_concat:nnnnn #1#2#3#4#5 + { + \__draw_point_process:nn + { \__draw_transform_concat:nnnnnn {#1} {#2} {#3} {#4} } + {#5} + } +\cs_new_protected:Npn \__draw_transform_concat:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \__draw_transform_concat_aux:nnnnnn + { \fp_eval:n {#1} } + { \fp_eval:n {#2} } + { \fp_eval:n {#3} } + { \fp_eval:n {#4} } + {#5} + {#6} + } + } +\cs_new_protected:Npn \__draw_transform_concat_aux:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \__draw_transform:nnnnnnn + { #1 * \l__draw_transformcm_aa_fp + #2 * \l__draw_transformcm_ba_fp } + { #1 * \l__draw_transformcm_ab_fp + #2 * \l__draw_transformcm_bb_fp } + { #3 * \l__draw_transformcm_aa_fp + #4 * \l__draw_transformcm_ba_fp } + { #3 * \l__draw_transformcm_ab_fp + #4 * \l__draw_transformcm_bb_fp } + { + \fp_to_dim:n + { + \l__draw_transformcm_xshift_dim + + \l__draw_transformcm_aa_fp * #5 + + \l__draw_transformcm_ba_fp * #6 + } + } + { + \fp_to_dim:n + { + \l__draw_transformcm_yshift_dim + + \l__draw_transformcm_ab_fp * #5 + + \l__draw_transformcm_bb_fp * #6 + } + } + } + } +\cs_new_protected:Npn \draw_transform_invert: + { + \bool_if:NT \l__draw_transformcm_active_bool + { + \__draw_transform_invert:f + { + \fp_eval:n + { + 1 / + ( + \l__draw_transformcm_aa_fp * \l__draw_transformcm_bb_fp + - \l__draw_transformcm_ab_fp * \l__draw_transformcm_ba_fp + ) + } + } + } + \dim_set:Nn \l__draw_transformcm_xshift_dim + { + \fp_to_dim:n + { + -\l__draw_transformcm_xshift_dim * \l__draw_transformcm_aa_fp + -\l__draw_transformcm_yshift_dim * \l__draw_transformcm_ba_fp + } + } + \dim_set:Nn \l__draw_transformcm_yshift_dim + { + \fp_to_dim:n + { + -\l__draw_transformcm_xshift_dim * \l__draw_transformcm_ab_fp + -\l__draw_transformcm_yshift_dim * \l__draw_transformcm_bb_fp + } + } + } +\cs_new_protected:Npn \__draw_transform_invert:n #1 + { + \fp_set:Nn \l__draw_transformcm_aa_fp + { \l__draw_transformcm_bb_fp * #1 } + \fp_set:Nn \l__draw_transformcm_ab_fp + { -\l__draw_transformcm_ab_fp * #1 } + \fp_set:Nn \l__draw_transformcm_ba_fp + { -\l__draw_transformcm_ba_fp * #1 } + \fp_set:Nn \l__draw_transformcm_bb_fp + { \l__draw_transformcm_aa_fp * #1 } + } +\cs_generate_variant:Nn \__draw_transform_invert:n { f } +\cs_new_protected:Npn \draw_transform_triangle:nnn #1#2#3 + { + \__draw_point_process:nnn + { + \__draw_point_process:nn + { \__draw_tranform_triangle:nnnnnn } + {#1} + } + {#2} {#3} + } +\cs_new_protected:Npn \__draw_tranform_triangle:nnnnnn #1#2#3#4#5#6 + { + \use:x + { + \__draw_transform:nnnnnnn + { #3 - #1 } + { #4 - #2 } + { #5 - #1 } + { #6 - #2 } + {#1} + {#2} + } + } +%% +%% +%% End of file `l3draw.sty'. diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty index b1443b74a78..021b453f912 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty @@ -20,7 +20,7 @@ %% %% File: l3str-convert.dtx Copyright (C) 2013-2017 The LaTeX3 Project \RequirePackage{expl3} -\ProvidesExplPackage{l3str-convert}{2017/12/16}{} +\ProvidesExplPackage{l3str-convert}{2018/02/21}{} {L3 Experimental string encoding conversions} \cs_if_exist:NF \use_ii_i:nn { \cs_new:Npn \use_ii_i:nn #1#2 { #2 #1 } } @@ -181,7 +181,7 @@ \cs_new_protected:Npn \__str_if_flag_error:nnx #1 { \flag_if_raised:nTF {#1} - { \__msg_kernel_error:nnx { str } } + { \__kernel_msg_error:nnx { str } } { \use_none:nn } } \cs_new_protected:Npn \__str_if_flag_no_error:nnx #1#2#3 @@ -240,7 +240,7 @@ { \if_meaning:w #1 #5 \tl_if_empty:nF {#3} - { \__msg_kernel_error:nnx { str } { native-escaping } {#3} } + { \__kernel_msg_error:nnx { str } { native-escaping } {#3} } #1 \else: #4 #2 #1 @@ -272,7 +272,7 @@ } { \tl_clear:N \l__str_internal_tl - \__msg_kernel_error:nnxx { str } { unknown-#2 } {#4} {#1} + \__kernel_msg_error:nnxx { str } { unknown-#2 } {#4} {#1} } } \cs_if_exist:cF { __str_convert_#3_#1: } @@ -414,7 +414,7 @@ \__str_output_byte:n {#1} \fi: } - \__msg_kernel_new:nnnn { str } { pdfTeX-native-overflow } + \__kernel_msg_new:nnnn { str } { pdfTeX-native-overflow } { Character~code~too~large~for~pdfTeX. } { The~pdfTeX~engine~only~supports~8-bit~characters:~ @@ -541,18 +541,18 @@ \__str_output_byte:n {#1} \fi: } -\__msg_kernel_new:nnn { str } { unknown-esc } +\__kernel_msg_new:nnn { str } { unknown-esc } { Escaping~scheme~'#1'~(filtered:~'#2')~unknown. } -\__msg_kernel_new:nnn { str } { unknown-enc } +\__kernel_msg_new:nnn { str } { unknown-enc } { Encoding~scheme~'#1'~(filtered:~'#2')~unknown. } -\__msg_kernel_new:nnnn { str } { native-escaping } +\__kernel_msg_new:nnnn { str } { native-escaping } { The~'native'~encoding~scheme~does~not~support~any~escaping. } { Since~native~strings~do~not~consist~in~bytes,~ none~of~the~escaping~methods~make~sense.~ The~specified~escaping,~'#1',~will be ignored. } -\__msg_kernel_new:nnn { str } { file-not-found } +\__kernel_msg_new:nnn { str } { file-not-found } { File~'l3str-#1.def'~not~found. } \bool_lazy_any:nT { @@ -560,7 +560,7 @@ \sys_if_engine_xetex_p: } { - \__msg_kernel_new:nnnn { str } { non-byte } + \__kernel_msg_new:nnnn { str } { non-byte } { String~invalid~in~escaping~'#1':~it~may~only~contain~bytes. } { Some~characters~in~the~string~you~asked~to~convert~are~not~ @@ -574,13 +574,13 @@ } } } -\__msg_kernel_new:nnnn { str } { decode-8-bit } +\__kernel_msg_new:nnnn { str } { decode-8-bit } { Invalid~string~in~encoding~'#1'. } { LaTeX~came~across~a~byte~which~is~not~defined~to~represent~ any~character~in~the~encoding~'#1'. } -\__msg_kernel_new:nnnn { str } { encode-8-bit } +\__kernel_msg_new:nnnn { str } { encode-8-bit } { Unicode~string~cannot~be~converted~to~encoding~'#1'. } { The~encoding~'#1'~only~contains~a~subset~of~all~Unicode~characters.~ diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def index f180be34a57..5cb922bcdd2 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def @@ -59,14 +59,14 @@ \flag_clear_new:n { str_missing } \flag_clear_new:n { str_extra } \flag_clear_new:n { str_end } - \__msg_kernel_new:nnnn { str } { utf16-encode } + \__kernel_msg_new:nnnn { str } { utf16-encode } { Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. } { Surrogate~code~points~(in~the~range~[U+D800,~U+DFFF])~ can~be~expressed~in~the~UTF-8~and~UTF-32~encodings,~ but~not~in~the~UTF-16~encoding. } - \__msg_kernel_new:nnnn { str } { utf16-decode } + \__kernel_msg_new:nnnn { str } { utf16-decode } { Invalid~UTF-16~string: \exp_last_unbraced:Nf \use_none:n \__str_if_flag_times:nT { str_missing } { ,~missing~trail~surrogate } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def index c1c2c5ca595..7084d5597e5 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def @@ -56,7 +56,7 @@ } \flag_clear_new:n { str_overflow } \flag_clear_new:n { str_end } - \__msg_kernel_new:nnnn { str } { utf32-decode } + \__kernel_msg_new:nnnn { str } { utf32-decode } { Invalid~UTF-32~string: \exp_last_unbraced:Nf \use_none:n \__str_if_flag_times:nT { str_overflow } { ,~code~point~too~large } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def index c3bc0506f64..eaf3d0a6a4b 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def @@ -45,7 +45,7 @@ \flag_clear_new:n { str_extra } \flag_clear_new:n { str_overlong } \flag_clear_new:n { str_overflow } -\__msg_kernel_new:nnnn { str } { utf8-decode } +\__kernel_msg_new:nnnn { str } { utf8-decode } { Invalid~UTF-8~string: \exp_last_unbraced:Nf \use_none:n \__str_if_flag_times:nT { str_missing } { ,~missing~continuation~byte } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def index d3ed4b3c947..a6f3e978931 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def @@ -59,7 +59,7 @@ \__str_unescape_hex_auxii:N } } -\__msg_kernel_new:nnnn { str } { unescape-hex } +\__kernel_msg_new:nnnn { str } { unescape-hex } { String~invalid~in~escaping~'hex':~only~hexadecimal~digits~allowed. } { Some~characters~in~the~string~you~asked~to~convert~are~not~ diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def index 150e208bafb..9edf8df871a 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def @@ -58,7 +58,7 @@ \__str_output_end: \use_i:nnn #3 ##2##3 } - \__msg_kernel_new:nnnn { str } { unescape-#2 } + \__kernel_msg_new:nnnn { str } { unescape-#2 } { String~invalid~in~escaping~'#2'. } { LaTeX~came~across~the~escape~character~'#1'~not~followed~by~ diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def index 34fc37267e9..e008b1ee5ad 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def @@ -98,7 +98,7 @@ \if_charcode:w ^^J #2 \else: ^^J \fi: \__str_unescape_string_newlines:wN #2 } - \__msg_kernel_new:nnnn { str } { unescape-string } + \__kernel_msg_new:nnnn { str } { unescape-string } { String~invalid~in~escaping~'string'. } { LaTeX~came~across~an~escape~character~'\c_backslash_str'~ diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def index 5459b12971b..f27189e72d6 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def @@ -58,7 +58,7 @@ \__str_output_end: \use_i:nnn #3 ##2##3 } - \__msg_kernel_new:nnnn { str } { unescape-#2 } + \__kernel_msg_new:nnnn { str } { unescape-#2 } { String~invalid~in~escaping~'#2'. } { LaTeX~came~across~the~escape~character~'#1'~not~followed~by~ diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty index e6b39e8706b..6ed2b3f9273 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty @@ -20,7 +20,7 @@ %% %% File: l3str-format.dtx Copyright (C) 2012-2017 The LaTeX3 Project \RequirePackage{expl3} -\ProvidesExplPackage{l3str-format}{2017/12/16}{} +\ProvidesExplPackage{l3str-format}{2018/02/21}{} {L3 Experimental string formatting} \cs_generate_variant:Nn \use:nn { nf } \cs_generate_variant:Nn \use:nnn { fnf } @@ -101,7 +101,7 @@ \cs_new:Npn \__str_format_parse_end:nwn #1 #2 \s__stop \s__stop #3 { \tl_if_empty:nF {#2} - { \__msg_kernel_expandable_error:nnn { str } { invalid-format } {#3} } + { \__kernel_msg_expandable_error:nnn { str } { invalid-format } {#3} } #1 } \cs_new:cpn { __str_format_align_<:nnnN } #1#2#3#4 @@ -168,7 +168,7 @@ { \token_if_eq_charcode:NNTF #2 = { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-align-format } {#2} {tl} \__str_format_put:nw { #1 < } } @@ -179,7 +179,7 @@ } \token_if_eq_charcode:NNF #3 ? { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-sign-format } {#3} {tl} } \__str_format_put:nw { {#4} } @@ -190,7 +190,7 @@ { \token_if_eq_charcode:NNF #6 ? { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-style-format } {#6} {tl} } } @@ -259,7 +259,7 @@ \__str_format_put:nw { {#4} } \tl_if_empty:nF {#5} { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-precision-format } {#5} {int} } \str_case:nnF {#6} @@ -271,7 +271,7 @@ { X } { \__str_format_int:NwnnNNn \int_to_Hex:n } } { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-style-format } {#6} { int } \__str_format_int:NwnnNNn \use:n } @@ -324,7 +324,7 @@ { ? } { \__str_format_fp:wnnnNNw \__str_format_fp_g:wn } } { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { str } { invalid-style-format } {#6} { fp } \__str_format_fp:wnnnNNw \__str_format_fp_g:wn } @@ -427,15 +427,15 @@ \exp:w \exp_end_continue_f:w \fp_to_scientific:n } \cs_new:Npn \__str_format_fp_trim:w #1 e { \__fp_trim_zeros:w #1 ; e } -\__msg_kernel_new:nnn { str } { invalid-format } +\__kernel_msg_new:nnn { str } { invalid-format } { Invalid~format~'#1'. } -\__msg_kernel_new:nnn { str } { invalid-align-format } +\__kernel_msg_new:nnn { str } { invalid-align-format } { Invalid~alignment~'#1'~for~type~'#2'. } -\__msg_kernel_new:nnn { str } { invalid-sign-format } +\__kernel_msg_new:nnn { str } { invalid-sign-format } { Invalid~sign~'#1'~for~type~'#2'. } -\__msg_kernel_new:nnn { str } { invalid-precision-format } +\__kernel_msg_new:nnn { str } { invalid-precision-format } { Invalid~precision~'#1'~for~type~'#2'. } -\__msg_kernel_new:nnn { str } { invalid-style-format } +\__kernel_msg_new:nnn { str } { invalid-style-format } { Invalid~style~'#1'~for~type~'#2'. } %% %% diff --git a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty index 7a4d48d3811..355a3334d29 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty @@ -20,7 +20,7 @@ %% %% File: xcoffins.dtx Copyright(C) 2010-2012,2014,2016,2017 The LaTeX3 Project \RequirePackage{xparse} -\ProvidesExplPackage{xcoffins}{2017/12/16}{} +\ProvidesExplPackage{xcoffins}{2018/02/21}{} {L3 Experimental design level coffins} \keys_define:nn { coffin } { diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty index 3f2201bcec9..927b2888eab 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty @@ -20,8 +20,8 @@ %% %% File: l3galley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach %% (C) 2010-2017 The LaTeX3 Project -\RequirePackage{expl3}[2017/12/16] -\@ifpackagelater{expl3}{2017/12/16} +\RequirePackage{expl3}[2018/02/21] +\@ifpackagelater{expl3}{2018/02/21} {} {% \PackageError{l3galley}{Support package l3kernel too old} @@ -33,7 +33,7 @@ }% \endinput } -\ProvidesExplPackage{l3galley}{2017/12/16}{} +\ProvidesExplPackage{l3galley}{2018/02/21}{} {L3 Experimental galley code} \int_new:N \l__galley_tmp_int \seq_new:N \g__galley_tmpa_seq @@ -705,7 +705,7 @@ \cs_new_protected:Npn \galley_break_line:Nn #1#2 { \mode_if_vertical:TF - { \__msg_kernel_error:nn { galley } { no-line-to-end } } + { \__kernel_msg_error:nn { galley } { no-line-to-end } } { \tex_unskip:D \bool_if:NF #1 @@ -881,7 +881,7 @@ { \__int_value:w \etex_widowpenalties:D \__int_eval:n {#1} , } \cs_new_protected:Npn \galley_interline_penalty: { \__int_value:w \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f: } -\__msg_kernel_new:nnn { galley } { no-line-to-end } +\__kernel_msg_new:nnn { galley } { no-line-to-end } { There's~no~line~here~to~end. } \cs_set:Npn \clearpage { diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty index f8a04f871f2..06d3bf6ecb5 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty @@ -21,7 +21,7 @@ %% File: xgalley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach %% (C) 2010-2012,2014,2016-2017 The LaTeX3 Project \RequirePackage{xparse} -\ProvidesExplPackage{xgalley}{2017/12/16}{} +\ProvidesExplPackage{xgalley}{2018/02/21}{} {L3 Experimental galley} \RequirePackage{xparse,xtemplate,l3galley} \clist_new:N \l__galley_tmpa_clist diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 7a09140568e..9aa19a4ba78 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -29,6 +29,7 @@ %% l3fp-traps.dtx (with options: `package') %% l3fp-round.dtx (with options: `package') %% l3fp-parse.dtx (with options: `package') +%% l3fp-assign.dtx (with options: `package') %% l3fp-logic.dtx (with options: `package') %% l3fp-basics.dtx (with options: `package') %% l3fp-extended.dtx (with options: `package') @@ -36,20 +37,19 @@ %% l3fp-trig.dtx (with options: `package') %% l3fp-convert.dtx (with options: `package') %% l3fp-random.dtx (with options: `package') -%% l3fp-assign.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') %% l3coffins.dtx (with options: `package') -%% l3color.dtx (with options: `package') +%% l3color-base.dtx (with options: `package') %% l3sys.dtx (with options: `package') %% l3deprecation.dtx (with options: `package') %% l3candidates.dtx (with options: `package') %% l3luatex.dtx (with options: `package,tex') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -62,7 +62,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project -\def\ExplFileDate{2017/12/16}% +\def\ExplFileDate{2018/02/21}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -352,7 +352,7 @@ \tex_endlinechar:D = 32 \scan_stop: \bool_set_true:N \l__kernel_expl_bool } -%% File: l3names.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3names.dtx Copyright (C) 1990-2018 The LaTeX3 project \let \tex_global:D \global \let \tex_let:D \let \begingroup @@ -936,8 +936,11 @@ \__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 @@ -952,6 +955,7 @@ \__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 @@ -968,15 +972,17 @@ \__kernel_primitive:NN \luaescapestring \luatex_luaescapestring:D \__kernel_primitive:NN \luafunction \luatex_luafunction:D \__kernel_primitive:NN \luatexbanner \luatex_luatexbanner:D - \__kernel_primitive:NN \luatexdatestamp \luatex_luatexdatestamp: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 @@ -995,9 +1001,11 @@ \__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 @@ -1006,6 +1014,7 @@ \__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 @@ -1182,6 +1191,8 @@ \__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 @@ -1390,7 +1401,7 @@ \tex_let:D \tex_middle:D \normalmiddle \tex_let:D \tex_right:D \normalright \tex_fi:D -%% File: l3basics.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3basics.dtx Copyright (C) 1990-2018 The LaTeX3 project \tex_let:D \if_true: \tex_iftrue:D \tex_let:D \if_false: \tex_iffalse:D \tex_let:D \or: \tex_or:D @@ -1510,18 +1521,18 @@ \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 \__debug:TF #1#2 {#2} +\cs_set_protected:Npn \__kernel_debug:TF #1#2 {#2} \tex_ifodd:D \l@expl@enable@debug@bool - \cs_set_protected:Npn \__debug:TF #1#2 {#1} + \cs_set_protected:Npn \__kernel_debug:TF #1#2 {#1} \fi: -\__debug:TF +\__kernel_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: } - { \__msg_kernel_error:nnn { kernel } { debug } {##1} } + { \__kernel_msg_error:nnn { kernel } { debug } {##1} } } } \cs_set_protected:Npn \debug_off:n #1 @@ -1529,23 +1540,23 @@ \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} } { \cs_if_exist_use:cF { __debug_##1_off: } - { \__msg_kernel_error:nnn { kernel } { debug } {##1} } + { \__kernel_msg_error:nnn { kernel } { debug } {##1} } } } } { \cs_set_protected:Npn \debug_on:n #1 { - \__msg_kernel_error:nnx { kernel } { enable-debug } + \__kernel_msg_error:nnx { kernel } { enable-debug } { \tl_to_str:n { \debug_on:n {#1} } } } \cs_set_protected:Npn \debug_off:n #1 { - \__msg_kernel_error:nnx { kernel } { enable-debug } + \__kernel_msg_error:nnx { kernel } { enable-debug } { \tl_to_str:n { \debug_off:n {#1} } } } } -\__debug:TF +\__kernel_debug:TF { \cs_set_nopar:Npn \l__debug_suspended_tl { } \cs_set_protected:Npn \debug_suspend: @@ -1568,56 +1579,56 @@ \cs_set_protected:Npn \debug_suspend: { } \cs_set_protected:Npn \debug_resume: { } } -\__debug:TF +\__kernel_debug:TF { \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: } { - \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 + \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { \__debug_suspended:T \use_none:nnn \cs_if_exist:NF ##1 { - \__msg_kernel_error:nnx { kernel } { non-declared-variable } + \__kernel_msg_error:nnx { kernel } { non-declared-variable } { \token_to_str:N ##1 } } } - \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 + \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { \__debug_suspended:T \use_none:nnn \cs_if_exist:NF ##1 { - \__msg_kernel_error:nnx { kernel } { command-not-defined } + \__kernel_msg_error:nnx { kernel } { command-not-defined } { \token_to_str:N ##1 } } } - \cs_set_protected:Npn \__debug_chk_var_scope:NN + \cs_set_protected:Npn \__kernel_chk_var_scope:NN { \__debug_suspended:T \use_none:nnn \__debug_chk_var_scope_aux:NN } - \cs_set_protected:Npn \__debug_chk_var_local:N ##1 + \cs_set_protected:Npn \__kernel_chk_var_local:N ##1 { \__debug_suspended:T \use_none:nnnnn - \__debug_chk_var_exist:N ##1 + \__kernel_chk_var_exist:N ##1 \__debug_chk_var_scope_aux:NN l ##1 } - \cs_set_protected:Npn \__debug_chk_var_global:N ##1 + \cs_set_protected:Npn \__kernel_chk_var_global:N ##1 { \__debug_suspended:T \use_none:nnnnn - \__debug_chk_var_exist:N ##1 + \__kernel_chk_var_exist:N ##1 \__debug_chk_var_scope_aux:NN g ##1 } } \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: } { - \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 { } - \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 { } - \cs_set_protected:Npn \__debug_chk_var_local:N ##1 { } - \cs_set_protected:Npn \__debug_chk_var_global:N ##1 { } - \cs_set_protected:Npn \__debug_chk_var_scope:NN ##1##2 { } + \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_var_local:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_var_global:N ##1 { } + \cs_set_protected:Npn \__kernel_chk_var_scope:NN ##1##2 { } } - \cs_set_protected:Npn \__debug_chk_cs_exist:c - { \exp_args:Nc \__debug_chk_cs_exist:N } + \cs_set_protected:Npn \__kernel_chk_cs_exist:c + { \exp_args:Nc \__kernel_chk_cs_exist:N } \tex_ifodd:D \l@expl@check@declarations@bool \use:c { __debug_check-declarations_on: } \else: @@ -1625,7 +1636,7 @@ \fi: } { } -\__debug:TF +\__kernel_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 } } @@ -1648,18 +1659,18 @@ \if:w #1 \scan_stop: \cs_gset_nopar:Npn #1 {#2} \else: - \__msg_kernel_error:nnxxx { kernel } { local-global } + \__kernel_msg_error:nnxxx { kernel } { local-global } {#1} {#2} { \iow_char:N \\ #3 } \fi: \fi: } } { } -\__debug:TF +\__kernel_debug:TF { \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: } { - \cs_set:Npn \__debug_chk_expr:nNnN ##1##2 + \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2 { \__debug_suspended:T { ##1 \use_none:nnnnnnn } \exp_after:wN \__debug_chk_expr_aux:nNnN @@ -1668,7 +1679,7 @@ } } \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_off: } - { \cs_set:Npn \__debug_chk_expr:nNnN ##1##2##3##4 {##1} } + { \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 { @@ -1679,22 +1690,22 @@ \__int_value:w #3 #2 #1 \tex_relax:D } { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { expr } {#4} {#1} } #1 } } { } -\__debug:TF +\__kernel_debug:TF { \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: } { - \cs_set_protected:Npn \__debug_log:x + \cs_set_protected:Npn \__kernel_debug_log:x { \__debug_suspended:T \use_none:nn \iow_log:x } } \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: } - { \cs_set_protected:Npn \__debug_log:x { \use_none:n } } + { \cs_set_protected:Npn \__kernel_debug_log:x { \use_none:n } } \tex_ifodd:D \l@expl@log@functions@bool \use:c { __debug_log-functions_on: } \else: @@ -1702,7 +1713,7 @@ \fi: } { } -\__debug:TF +\__kernel_debug:TF { \cs_set_protected:Npn \__debug_deprecation_on: { \g__debug_deprecation_on_tl } @@ -1710,15 +1721,22 @@ { \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 \__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} + } } - { } -\__debug:TF { - \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2#3#4#5# + \cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2 { } + } +\__kernel_debug:TF + { + \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5# { \if_meaning:w \cs_new_protected:Npn #3 \else: - \__msg_kernel_error:nnx { kernel } { debug-unpatchable } + \__kernel_msg_error:nnx { kernel } { debug-unpatchable } { \token_to_str:N #3 ~(for~deprecation) } \fi: \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5} @@ -1737,7 +1755,7 @@ } \cs_new_protected:Npx #3 { - \exp_not:N \__msg_kernel_warning:nnxxx + \exp_not:N \__kernel_msg_warning:nnxxx { kernel } { deprecated-command } {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} } \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} } @@ -1745,12 +1763,12 @@ } } } - { \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2 { } } -\__debug:TF + { \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2 { } } +\__kernel_debug:TF { - \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2#3#4#5# + \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2#3#4#5# { \__debug_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } } - \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1#2#3#4# + \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 { #3 { #1 #4 #2 } } @@ -1758,18 +1776,18 @@ { #2 {#3} { #1 #4 } } } { - \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2 { } - \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1 { } + \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2 { } + \cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1 { } } -\cs_set_protected:Npn \__debug_patch_args:nNNpn - { \__debug_patch_args:nnnNNpn { } { } } -\cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn - { \__debug_patch_conditional_args:nnnNNpnn { } { } } -\__debug:TF +\cs_set_protected:Npn \__kernel_patch_args:nNNpn + { \__kernel_patch_args:nnnNNpn { } { } } +\cs_set_protected:Npn \__kernel_patch_conditional_args:nNNpnn + { \__kernel_patch_conditional_args:nnnNNpnn { } { } } +\__kernel_debug:TF { - \cs_set_protected:Npn \__debug_patch_args:nnnNNpn #1#2#3#4#5#6# + \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 \__debug_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 { @@ -1787,8 +1805,8 @@ { #2 { #3 #1 #4 } } } { - \cs_set_protected:Npn \__debug_patch_args:nnnNNpn #1#2#3 { } - \cs_set_protected:Npn \__debug_patch_conditional_args:nnnNNpnn #1#2#3 { } + \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:Npn \prg_return_true: { \exp_after:wN \use_i:nn \exp:w } @@ -1826,7 +1844,7 @@ { \__prg_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} } { \tl_count:n {#2} } { - \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments } + \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments } { \token_to_str:c { #1 : #2 } } { \tl_count:n {#2} } \use_none:nn @@ -1835,7 +1853,7 @@ \cs_set_protected:Npn \__prg_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none:nn \fi: @@ -1855,7 +1873,7 @@ \use:c { __prg_generate_ #7 _form:wnnnnnn } \tl_if_empty:nF {#7} { - \__msg_kernel_error:nnxx + \__kernel_msg_error:nnxx { kernel } { conditional-form-unknown } {#7} { \token_to_str:c { #3 : #4 } } } @@ -1877,7 +1895,7 @@ { #7 \exp_end: \c_true_bool \c_false_bool } } { - \__msg_kernel_error:nnx { kernel } { protected-predicate } + \__kernel_msg_error:nnx { kernel } { protected-predicate } { \token_to_str:c { #4 _p: #5 } } } } @@ -1918,12 +1936,12 @@ \cs_set_protected:Npn \__prg_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \if_meaning:w \c_false_bool #6 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#4} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: @@ -1937,7 +1955,7 @@ \use:c { __prg_set_eq_conditional_ #6 _form:wNnnnn } \tl_if_empty:nF {#6} { - \__msg_kernel_error:nnxx + \__kernel_msg_error:nnxx { kernel } { conditional-form-unknown } {#6} { \token_to_str:c { #1 : #2 } } } @@ -1946,20 +1964,20 @@ #5 {#1} {#2} {#3} {#4} \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5 } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 _p : #6 } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 _p : #6 } } { } \cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 _p : #4 } { #5 _p : #6 } } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 : #6 TF } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 : #6 TF } } { } \cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 TF } { #5 : #6 TF } } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 : #6 T } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 : #6 T } } { } \cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 T } { #5 : #6 T } } -\__debug_patch:nnNNpn - { \__debug_chk_cs_exist:c { #5 : #6 F } } { } +\__kernel_patch:nnNNpn + { \__kernel_chk_cs_exist:c { #5 : #6 F } } { } \cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 F } { #5 : #6 F } } \tex_chardef:D \c_true_bool = 1 ~ @@ -2065,7 +2083,7 @@ { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } } \cs_set:Npn \cs_if_exist_use:c #1 { \cs_if_exist:cTF {#1} { \use:c {#1} } { } } -\cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4 +\cs_set_protected:Npn \__kernel_msg_error:nnxx #1#2#3#4 { \tex_newlinechar:D = `\^^J \tex_relax:D \tex_errmessage:D @@ -2078,23 +2096,23 @@ } \tex_end:D } -\cs_set_protected:Npn \__msg_kernel_error:nnx #1#2#3 - { \__msg_kernel_error:nnxx {#1} {#2} {#3} { } } -\cs_set_protected:Npn \__msg_kernel_error:nn #1#2 - { \__msg_kernel_error:nnxx {#1} {#2} { } { } } +\cs_set_protected:Npn \__kernel_msg_error:nnx #1#2#3 + { \__kernel_msg_error:nnxx {#1} {#2} {#3} { } } +\cs_set_protected:Npn \__kernel_msg_error:nn #1#2 + { \__kernel_msg_error:nnxx {#1} {#2} { } { } } \cs_set:Npn \msg_line_context: { on~line~ \tex_the:D \tex_inputlineno:D } \cs_set_protected:Npn \iow_log:x { \tex_immediate:D \tex_write:D -1 } \cs_set_protected:Npn \iow_term:x { \tex_immediate:D \tex_write:D 16 } -\__debug_patch:nnNNpn { } - { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } } +\__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 { \cs_if_free:NF #1 { - \__msg_kernel_error:nnxx { kernel } { command-already-defined } + \__kernel_msg_error:nnxx { kernel } { command-already-defined } { \token_to_str:N #1 } { \token_to_meaning:N #1 } } } @@ -2215,7 +2233,7 @@ { \__cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3} { - \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments } + \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments } { \token_to_str:N #1 } { \int_eval:n {#3} } \use_none:n } @@ -2245,14 +2263,14 @@ \str_if_eq_x:nnF { } { \tl_map_function:nN {#2} \__cs_generate_from_signature:n } { - \__msg_kernel_error:nnx { kernel } { non-base-function } + \__kernel_msg_error:nnx { kernel } { non-base-function } { \token_to_str:N #5 } } \cs_generate_from_arg_count:NNnn #5 #4 { \tl_count:n {#2} } {#6} } { - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:N #5 } } } @@ -2339,7 +2357,7 @@ \cs_if_exist:NTF #1 {#2} { - \__msg_kernel_error:nnx { kernel } { variable-not-defined } + \__kernel_msg_error:nnx { kernel } { variable-not-defined } { \token_to_str:N #1 } } } @@ -2388,7 +2406,7 @@ \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-2017 The LaTeX3 project +%% 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 } } \cs_new:Npn \::: #1 {#1} @@ -2440,7 +2458,7 @@ { \fi: \fi: - \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2} + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2} \exp_end: } \cs_new:Npn \exp_args:NNc #1#2#3 @@ -2674,10 +2692,10 @@ \tex_catcode:D `\^^@ = 13 \cs_new_protected:Npn \exp_end_continue_f:w { `^^@ } \cs_new:Npn ^^@ - { \__msg_kernel_expandable_error:nn { kernel } { bad-exp-end-f } } + { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } } \cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 } \group_end: -\__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_cs_exist:N #1 } { } \cs_new_protected:Npn \cs_generate_variant:Nn #1#2 { \__cs_generate_variant:N #1 @@ -2715,7 +2733,7 @@ \cs_new_protected:Npn \__cs_generate_variant:nnNN #1#2#3#4 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: @@ -2799,7 +2817,7 @@ \exp_not:n { \q_mark - \__msg_kernel_error:nnxx { kernel } { variant-too-long } + \__kernel_msg_error:nnxx { kernel } { variant-too-long } {#5} { \token_to_str:N #3 } \use_none:nnn \q_stop @@ -2814,7 +2832,7 @@ \exp_not:n { \q_mark - \__msg_kernel_error:nnxxxx { kernel } { invalid-variant } + \__kernel_msg_error:nnxxxx { kernel } { invalid-variant } {#7} { \token_to_str:N #5 } {#1} {#2} \use_none:nnn \q_stop @@ -2827,12 +2845,13 @@ #3 \q_stop #4 #5 {#6} {#7} \exp_not:n { - \__cs_generate_variant_loop_warning:nnxxxx { kernel } { invalid-variant } + \__cs_generate_variant_loop_warning:nnxxxx + { kernel } { deprecated-variant } {#7} { \token_to_str:N #5 } {#1} {#2} } } \cs_new_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx - { \__msg_kernel_warning:nnxxxx } + { \__kernel_msg_warning:nnxxxx } \cs_new:Npn \__cs_generate_variant_same:N #1 { \if:w N #1 N \else: @@ -2844,11 +2863,11 @@ \fi: \fi: } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { \cs_if_free:NF #4 { - \__debug_log:x + \__kernel_debug_log:x { Variant~\token_to_str:N #4~% already~defined;~ not~ changing~ it~ \msg_line_context: @@ -2904,7 +2923,7 @@ \cs_new_protected:Npn \__cs_generate_variant:nnNnn #1#2#3#4#5 { \if_meaning:w \c_false_bool #3 - \__msg_kernel_error:nnx { kernel } { missing-colon } + \__kernel_msg_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \use_i_delimit_by_q_stop:nw \fi: @@ -2924,7 +2943,7 @@ \cs_if_exist_use:cTF { __cs_generate_variant_#1_form:nnn } { {#3} {#4} {#5} } { - \__msg_kernel_error:nnxx + \__kernel_msg_error:nnxx { kernel } { conditional-form-unknown } {#1} { \token_to_str:c { #3 : #4 } } } @@ -2939,20 +2958,20 @@ { \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 } } -%% File: l3tl.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% File: l3tl.dtx Copyright (C) 1990-2018 The LaTeX3 Project \cs_new_protected:Npn \tl_new:N #1 { \__chk_if_free_cs:N #1 \cs_gset_eq:NN #1 \c_empty_tl } \cs_generate_variant:Nn \tl_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__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 \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__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 @@ -2975,14 +2994,14 @@ \tex_ifodd:D \l@expl@enable@debug@bool \cs_new_protected:Npn \tl_set_eq:NN #1#2 { - \__debug_chk_var_local:N #1 - \__debug_chk_var_exist:N #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 { - \__debug_chk_var_global:N #1 - \__debug_chk_var_exist:N #2 + \__kernel_chk_var_global:N #1 + \__kernel_chk_var_exist:N #2 \cs_gset_eq:NN #1 #2 } \else: @@ -2991,18 +3010,18 @@ \fi: \cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc } \cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_chk_var_exist:N #2 - \__debug_chk_var_exist:N #3 + \__kernel_chk_var_exist:N #2 + \__kernel_chk_var_exist:N #3 } { } \cs_new_protected:Npn \tl_concat:NNN #1#2#3 { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_chk_var_exist:N #2 - \__debug_chk_var_exist:N #3 + \__kernel_chk_var_exist:N #2 + \__kernel_chk_var_exist:N #3 } { } \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3 @@ -3022,22 +3041,22 @@ \tl_const:Nn \c_novalue_tl { ANoValue- } } \tl_const:Nn \c_space_tl { ~ } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:Nx #1#2 { \cs_set_nopar:Npx #1 {#2} } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:Nx #1#2 { \cs_gset_nopar:Npx #1 {#2} } \cs_generate_variant:Nn \tl_set:Nn { NV , Nv , Nf } @@ -3046,28 +3065,28 @@ \cs_generate_variant:Nn \tl_gset:Nn { NV , Nv , Nf } \cs_generate_variant:Nn \tl_gset:Nx { c } \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:NV #1#2 { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:Nx #1#2 { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:NV #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:Nx #1#2 { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } } \cs_generate_variant:Nn \tl_put_left:Nn { c } @@ -3078,28 +3097,28 @@ \cs_generate_variant:Nn \tl_gput_left:NV { c } \cs_generate_variant:Nn \tl_gput_left:No { c } \cs_generate_variant:Nn \tl_gput_left:Nx { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:NV #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:Nx #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:NV #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:Nx #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } } \cs_generate_variant:Nn \tl_put_right:Nn { c } @@ -3230,7 +3249,7 @@ { \tl_if_empty:nTF {#6} { - \__msg_kernel_error:nnx { kernel } { empty-search-pattern } + \__kernel_msg_error:nnx { kernel } { empty-search-pattern } { \tl_to_str:n {#7} } } { @@ -3490,7 +3509,7 @@ { \tl_if_exist:NTF #1 {#1} { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} } } @@ -3840,11 +3859,11 @@ \tl_new:N \g_tmpb_tl \tl_new:N \l_tmpa_tl \tl_new:N \l_tmpb_tl -\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D } \cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} } -\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D } \cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} } -%% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3str.dtx Copyright (C) 2011-2018 The LaTeX3 Project \group_begin: \cs_set_protected:Npn \__str_tmp:n #1 { @@ -3909,7 +3928,7 @@ { \tl_if_empty:nTF {#4} { - \__msg_kernel_error:nnx { kernel } { empty-search-pattern } {#5} + \__kernel_msg_error:nnx { kernel } { empty-search-pattern } {#5} } { \use:x @@ -4198,7 +4217,7 @@ } \cs_new:Npn \str_item_ignore_spaces:nn #1 { \exp_args:No \__str_item:nn { \tl_to_str:n {#1} } } -\__debug_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } } +\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } } \cs_new:Npn \__str_item:nn #1#2 { \exp_after:wN \__str_item:w @@ -4257,7 +4276,7 @@ } \cs_new:Npn \str_range_ignore_spaces:nnn #1 { \exp_args:No \__str_range:nnn { \tl_to_str:n {#1} } } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } } \cs_new:Npn \__str_range:nnn #1#2#3 { @@ -4624,7 +4643,7 @@ %% File: l3seq.dtx Copyright (C) 1990-2017 The LaTeX3 Project \cs_new:Npn \__seq_item:n { - \__msg_kernel_expandable_error:nn { kernel } { misused-sequence } + \__kernel_msg_expandable_error:nn { kernel } { misused-sequence } \use_none:n } \tl_new:N \l__seq_internal_a_tl @@ -5070,7 +5089,7 @@ } } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} } } @@ -5139,21 +5158,21 @@ \seq_new:N \l_tmpb_seq \seq_new:N \g_tmpa_seq \seq_new:N \g_tmpb_seq -%% File: l3int.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% 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_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 \cs_new_eq:NN \if_case:w \tex_ifcase:D -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_eval:n } } +\__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: } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \__int_eval:n } } +\__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: } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_abs:n } } +\__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 @@ -5162,10 +5181,10 @@ } \cs_new:Npn \__int_abs:N #1 { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_max:nn } - { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_max:nn } + { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_max:nn } + { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_max:nn } } \cs_set:Npn \int_max:nn #1#2 { @@ -5175,10 +5194,10 @@ > \exp_stop_f: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_min:nn } - { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_min:nn } + { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_min:nn } + { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_min:nn } } \cs_set:Npn \int_min:nn #1#2 { @@ -5196,10 +5215,10 @@ #2 \fi: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_div_truncate:nn } - { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_div_truncate:nn } + { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_div_truncate:nn } + { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_div_truncate:nn } } \cs_new:Npn \int_div_truncate:nn #1#2 { @@ -5224,10 +5243,10 @@ } \cs_new:Npn \int_div_round:nn #1#2 { \__int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_mod:nn } - { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_mod:nn } + { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_mod:nn } + { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_mod:nn } } \cs_new:Npn \int_mod:nn #1#2 { @@ -5244,10 +5263,10 @@ \cs:w newcount \cs_end: #1 } \cs_generate_variant:Nn \int_new:N { c } -\__debug_patch_args:nnnNNpn - { \__debug_chk_var_scope:NN c #1 } +\__kernel_patch_args:nnnNNpn + { \__kernel_chk_var_scope:NN c #1 } { } - { {#1} { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_const:Nn } } + { {#1} { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_const:Nn } } \cs_new_protected:Npn \int_const:Nn #1#2 { \int_compare:nNnTF {#2} < \c_zero @@ -5282,9 +5301,9 @@ \cs_new_eq:NN \__int_constdef:Nw \tex_mathchardef:D \tex_mathchardef:D \c__max_constdef_int 32767 ~ \fi: -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_zero:N #1 { #1 = \c_zero } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero } \cs_generate_variant:Nn \int_zero:N { c } \cs_generate_variant:Nn \int_gzero:N { c } @@ -5294,10 +5313,10 @@ { \int_if_exist:NTF #1 { \int_gzero:N #1 } { \int_new:N #1 } } \cs_generate_variant:Nn \int_zero_new:N { c } \cs_generate_variant:Nn \int_gzero_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc } \prg_new_eq_conditional:NNn \int_if_exist:N \cs_if_exist:N @@ -5306,48 +5325,48 @@ { TF , T , F , p } \cs_set_protected:Npn \__int_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } - { {##1} { \__debug_chk_expr:nNnN {##2} \__int_eval:w { } #3 } } + { {##1} { \__kernel_chk_expr:nNnN {##2} \__int_eval:w { } #3 } } #2 #3 } -\__int_tmp:w \__debug_chk_var_local:N +\__int_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \int_add:Nn #1#2 { \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: } -\__int_tmp:w \__debug_chk_var_local:N +\__int_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \int_sub:Nn #1#2 { \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: } -\__int_tmp:w \__debug_chk_var_global:N +\__int_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \int_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: } -\__int_tmp:w \__debug_chk_var_global:N +\__int_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \int_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: } \cs_generate_variant:Nn \int_add:Nn { c } \cs_generate_variant:Nn \int_gadd:Nn { c } \cs_generate_variant:Nn \int_sub:Nn { c } \cs_generate_variant:Nn \int_gsub:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_incr:N #1 { \tex_advance:D #1 \c_one } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_decr:N #1 { \tex_advance:D #1 - \c_one } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gincr:N #1 { \tex_global:D \tex_advance:D #1 \c_one } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gdecr:N #1 { \tex_global:D \tex_advance:D #1 - \c_one } \cs_generate_variant:Nn \int_incr:N { c } \cs_generate_variant:Nn \int_decr:N { c } \cs_generate_variant:Nn \int_gincr:N { c } \cs_generate_variant:Nn \int_gdecr:N { c } -\__int_tmp:w \__debug_chk_var_local:N +\__int_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \int_set:Nn #1#2 { #1 ~ \__int_eval:w #2 \__int_eval_end: } -\__int_tmp:w \__debug_chk_var_global:N +\__int_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \int_gset:Nn #1#2 { \tex_global:D #1 ~ \__int_eval:w #2 \__int_eval_end: } \cs_generate_variant:Nn \int_set:Nn { c } @@ -5365,7 +5384,7 @@ { { } \c_zero \fi: - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { unknown-comparison } {#1} \prg_return_false: } @@ -5422,11 +5441,11 @@ { \__int_compare:nnN { \if_int_compare:w } {#3} > } \cs_new:cpn { __int_compare_>=:NNw } #1#2#3 >= { \__int_compare:nnN { \if_int_compare:w } {#3} < } -\__debug_patch_conditional_args:nNNpnn +\__kernel_patch_conditional_args:nNNpnn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_compare:nNn } + { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_compare:nNn } { \__int_eval_end: #2 } - { \__debug_chk_expr:nNnN {#3} \__int_eval:w { } \int_compare:nNn } + { \__kernel_chk_expr:nNnN {#3} \__int_eval:w { } \int_compare:nNn } } \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF } { @@ -5465,8 +5484,8 @@ { \__int_case:nw {#1} } } \cs_new_eq:NN \__int_case_end:nw \__prg_case_end:nw -\__debug_patch_conditional_args:nNNpnn - { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_odd:n } } +\__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} { \if_int_odd:w \__int_eval:w #1 \__int_eval_end: @@ -5475,8 +5494,8 @@ \prg_return_false: \fi: } -\__debug_patch_conditional_args:nNNpnn - { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_even:n } } +\__kernel_patch_conditional_args:nNNpnn + { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_even:n } } \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF} { \if_int_odd:w \__int_eval:w #1 \__int_eval_end: @@ -5541,11 +5560,11 @@ \int_compare:nNnF {#1} #2 {#3} { \int_do_until:nNnn {#1} #2 {#3} {#4} } } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_step_function:nnnN } - { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_step_function:nnnN } - { \__debug_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 { @@ -5561,7 +5580,7 @@ { \int_compare:nNnTF {#2} = \c_zero { - \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4} + \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4} \use_none:nnnn } { \__int_step:NnnnN < } @@ -6005,14 +6024,9 @@ \int_new:N \g_tmpb_int \cs_gset_eq:NN \c__deprecation_minus_one \m@ne \cs_new_eq:NN \c_minus_one \c__deprecation_minus_one -\__debug:TF - { - \tl_gput_right:Nn \g__debug_deprecation_on_tl - { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } } - \tl_gput_right:Nn \g__debug_deprecation_off_tl - { \tex_let:D \c_minus_one \c__deprecation_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 @@ -6041,7 +6055,7 @@ \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim } { \__intarray_gset_fast:Nnn #1 {#2} {#3} } { - \__msg_kernel_error:nnxxxx { kernel } { overflow } + \__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} @@ -6049,7 +6063,7 @@ } } { - \__msg_kernel_error:nnxxx { kernel } { out-of-bounds } + \__kernel_msg_error:nnxxx { kernel } { out-of-bounds } { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 } } } @@ -6062,19 +6076,19 @@ \int_compare:nTF { 1 <= #2 <= \__intarray_count:N #1 } { \__intarray_item_fast:Nn #1 {#2} } { - \__msg_kernel_expandable_error:nnnnn { kernel } { out-of-bounds } + \__kernel_msg_expandable_error:nnnnn { kernel } { out-of-bounds } { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 } 0 } } -%% File: l3flag.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3flag.dtx Copyright (C) 2011-2018 The LaTeX3 Project \cs_new_protected:Npn \flag_new:n #1 { \cs_new:cpn { flag~#1 } ##1 ; { \exp_after:wN \use_none:n \cs:w flag~#1~##1 \cs_end: } } -\__debug_patch:nnNNpn - { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { } +\__kernel_patch:nnNNpn + { \exp_args:Nc \__kernel_chk_var_exist:N { flag~#1 } } { } \cs_new_protected:Npn \flag_clear:n #1 { \__flag_clear:wn 0 ; {#1} } \cs_new_protected:Npn \__flag_clear:wn #1 ; #2 { @@ -6104,7 +6118,7 @@ { \flag_if_exist:nF {#1} { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } { flag~#1~ } } } @@ -6114,7 +6128,7 @@ \cs_if_exist:cTF { flag~#1 } { \prg_return_true: } { \prg_return_false: } } -\__debug_patch_conditional:nNNpnn { \__flag_chk_exist:n {#1} } +\__kernel_patch_conditional:nNNpnn { \__flag_chk_exist:n {#1} } \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF } { \if_cs_exist:w flag~#1~0 \cs_end: @@ -6123,7 +6137,7 @@ \prg_return_false: \fi: } -\__debug_patch:nnNNpn { \__flag_chk_exist:n {#1} } { } +\__kernel_patch:nnNNpn { \__flag_chk_exist:n {#1} } { } \cs_new:Npn \flag_height:n #1 { \__flag_height_loop:wn 0; {#1} } \cs_new:Npn \__flag_height_loop:wn #1 ; #2 { @@ -6140,8 +6154,8 @@ \cs:w flag~#1 \exp_after:wN \cs_end: \__int_value:w \flag_height:n {#1} ; } -%% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN q #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 @@ -6237,7 +6251,7 @@ { \tl_if_in:NnTF \g__scan_marks_tl { #1 } { - \__msg_kernel_error:nnx { kernel } { scanmark-already-defined } + \__kernel_msg_error:nnx { kernel } { scanmark-already-defined } { \token_to_str:N #1 } } { @@ -6248,21 +6262,21 @@ \__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-2017 The LaTeX3 Project +%% 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 \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool } \cs_generate_variant:Nn \bool_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set_true:N #1 { \cs_set_eq:NN #1 \c_true_bool } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set_false:N #1 { \cs_set_eq:NN #1 \c_false_bool } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset_true:N #1 { \cs_gset_eq:NN #1 \c_true_bool } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset_false:N #1 { \cs_gset_eq:NN #1 \c_false_bool } \cs_generate_variant:Nn \bool_set_true:N { c } @@ -6273,10 +6287,10 @@ \cs_new_eq:NN \bool_gset_eq:NN \tl_gset_eq:NN \cs_generate_variant:Nn \bool_set_eq:NN { Nc, cN, cc } \cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set:Nn #1#2 { \tex_chardef:D #1 = \bool_if_p:n {#2} } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} } \cs_generate_variant:Nn \bool_set:Nn { c } @@ -6478,7 +6492,7 @@ \cs_new:cpn { __prg_replicate_first_-:n } #1 { \exp_end: - \__msg_kernel_expandable_error:nn { kernel } { negative-replication } + \__kernel_msg_expandable_error:nn { kernel } { negative-replication } } \cs_new:cpn { __prg_replicate_first_0:n } #1 { \exp_end: } \cs_new:cpn { __prg_replicate_first_1:n } #1 { \exp_end: #1 } @@ -6940,7 +6954,7 @@ } } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} } } @@ -7040,7 +7054,7 @@ \clist_new:N \l_tmpb_clist \clist_new:N \g_tmpa_clist \clist_new:N \g_tmpb_clist -%% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project +%% 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} } \cs_new:Npn \char_value_catcode:n #1 @@ -7161,7 +7175,7 @@ \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 } -\__debug_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } } +\__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 \__char_generate_aux:w @@ -7177,13 +7191,13 @@ \cs_new:Npn \__char_generate_aux:w #1 ; #2 ; { \if_int_compare:w #2 = 13 \exp_stop_f: - \__msg_kernel_expandable_error:nn { kernel } { char-active } + \__kernel_msg_expandable_error:nn { kernel } { char-active } \else: \if_int_compare:w #2 = 10 \exp_stop_f: \if_int_compare:w #1 = 0 \exp_stop_f: - \__msg_kernel_expandable_error:nn { kernel } { char-null-space } + \__kernel_msg_expandable_error:nn { kernel } { char-null-space } \else: - \__msg_kernel_expandable_error:nn { kernel } { char-space } + \__kernel_msg_expandable_error:nn { kernel } { char-space } \fi: \else: \if_int_odd:w 0 @@ -7191,13 +7205,13 @@ \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: - \__msg_kernel_expandable_error:nn { kernel } + \__kernel_msg_expandable_error:nn { kernel } { char-invalid-catcode } \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: - \__msg_kernel_expandable_error:nn { kernel } + \__kernel_msg_expandable_error:nn { kernel } { char-out-of-range } \else: \__char_generate_aux:nnw {#1} {#2} @@ -7749,12 +7763,12 @@ } { \scan_stop: } } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN } +\__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 \cs_new:Npn \__prop_pair:wn #1 \s__prop #2 - { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } } + { \__kernel_msg_expandable_error:nn { kernel } { misused-prop } } \tl_new:N \l__prop_internal_tl \tl_const:Nn \c_empty_prop { \s__prop } \cs_new_protected:Npn \prop_new:N #1 @@ -7829,7 +7843,7 @@ \s__prop { \exp_not:n {#1} } } { - \exp_args:Nnno \__msg_kernel_expandable_error:nnn + \exp_args:Nnno \__kernel_msg_expandable_error:nnn { kernel } { prop-keyval } {#4} } } @@ -8058,7 +8072,7 @@ { } { } } } -%% File: l3msg.dtx Copyright (C) 2009-2017 The LaTeX3 Project +%% File: l3msg.dtx Copyright (C) 2009-2018 The LaTeX3 Project \tl_new:N \l__msg_internal_tl \bool_new:N \l__msg_line_context_bool \tl_const:Nn \c__msg_text_prefix_tl { msg~text~>~ } @@ -8068,13 +8082,13 @@ \cs_if_exist:cTF { \c__msg_text_prefix_tl #1 / #2 } { \prg_return_true: } { \prg_return_false: } } -\__debug_patch:nnNNpn { } - { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } } +\__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 { \msg_if_exist:nnT {#1} {#2} { - \__msg_kernel_error:nnxx { kernel } { message-already-defined } + \__kernel_msg_error:nnxx { kernel } { message-already-defined } {#1} {#2} } } @@ -8392,7 +8406,7 @@ \cs_new:Npn \__msg_class_chk_exist:nT #1 { \cs_if_free:cTF { __msg_ #1 _code:nnnnnn } - { \__msg_kernel_error:nnx { kernel } { message-class-unknown } {#1} } + { \__kernel_msg_error:nnx { kernel } { message-class-unknown } {#1} } } \tl_new:N \l__msg_class_tl \tl_new:N \l__msg_current_class_tl @@ -8417,7 +8431,7 @@ \__msg_use_redirect_name:n { #2 / #3 } } } - { \__msg_kernel_error:nnxx { kernel } { message-unknown } {#2} {#3} } + { \__kernel_msg_error:nnxx { kernel } { message-unknown } {#2} {#3} } } \cs_new_protected:Npn \__msg_use_code: { } \cs_new_protected:Npn \__msg_use_redirect_name:n #1 @@ -8504,7 +8518,7 @@ \tl_if_eq:NNTF \l__msg_class_tl \l__msg_current_class_tl { \prop_put:cnn { l__msg_redirect_ #2 _prop } {#3} {#2} - \__msg_kernel_warning:nnxxxx + \__kernel_msg_warning:nnxxxx { kernel } { message-redirect-loop } { \seq_item:Nn \l__msg_class_loop_seq { 1 } } { \seq_item:Nn \l__msg_class_loop_seq { 2 } } @@ -8521,20 +8535,20 @@ } \cs_generate_variant:Nn \__msg_redirect_loop_chk:nnn { o } \cs_new:Npn \__msg_redirect_loop_list:n #1 { {#1} ~ => ~ } -\cs_new_protected:Npn \__msg_kernel_new:nnnn #1#2 +\cs_new_protected:Npn \__kernel_msg_new:nnnn #1#2 { \msg_new:nnnn { LaTeX } { #1 / #2 } } -\cs_new_protected:Npn \__msg_kernel_new:nnn #1#2 +\cs_new_protected:Npn \__kernel_msg_new:nnn #1#2 { \msg_new:nnn { LaTeX } { #1 / #2 } } -\cs_new_protected:Npn \__msg_kernel_set:nnnn #1#2 +\cs_new_protected:Npn \__kernel_msg_set:nnnn #1#2 { \msg_set:nnnn { LaTeX } { #1 / #2 } } -\cs_new_protected:Npn \__msg_kernel_set:nnn #1#2 +\cs_new_protected:Npn \__kernel_msg_set:nnn #1#2 { \msg_set:nnn { LaTeX } { #1 / #2 } } \group_begin: \cs_set_protected:Npn \__msg_kernel_class_new:nN #1 - { \__msg_kernel_class_new_aux:nN { kernel_ #1 } } + { \__msg_kernel_class_new_aux:nN { __kernel_msg_ #1 } } \cs_set_protected:Npn \__msg_kernel_class_new_aux:nN #1#2 { - \cs_new_protected:cpn { __msg_ #1 :nnnnnn } ##1##2##3##4##5##6 + \cs_new_protected:cpn { #1 :nnnnnn } ##1##2##3##4##5##6 { \use:x { @@ -8543,39 +8557,39 @@ { \tl_to_str:n {##5} } { \tl_to_str:n {##6} } } } - \cs_new_protected:cpx { __msg_ #1 :nnnnn } ##1##2##3##4##5 - { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } } - \cs_new_protected:cpx { __msg_ #1 :nnnn } ##1##2##3##4 - { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } } - \cs_new_protected:cpx { __msg_ #1 :nnn } ##1##2##3 - { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } } - \cs_new_protected:cpx { __msg_ #1 :nn } ##1##2 - { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } } - \cs_new_protected:cpx { __msg_ #1 :nnxxxx } ##1##2##3##4##5##6 + \cs_new_protected:cpx { #1 :nnnnn } ##1##2##3##4##5 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } } + \cs_new_protected:cpx { #1 :nnnn } ##1##2##3##4 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } } + \cs_new_protected:cpx { #1 :nnn } ##1##2##3 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} { } { } { } } + \cs_new_protected:cpx { #1 :nn } ##1##2 + { \exp_not:c { #1 :nnnnnn } {##1} {##2} { } { } { } { } } + \cs_new_protected:cpx { #1 :nnxxxx } ##1##2##3##4##5##6 { \use:x { \exp_not:N \exp_not:n - { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} } + { \exp_not:c { #1 :nnnnnn } {##1} {##2} } {##3} {##4} {##5} {##6} } } - \cs_new_protected:cpx { __msg_ #1 :nnxxx } ##1##2##3##4##5 - { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } - \cs_new_protected:cpx { __msg_ #1 :nnxx } ##1##2##3##4 - { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } - \cs_new_protected:cpx { __msg_ #1 :nnx } ##1##2##3 - { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } + \cs_new_protected:cpx { #1 :nnxxx } ##1##2##3##4##5 + { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } + \cs_new_protected:cpx { #1 :nnxx } ##1##2##3##4 + { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } + \cs_new_protected:cpx { #1 :nnx } ##1##2##3 + { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } } \__msg_kernel_class_new:nN { fatal } \__msg_fatal_code:nnnnnn - \cs_undefine:N \__msg_kernel_error:nnxx - \cs_undefine:N \__msg_kernel_error:nnx - \cs_undefine:N \__msg_kernel_error:nn + \cs_undefine:N \__kernel_msg_error:nnxx + \cs_undefine:N \__kernel_msg_error:nnx + \cs_undefine:N \__kernel_msg_error:nn \__msg_kernel_class_new:nN { error } \__msg_error_code:nnnnnn \__msg_kernel_class_new:nN { warning } \msg_warning:nnxxxx \__msg_kernel_class_new:nN { info } \msg_info:nnxxxx \group_end: -\__msg_kernel_new:nnnn { kernel } { message-already-defined } +\__kernel_msg_new:nnnn { kernel } { message-already-defined } { Message~'#2'~for~module~'#1'~already~defined. } { \c__msg_coding_error_text_tl @@ -8583,7 +8597,7 @@ by~the~module~'#1':~this~message~already~exists. \c__msg_return_text_tl } -\__msg_kernel_new:nnnn { kernel } { message-unknown } +\__kernel_msg_new:nnnn { kernel } { message-unknown } { Unknown~message~'#2'~for~module~'#1'. } { \c__msg_coding_error_text_tl @@ -8591,14 +8605,14 @@ by~the~module~'#1':~this~message~does~not~exist. \c__msg_return_text_tl } -\__msg_kernel_new:nnnn { kernel } { message-class-unknown } +\__kernel_msg_new:nnnn { kernel } { message-class-unknown } { Unknown~message~class~'#1'. } { LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\ this~was~never~defined. \c__msg_return_text_tl } -\__msg_kernel_new:nnnn { kernel } { message-redirect-loop } +\__kernel_msg_new:nnnn { kernel } { message-redirect-loop } { Message~redirection~loop~caused~by~ {#1} ~=>~ {#2} \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } . @@ -8609,7 +8623,7 @@ created~an~infinite~loop\\\\ \iow_indent:n { #4 \\\\ } } -\__msg_kernel_new:nnnn { kernel } { bad-number-of-arguments } +\__kernel_msg_new:nnnn { kernel } { bad-number-of-arguments } { Function~'#1'~cannot~be~defined~with~#2~arguments. } { \c__msg_coding_error_text_tl @@ -8617,17 +8631,17 @@ #2~arguments.~ TeX~allows~between~0~and~9~arguments~for~a~single~function. } -\__msg_kernel_new:nnn { kernel } { char-active } +\__kernel_msg_new:nnn { kernel } { char-active } { Cannot~generate~active~chars. } -\__msg_kernel_new:nnn { kernel } { char-invalid-catcode } +\__kernel_msg_new:nnn { kernel } { char-invalid-catcode } { Invalid~catcode~for~char~generation. } -\__msg_kernel_new:nnn { kernel } { char-null-space } +\__kernel_msg_new:nnn { kernel } { char-null-space } { Cannot~generate~null~char~as~a~space. } -\__msg_kernel_new:nnn { kernel } { char-out-of-range } +\__kernel_msg_new:nnn { kernel } { char-out-of-range } { Charcode~requested~out~of~engine~range. } -\__msg_kernel_new:nnn { kernel } { char-space } +\__kernel_msg_new:nnn { kernel } { char-space } { Cannot~generate~space~chars. } -\__msg_kernel_new:nnnn { kernel } { command-already-defined } +\__kernel_msg_new:nnnn { kernel } { command-already-defined } { Control~sequence~#1~already~defined. } { \c__msg_coding_error_text_tl @@ -8636,33 +8650,33 @@ The~current~meaning~is:\\ \ \ #2 } -\__msg_kernel_new:nnnn { kernel } { command-not-defined } +\__kernel_msg_new:nnnn { kernel } { command-not-defined } { Control~sequence~#1~undefined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\ this~has~not~been~defined~yet. } -\__msg_kernel_new:nnn { kernel } { deprecated-command } +\__kernel_msg_new:nnn { kernel } { deprecated-command } { The~deprecated~command~'#2'~has~been~or~will~be~removed~on~#1. \tl_if_empty:nF {#3} { ~Use~instead~'#3'. } } -\__msg_kernel_new:nnnn { kernel } { empty-search-pattern } +\__kernel_msg_new:nnnn { kernel } { empty-search-pattern } { Empty~search~pattern. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~ would~lead~to~an~infinite~loop! } -\__msg_kernel_new:nnnn { kernel } { out-of-registers } +\__kernel_msg_new:nnnn { kernel } { out-of-registers } { No~room~for~a~new~#1. } { TeX~only~supports~\int_use:N \c_max_register_int \ % of~each~type.~All~the~#1~registers~have~been~used.~ This~run~will~be~aborted~now. } -\__msg_kernel_new:nnnn { kernel } { non-base-function } +\__kernel_msg_new:nnnn { kernel } { non-base-function } { Function~'#1'~is~not~a~base~function } { \c__msg_coding_error_text_tl @@ -8671,7 +8685,7 @@ To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~ and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn. } -\__msg_kernel_new:nnnn { kernel } { missing-colon } +\__kernel_msg_new:nnnn { kernel } { missing-colon } { Function~'#1'~contains~no~':'. } { \c__msg_coding_error_text_tl @@ -8680,47 +8694,47 @@ needed~when~defining~conditionals~or~variants,~or~when~building~a~ parameter~text~from~the~number~of~arguments~of~the~function. } -\__msg_kernel_new:nnnn { kernel } { overflow } +\__kernel_msg_new:nnnn { kernel } { overflow } { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. } { An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~ The~largest~allowed~value~#4~will~be~used~instead. } -\__msg_kernel_new:nnnn { kernel } { out-of-bounds } +\__kernel_msg_new:nnnn { kernel } { out-of-bounds } { Access~to~an~entry~beyond~an~array's~bounds. } { An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~ array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3. } -\__msg_kernel_new:nnnn { kernel } { protected-predicate } +\__kernel_msg_new:nnnn { kernel } { protected-predicate } { Predicate~'#1'~must~be~expandable. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~ Only~expandable~tests~can~have~a~predicate~version. } -\__msg_kernel_new:nnnn { kernel } { conditional-form-unknown } +\__kernel_msg_new:nnnn { kernel } { conditional-form-unknown } { Conditional~form~'#1'~for~function~'#2'~unknown. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~ the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist. } -\__msg_kernel_new:nnnn { kernel } { scanmark-already-defined } +\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined } { Scan~mark~#1~already~defined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~ but~this~name~has~already~been~used~for~a~scan~mark. } -\__msg_kernel_new:nnnn { kernel } { variable-not-defined } +\__kernel_msg_new:nnnn { kernel } { variable-not-defined } { Variable~#1~undefined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~ been~defined~yet. } -\__msg_kernel_new:nnnn { kernel } { variant-too-long } +\__kernel_msg_new:nnnn { kernel } { variant-too-long } { Variant~form~'#1'~longer~than~base~signature~of~'#2'. } { \c__msg_coding_error_text_tl @@ -8728,7 +8742,7 @@ with~a~signature~starting~with~'#1',~but~that~is~longer~than~ the~signature~(part~after~the~colon)~of~'#2'. } -\__msg_kernel_new:nnnn { kernel } { invalid-variant } +\__kernel_msg_new:nnnn { kernel } { invalid-variant } { Variant~form~'#1'~invalid~for~base~form~'#2'. } { \c__msg_coding_error_text_tl @@ -8736,17 +8750,28 @@ with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~ from~type~'#3'~to~type~'#4'. } +\__kernel_msg_new:nnn { kernel } { deprecated-variant } + { + Variant~form~'#1'~deprecated~for~base~form~'#2'.~ + One~should~not~change~an~argument~from~type~'#3'~to~type~'#4' + \str_case:nnF {#3} + { + { n } { :~use~a~'\token_if_eq_charcode:NNTF #4 c v V'~variant? } + { N } { :~base~form~only~accepts~a~single~token~argument. } + {#4} { :~base~form~is~already~a~variant. } + } { . } + } \bool_if:NTF \l@expl@enable@debug@bool { - \__msg_kernel_new:nnnn { kernel } { debug } + \__kernel_msg_new:nnnn { kernel } { debug } { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. } { The~functions~'\iow_char:N\\debug_on:n'~and~ '\iow_char:N\\debug_off:n'~only~accept~the~arguments~ 'check-declarations',~'deprecation',~'log-functions',~not~'#1'. } - \__msg_kernel_new:nnn { kernel } { expr } { '#2'~in~#1 } - \__msg_kernel_new:nnnn { kernel } { local-global } + \__kernel_msg_new:nnn { kernel } { expr } { '#2'~in~#1 } + \__kernel_msg_new:nnnn { kernel } { local-global } { Inconsistent~local/global~assignment } { \c__msg_coding_error_text_tl @@ -8755,7 +8780,7 @@ \if:w l #1 local \else: \if:w g #1 global \else: constant \fi: \fi: \ variable~'#3'. } - \__msg_kernel_new:nnnn { kernel } { non-declared-variable } + \__kernel_msg_new:nnnn { kernel } { non-declared-variable } { The~variable~#1~has~not~been~declared~\msg_line_context:. } { Checking~is~active,~and~you~have~tried~do~so~something~like: \\ @@ -8767,7 +8792,7 @@ } } { - \__msg_kernel_new:nnnn { kernel } { enable-debug } + \__kernel_msg_new:nnnn { kernel } { enable-debug } { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. } { The~function~'#1'~will~be~ignored~because~it~can~only~work~if~ @@ -8777,44 +8802,44 @@ given~when~loading~expl3. } } -\__msg_kernel_new:nnn { kernel } { bad-exp-end-f } +\__kernel_msg_new:nnn { kernel } { bad-exp-end-f } { Misused~\exp_end_continue_f:w or~:nw } -\__msg_kernel_new:nnn { kernel } { bad-variable } +\__kernel_msg_new:nnn { kernel } { bad-variable } { Erroneous~variable~#1 used! } -\__msg_kernel_new:nnn { kernel } { misused-sequence } +\__kernel_msg_new:nnn { kernel } { misused-sequence } { A~sequence~was~misused. } -\__msg_kernel_new:nnn { kernel } { misused-prop } +\__kernel_msg_new:nnn { kernel } { misused-prop } { A~property~list~was~misused. } -\__msg_kernel_new:nnn { kernel } { negative-replication } +\__kernel_msg_new:nnn { kernel } { negative-replication } { Negative~argument~for~\prg_replicate:nn. } -\__msg_kernel_new:nnn { kernel } { prop-keyval } +\__kernel_msg_new:nnn { kernel } { prop-keyval } { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') } -\__msg_kernel_new:nnn { kernel } { unknown-comparison } +\__kernel_msg_new:nnn { kernel } { unknown-comparison } { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. } -\__msg_kernel_new:nnn { kernel } { zero-step } +\__kernel_msg_new:nnn { kernel } { zero-step } { Zero~step~size~for~step~function~#1. } -\__msg_kernel_new:nnn { kernel } { show-clist } +\__kernel_msg_new:nnn { kernel } { show-clist } { The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ } \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~items~(without~outer~braces): #2 . } } -\__msg_kernel_new:nnn { kernel } { show-prop } +\__kernel_msg_new:nnn { kernel } { show-prop } { The~property~list~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~pairs~(without~outer~braces): #2 . } } -\__msg_kernel_new:nnn { kernel } { show-seq } +\__kernel_msg_new:nnn { kernel } { show-seq } { The~sequence~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~items~(without~outer~braces): #2 . } } -\__msg_kernel_new:nnn { kernel } { show-streams } +\__kernel_msg_new:nnn { kernel } { show-streams } { \tl_if_empty:nTF {#2} { No~ } { The~following~ } \str_case:nn {#1} @@ -8842,7 +8867,7 @@ \exp_args:Ncx \__msg_tmp:w { LaTeX3~error: } { \char_generate:nn { `\ } { 7 } } \group_end: -\cs_new:Npn \__msg_kernel_expandable_error:nnnnnn #1#2#3#4#5#6 +\cs_new:Npn \__kernel_msg_expandable_error:nnnnnn #1#2#3#4#5#6 { \exp_args:Nf \__msg_expandable_error:n { @@ -8851,27 +8876,27 @@ {#3} {#4} {#5} {#6} } } -\cs_new:Npn \__msg_kernel_expandable_error:nnnnn #1#2#3#4#5 +\cs_new:Npn \__kernel_msg_expandable_error:nnnnn #1#2#3#4#5 { - \__msg_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } } -\cs_new:Npn \__msg_kernel_expandable_error:nnnn #1#2#3#4 +\cs_new:Npn \__kernel_msg_expandable_error:nnnn #1#2#3#4 { - \__msg_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } } -\cs_new:Npn \__msg_kernel_expandable_error:nnn #1#2#3 +\cs_new:Npn \__kernel_msg_expandable_error:nnn #1#2#3 { - \__msg_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } } -\cs_new:Npn \__msg_kernel_expandable_error:nn #1#2 +\cs_new:Npn \__kernel_msg_expandable_error:nn #1#2 { - \__msg_kernel_expandable_error:nnnnnn + \__kernel_msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } } -%% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project +%% File: l3file.dtx Copyright (C) 1990-2018 The LaTeX3 Project \str_new:N \g_file_curr_dir_str \str_new:N \g_file_curr_ext_str \str_new:N \g_file_curr_name_str @@ -8927,7 +8952,7 @@ \int_if_even:nF { 0 \tl_map_function:NN #2 \__file_name_quote_aux:n } { - \__msg_kernel_error:nnx + \__kernel_msg_error:nnx { kernel } { unbalanced-quote-in-filename } {#2} } \tl_remove_all:Nn #2 { " } @@ -8983,7 +9008,7 @@ \cs_new_protected:Npn \__file_missing:n #1 { \__file_name_sanitize:nN {#1} \l__file_base_name_str - \__msg_kernel_error:nnx { kernel } { file-not-found } + \__kernel_msg_error:nnx { kernel } { file-not-found } { \l__file_base_name_str } } \cs_new_protected:Npn \file_input:n #1 @@ -9375,7 +9400,7 @@ } \cs_new_protected:Npn \iow_indent:n #1 { - \__msg_kernel_error:nnnnn { kernel } { iow-indent } + \__kernel_msg_error:nnnnn { kernel } { iow-indent } { \iow_wrap:nnnN } { \iow_indent:n } {#1} #1 } @@ -9387,7 +9412,7 @@ } \cs_new:Npn \__iow_indent_error:n #1 { - \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent } + \__kernel_msg_expandable_error:nnnnn { kernel } { iow-indent } { \iow_wrap:nnnN } { \iow_indent:n } {#1} #1 } @@ -9627,38 +9652,38 @@ \cs_new:Npn \__iow_wrap_trim:w ##1 #1 \q_stop {##1} } \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl -\__msg_kernel_new:nnnn { kernel } { file-not-found } +\__kernel_msg_new:nnnn { kernel } { file-not-found } { File~'#1'~not~found. } { The~requested~file~could~not~be~found~in~the~current~directory,~ in~the~TeX~search~path~or~in~the~LaTeX~search~path. } -\__msg_kernel_new:nnn { kernel } { file-list } +\__kernel_msg_new:nnn { kernel } { file-list } { >~File~List~< #1 \\ ............. } -\__msg_kernel_new:nnnn { kernel } { input-streams-exhausted } +\__kernel_msg_new:nnnn { kernel } { input-streams-exhausted } { Input~streams~exhausted } { TeX~can~only~open~up~to~16~input~streams~at~one~time.\\ All~16~are~currently~in~use,~and~something~wanted~to~open~ another~one. } -\__msg_kernel_new:nnnn { kernel } { output-streams-exhausted } +\__kernel_msg_new:nnnn { kernel } { output-streams-exhausted } { Output~streams~exhausted } { TeX~can~only~open~up~to~16~output~streams~at~one~time.\\ All~16~are~currently~in~use,~and~something~wanted~to~open~ another~one. } -\__msg_kernel_new:nnnn { kernel } { unbalanced-quote-in-filename } +\__kernel_msg_new:nnnn { kernel } { unbalanced-quote-in-filename } { Unbalanced~quotes~in~file~name~'#1'. } { File~names~must~contain~balanced~numbers~of~quotes~("). } -\__msg_kernel_new:nnnn { kernel } { iow-indent } +\__kernel_msg_new:nnnn { kernel } { iow-indent } { Only~#1 (arg~1)~allows~#2 } { The~command~#2 can~only~be~used~in~messages~ @@ -9667,18 +9692,13 @@ } \tl_new:N \g_file_current_name_tl \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str } -\__debug:TF +\__kernel_deprecation_code:nn { - \tl_gput_right:Nn \g__debug_deprecation_on_tl - { - \__deprecation_error:Nnn \g_file_current_name_tl - { \g_file_curr_name_str } { 2018-12-31 } - } - \tl_gput_right:Nn \g__debug_deprecation_off_tl - { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } } + \__deprecation_error:Nnn \g_file_current_name_tl + { \g_file_curr_name_str } { 2018-12-31 } } - { } -\__debug_deprecation:nnNNpn { 2018-12-31 } + { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \seq_put_right:Nn \l_file_search_path_seq } \cs_new_protected:Npn \file_path_include:n #1 { @@ -9686,34 +9706,34 @@ \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 } } -\__debug_deprecation:nnNNpn { 2018-12-31 } +\__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 } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN } \cs_new_protected:Npn \file_add_path:nN #1#2 { \file_get_full_name:nN {#1} #2 \str_if_empty:NT #2 { \tl_set:Nn #2 { \q_no_value } } } -\__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN } \cs_new_protected:Npn \ior_get_str:NN { \ior_str_get:NN } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: } \cs_new_protected:Npn \file_list: { \file_log_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: } \cs_new_protected:Npn \ior_list_streams: { \ior_show_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: } \cs_new_protected:Npn \ior_log_streams: { \ior_log_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: } \cs_new_protected:Npn \iow_list_streams: { \iow_show_list: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: } \cs_new_protected:Npn \iow_log_streams: { \iow_log_list: } %% File: l3skip.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 \if_dim:w \tex_ifdim:D \cs_new_eq:NN \__dim_eval:w \etex_dimexpr:D \cs_new_eq:NN \__dim_eval_end: \tex_relax:D @@ -9723,16 +9743,16 @@ \cs:w newdimen \cs_end: #1 } \cs_generate_variant:Nn \dim_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \dim_const:Nn #1#2 { \dim_new:N #1 \tex_global:D #1 ~ \dim_eval:n {#2} \scan_stop: } \cs_generate_variant:Nn \dim_const:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \dim_zero:N #1 { #1 \c_zero_skip } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \dim_gzero:N #1 { \tex_global:D #1 \c_zero_skip } \cs_generate_variant:Nn \dim_zero:N { c } @@ -9749,46 +9769,46 @@ { TF , T , F , p } \cs_set_protected:Npn \__dim_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } - { {##1} { \__debug_chk_expr:nNnN {##2} \__dim_eval:w { } #3 } } + { {##1} { \__kernel_chk_expr:nNnN {##2} \__dim_eval:w { } #3 } } #2 #3 } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \dim_set:Nn #1#2 { #1 ~ \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \dim_gset:Nn #1#2 { \tex_global:D #1 ~ \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_set:Nn { c } \cs_generate_variant:Nn \dim_gset:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \dim_set_eq:NN #1#2 { #1 = #2 \scan_stop: } \cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \dim_gset_eq:NN #1#2 { \tex_global:D #1 = #2 \scan_stop: } \cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \dim_add:Nn #1#2 { \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \dim_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_add:Nn { c } \cs_generate_variant:Nn \dim_gadd:Nn { c } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \dim_sub:Nn #1#2 { \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \dim_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_sub:Nn { c } \cs_generate_variant:Nn \dim_gsub:Nn { c } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_abs:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_abs:n } } \cs_new:Npn \dim_abs:n #1 { \exp_after:wN \__dim_abs:N @@ -9796,10 +9816,10 @@ } \cs_new:Npn \__dim_abs:N #1 { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_max:nn } - { \__debug_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_max:nn } + { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_max:nn } + { \__kernel_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_max:nn } } \cs_new:Npn \dim_max:nn #1#2 { @@ -9809,10 +9829,10 @@ > \__dim_eval_end: } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_min:nn } - { \__debug_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_min:nn } + { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_min:nn } + { \__kernel_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_min:nn } } \cs_new:Npn \dim_min:nn #1#2 { @@ -9834,11 +9854,11 @@ { \__dim_ratio:n {#1} / \__dim_ratio:n {#2} } \cs_new:Npn \__dim_ratio:n #1 { \__int_value:w \__dim_eval:w (#1) \__dim_eval_end: } -\__debug_patch_conditional_args:nNNpnn +\__kernel_patch_conditional_args:nNNpnn { - { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_compare:nNn } + { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_compare:nNn } { \__dim_eval_end: #2 } - { \__debug_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_compare:nNn } + { \__kernel_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_compare:nNn } } \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF } { @@ -9964,17 +9984,78 @@ \dim_compare:nNnF {#1} #2 {#3} { \dim_do_until:nNnn {#1} #2 {#3} {#4} } } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_eval:n } } +\__kernel_patch_args:nNNpn + { + { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_step_function:nnnN } + { \__kernel_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_step_function:nnnN } + { \__kernel_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_step_function:nnnN } + } +\cs_new:Npn \dim_step_function:nnnN #1#2#3 + { + \exp_after:wN \__dim_step:wwwN + \tex_the:D \__dim_eval:w #1 \exp_after:wN ; + \tex_the:D \__dim_eval:w #2 \exp_after:wN ; + \tex_the:D \__dim_eval:w #3 ; + } +\cs_new:Npn \__dim_step:wwwN #1; #2; #3; #4 + { + \dim_compare:nNnTF {#2} > \c_zero_dim + { \__dim_step:NnnnN > } + { + \dim_compare:nNnTF {#2} = \c_zero_dim + { + \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4} + \use_none:nnnn + } + { \__dim_step:NnnnN < } + } + {#1} {#2} {#3} #4 + } +\cs_new:Npn \__dim_step:NnnnN #1#2#3#4#5 + { + \dim_compare:nNnF {#2} #1 {#4} + { + #5 {#2} + \exp_args:NNf \__dim_step:NnnnN + #1 { \dim_eval:n { #2 + #3 } } {#3} {#4} #5 + } + } +\cs_new_protected:Npn \dim_step_inline:nnnn + { + \int_gincr:N \g__prg_map_int + \exp_args:NNc \__dim_step:NNnnnn + \cs_gset_protected:Npn + { __prg_map_ \int_use:N \g__prg_map_int :w } + } +\cs_new_protected:Npn \dim_step_variable:nnnNn #1#2#3#4#5 + { + \int_gincr:N \g__prg_map_int + \exp_args:NNc \__dim_step:NNnnnn + \cs_gset_protected:Npx + { __prg_map_ \int_use:N \g__prg_map_int :w } + {#1}{#2}{#3} + { + \tl_set:Nn \exp_not:N #4 {##1} + \exp_not:n {#5} + } + } +\cs_new_protected:Npn \__dim_step:NNnnnn #1#2#3#4#5#6 + { + #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 } + } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_eval:n } } \cs_new:Npn \dim_eval:n #1 { \dim_use:N \__dim_eval:w #1 \__dim_eval_end: } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \__dim_eval:n } } +\__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 \__dim_eval_end: } \cs_new_eq:NN \dim_use:N \tex_the:D \cs_new:Npn \dim_use:c #1 { \tex_the:D \cs:w #1 \cs_end: } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal:n } } \cs_new:Npn \dim_to_decimal:n #1 { \exp_after:wN @@ -9992,8 +10073,8 @@ } \cs_new:Npn \dim_to_decimal_in_bp:n #1 { \dim_to_decimal:n { ( #1 ) * 800 / 803 } } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal_in_sp:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal_in_sp:n } } \cs_new:Npn \dim_to_decimal_in_sp:n #1 { \int_eval:n { \__dim_eval:w #1 \__dim_eval_end: } } \cs_new:Npn \dim_to_decimal_in_unit:nn #1#2 @@ -10024,16 +10105,16 @@ \cs:w newskip \cs_end: #1 } \cs_generate_variant:Nn \skip_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \skip_const:Nn #1#2 { \skip_new:N #1 \tex_global:D #1 ~ \skip_eval:n {#2} \scan_stop: } \cs_generate_variant:Nn \skip_const:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \skip_zero:N #1 { #1 \c_zero_skip } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \skip_gzero:N #1 { \tex_global:D #1 \c_zero_skip } \cs_generate_variant:Nn \skip_zero:N { c } \cs_generate_variant:Nn \skip_gzero:N { c } @@ -10049,16 +10130,16 @@ { TF , T , F , p } \cs_set_protected:Npn \__dim_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } - { {##1} { \__debug_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } } + { {##1} { \__kernel_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } } #2 #3 } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \skip_set:Nn #1#2 { #1 ~ \etex_glueexpr:D #2 \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \skip_gset:Nn #1#2 { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_set:Nn { c } @@ -10067,18 +10148,18 @@ \cs_generate_variant:Nn \skip_set_eq:NN { c , Nc , cc } \cs_new_protected:Npn \skip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \skip_gset_eq:NN { c , Nc , cc } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \skip_add:Nn #1#2 { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \skip_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_add:Nn { c } \cs_generate_variant:Nn \skip_gadd:Nn { c } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \skip_sub:Nn #1#2 { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \skip_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_sub:Nn { c } @@ -10095,10 +10176,10 @@ } \cs_set_protected:Npn \__dim_tmp:w #1 { - \__debug_patch_conditional_args:nNNpnn + \__kernel_patch_conditional_args:nNNpnn { { - \__debug_chk_expr:nNnN + \__kernel_chk_expr:nNnN {##1} \etex_glueexpr:D { } \skip_if_finite:n } } @@ -10111,20 +10192,20 @@ \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3} } \exp_args:No \__dim_tmp:w { \tl_to_str:n { fil } } -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } } +\__kernel_patch_args:nNNpn + { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } } \cs_new:Npn \skip_eval:n #1 { \skip_use:N \etex_glueexpr:D #1 \scan_stop: } \cs_new_eq:NN \skip_use:N \tex_the:D \cs_new:Npn \skip_use:c #1 { \tex_the:D \cs:w #1 \cs_end: } \cs_new_eq:NN \skip_horizontal:N \tex_hskip:D -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } } +\__kernel_patch_args:nNNpn + { { \__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 -\__debug_patch_args:nNNpn - { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } } +\__kernel_patch_args:nNNpn + { { \__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 } @@ -10149,17 +10230,17 @@ \cs:w newmuskip \cs_end: #1 } \cs_generate_variant:Nn \muskip_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \muskip_const:Nn #1#2 { \muskip_new:N #1 \tex_global:D #1 ~ \muskip_eval:n {#2} \scan_stop: } \cs_generate_variant:Nn \muskip_const:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \muskip_zero:N #1 { #1 \c_zero_muskip } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \muskip_gzero:N #1 { \tex_global:D #1 \c_zero_muskip } \cs_generate_variant:Nn \muskip_zero:N { c } @@ -10176,52 +10257,52 @@ { TF , T , F , p } \cs_set_protected:Npn \__dim_tmp:w #1#2#3 { - \__debug_patch_args:nnnNNpn + \__kernel_patch_args:nnnNNpn { #1 ##1 } { } { {##1} { - \__debug_chk_expr:nNnN {##2} + \__kernel_chk_expr:nNnN {##2} \etex_muexpr:D { \etex_mutoglue:D } #3 } } #2 #3 } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \muskip_set:Nn #1#2 { #1 ~ \etex_muexpr:D #2 \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \muskip_gset:Nn #1#2 { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_set:Nn { c } \cs_generate_variant:Nn \muskip_gset:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \muskip_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \muskip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \muskip_add:Nn #1#2 { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \muskip_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_add:Nn { c } \cs_generate_variant:Nn \muskip_gadd:Nn { c } -\__dim_tmp:w \__debug_chk_var_local:N +\__dim_tmp:w \__kernel_chk_var_local:N \cs_new_protected:Npn \muskip_sub:Nn #1#2 { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: } -\__dim_tmp:w \__debug_chk_var_global:N +\__dim_tmp:w \__kernel_chk_var_global:N \cs_new_protected:Npn \muskip_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_sub:Nn { c } \cs_generate_variant:Nn \muskip_gsub:Nn { c } -\__debug_patch_args:nNNpn +\__kernel_patch_args:nNNpn { { - \__debug_chk_expr:nNnN {#1} \etex_muexpr:D + \__kernel_chk_expr:nNnN {#1} \etex_muexpr:D { \etex_mutoglue:D } \muskip_eval:n } } @@ -10243,7 +10324,7 @@ \muskip_new:N \l_tmpb_muskip \muskip_new:N \g_tmpa_muskip \muskip_new:N \g_tmpb_muskip -%% File: l3keys.dtx Copyright (C) 2006-2017 The LaTeX3 Project +%% File: l3keys.dtx Copyright (C) 2006-2018 The LaTeX3 Project \tl_new:N \l__keyval_key_tl \tl_new:N \l__keyval_value_tl \tl_new:N \l__keyval_sanitise_tl @@ -10346,7 +10427,7 @@ } \else: \cs_set:Npn \__keyval_action: - { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } } + { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } } \fi: \fi: \__keyval_action: @@ -10361,13 +10442,13 @@ } \cs_new:Npn \__keyval_action: { } \cs_new_protected:Npn \__keyval_empty_key: - { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } } + { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } } \cs_new_protected:Npn \__keyval_def:Nn #1#2 { \tl_set:Nx #1 { \__tl_trim_spaces:nn {#2} \__keyval_def_aux:n } } \cs_new:Npn \__keyval_def_aux:n #1 { \exp_after:wN \__keyval_def_aux:w #1 \q_stop } \cs_new:Npn \__keyval_def_aux:w #1 \q_stop { \exp_not:n {#1} } -\__msg_kernel_new:nnnn { kernel } { misplaced-equals-sign } +\__kernel_msg_new:nnnn { kernel } { misplaced-equals-sign } { Misplaced~equals~sign~in~key-value~input~\msg_line_number: } { LaTeX~is~attempting~to~parse~some~key-value~input~but~found~ @@ -10422,7 +10503,7 @@ { \tl_if_empty:NF \l__keys_property_tl { - \__msg_kernel_error:nnxx { kernel } { property-unknown } + \__kernel_msg_error:nnxx { kernel } { property-unknown } { \l__keys_property_tl } { \l_keys_path_tl } } } @@ -10437,7 +10518,7 @@ \tl_if_blank:nTF {#3} { \tl_clear:N \l__keys_property_tl - \__msg_kernel_error:nnn { kernel } { key-no-property } {#4} + \__kernel_msg_error:nnn { kernel } { key-no-property } {#4} } { \str_if_eq:nnTF {#3} { . } @@ -10476,7 +10557,7 @@ \l__keys_property_tl \q_stop { \use:c { \c__keys_props_root_tl \l__keys_property_tl } } { - \__msg_kernel_error:nnxx { kernel } + \__kernel_msg_error:nnxx { kernel } { property-requires-value } { \l__keys_property_tl } { \l_keys_path_tl } } @@ -10499,7 +10580,7 @@ { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 } \__keys_cmd_set:nn { \l_keys_path_tl / unknown } { - \__msg_kernel_error:nnx { kernel } { boolean-values-only } + \__kernel_msg_error:nnx { kernel } { boolean-values-only } { \l_keys_key_tl } } \__keys_default_set:n { true } @@ -10515,7 +10596,7 @@ { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 } \__keys_cmd_set:nn { \l_keys_path_tl / unknown } { - \__msg_kernel_error:nnx { kernel } { boolean-values-only } + \__kernel_msg_error:nnx { kernel } { boolean-values-only } { \l_keys_key_tl } } \__keys_default_set:n { true } @@ -10534,7 +10615,7 @@ { \exp_not:v { \c__keys_type_root_tl \__keys_parent:o \l_keys_path_tl } } { choice } { - \__msg_kernel_error:nnxx { kernel } { nested-choice-key } + \__kernel_msg_error:nnxx { kernel } { nested-choice-key } { \l_keys_path_tl } { \__keys_parent:o \l_keys_path_tl } } { \__keys_choice_make_aux:N #1 } @@ -10547,7 +10628,7 @@ \__keys_cmd_set:nn { \l_keys_path_tl } { #1 {##1} } \__keys_cmd_set:nn { \l_keys_path_tl / unknown } { - \__msg_kernel_error:nnxx { kernel } { key-choice-unknown } + \__kernel_msg_error:nnxx { kernel } { key-choice-unknown } { \l_keys_path_tl } {##1} } } @@ -10571,10 +10652,10 @@ } } } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { \cs_if_exist:cF { \c__keys_code_root_tl #1 } - { \__debug_log:x { Defining~key~#1~\msg_line_context: } } + { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } } } { } \cs_new_protected:Npn \__keys_cmd_set:nn #1#2 @@ -10659,7 +10740,7 @@ } } { - \__msg_kernel_error:nnx { kernel } { property-boolean-values-only } + \__kernel_msg_error:nnx { kernel } { property-boolean-values-only } { .value_ #1 :n } } } @@ -10667,7 +10748,7 @@ { \bool_if:NF \l__keys_no_value_bool { - \__msg_kernel_error:nnxx { kernel } { value-forbidden } + \__kernel_msg_error:nnxx { kernel } { value-forbidden } { \l_keys_path_tl } { \l_keys_value_tl } \__keys_validate_cleanup:w } @@ -10676,7 +10757,7 @@ { \bool_if:NT \l__keys_no_value_bool { - \__msg_kernel_error:nnx { kernel } { value-required } + \__kernel_msg_error:nnx { kernel } { value-required } { \l_keys_path_tl } \__keys_validate_cleanup:w } @@ -11041,7 +11122,7 @@ \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } } { - \__msg_kernel_error:nnxx { kernel } { key-unknown } + \__kernel_msg_error:nnxx { kernel } { key-unknown } { \l_keys_path_tl } { \l__keys_module_tl } } } @@ -11120,16 +11201,16 @@ } { } { } } -\__msg_kernel_new:nnnn { kernel } { boolean-values-only } +\__kernel_msg_new:nnnn { kernel } { boolean-values-only } { Key~'#1'~accepts~boolean~values~only. } { The~key~'#1'~only~accepts~the~values~'true'~and~'false'. } -\__msg_kernel_new:nnnn { kernel } { key-choice-unknown } +\__kernel_msg_new:nnnn { kernel } { key-choice-unknown } { Key~'#1'~accepts~only~a~fixed~set~of~choices. } { The~key~'#1'~only~accepts~predefined~values,~ and~'#2'~is~not~one~of~these. } -\__msg_kernel_new:nnnn { kernel } { key-no-property } +\__kernel_msg_new:nnnn { kernel } { key-no-property } { No~property~given~in~definition~of~key~'#1'. } { \c__msg_coding_error_text_tl @@ -11138,51 +11219,51 @@ \iow_indent:n { #1 .<property> } \\ \\ LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property. } -\__msg_kernel_new:nnnn { kernel } { key-unknown } +\__kernel_msg_new:nnnn { kernel } { key-unknown } { The~key~'#1'~is~unknown~and~is~being~ignored. } { The~module~'#2'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } -\__msg_kernel_new:nnnn { kernel } { nested-choice-key } +\__kernel_msg_new:nnnn { kernel } { nested-choice-key } { Attempt~to~define~'#1'~as~a~nested~choice~key. } { The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~ itself~a~choice. } -\__msg_kernel_new:nnnn { kernel } { property-boolean-values-only } +\__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'. } -\__msg_kernel_new:nnnn { kernel } { property-requires-value } +\__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. } -\__msg_kernel_new:nnnn { kernel } { property-unknown } +\__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. } -\__msg_kernel_new:nnnn { kernel } { value-forbidden } +\__kernel_msg_new:nnnn { kernel } { value-forbidden } { The~key~'#1'~does~not~take~a~value. } { The~key~'#1'~should~be~given~without~a~value.\\ The~value~'#2'~was~present:~the~key~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { value-required } +\__kernel_msg_new:nnnn { kernel } { value-required } { The~key~'#1'~requires~a~value. } { The~key~'#1'~must~have~a~value.\\ No~value~was~present:~the~key~will~be~ignored. } -\__msg_kernel_new:nnn { kernel } { show-key } +\__kernel_msg_new:nnn { kernel } { show-key } { The~key~#1~ \tl_if_empty:nTF {#2} @@ -11190,7 +11271,7 @@ { has~the~properties: #2 . } } %% File: l3fp.dtx Copyright (C) 2011-2017 The LaTeX3 Project -%% File: l3fp-aux.dtx Copyright(C) 2011-2017 The LaTeX3 Project +%% File: l3fp-aux.dtx Copyright(C) 2011-2018 The LaTeX3 Project \cs_new:Npn \__fp_use_none_stop_f:n #1 { \exp_stop_f: } \cs_new:Npn \__fp_use_s:n #1 { #1; } \cs_new:Npn \__fp_use_s:nn #1#2 { #1#2; } @@ -11201,12 +11282,11 @@ \cs_new:Npn \__fp_rrot:www #1; #2; #3; { #2; #3; #1; } \cs_new:Npn \__fp_use_i:ww #1; #2; { #1; } \cs_new:Npn \__fp_use_i:www #1; #2; #3; { #1; } +\cs_new_protected:Npn \__fp_misused:n #1 + { \__kernel_msg_error:nnx { kernel } { misused-fp } { \fp_to_tl:n {#1} } } \__scan_new:N \s__fp \cs_new_protected:Npn \__fp_chk:w #1 ; - { - \__msg_kernel_error:nnx { kernel } { misused-fp } - { \fp_to_tl:n { \s__fp \__fp_chk:w #1 ; } } - } + { \__fp_misused:n { \s__fp \__fp_chk:w #1 ; } } \__scan_new:N \s__fp_mark \__scan_new:N \s__fp_stop \__scan_new:N \s__fp_invalid @@ -11305,13 +11385,103 @@ \cs_new:Npn \__fp_exp_after_normal:Nwwwww #1 #2; 1 #3 ; 1 #4 ; 1 #5 ; 1 #6 ; { \s__fp \__fp_chk:w 1 #1 {#2} {#3} {#4} {#5} {#6} ; } -\cs_new:Npn \__fp_exp_after_array_f:w #1 +\__scan_new:N \s__fp_tuple +\cs_new_protected:Npn \__fp_tuple_chk:w #1 ; + { \__fp_misused:n { \s__fp_tuple \__fp_tuple_chk:w #1 ; } } +\tl_const:Nn \c__fp_empty_tuple_fp + { \s__fp_tuple \__fp_tuple_chk:w { } ; } +\cs_new:Npn \__fp_array_count:n #1 + { \__fp_tuple_count:w \s__fp_tuple \__fp_tuple_chk:w {#1} ; } +\cs_new:Npn \__fp_tuple_count:w \s__fp_tuple \__fp_tuple_chk:w #1 ; { - \cs:w __fp_exp_after \__fp_type_from_scan:N #1 _f:nw \cs_end: - { \__fp_exp_after_array_f:w } - #1 + \__int_value:w \__int_eval:w 0 + \__fp_tuple_count_loop:Nw #1 { ? \__prg_break: } ; + \__prg_break_point: + \__int_eval_end: + } +\cs_new:Npn \__fp_tuple_count_loop:Nw #1#2; + { \use_none:n #1 + 1 \__fp_tuple_count_loop:Nw } +\cs_new:Npn \__fp_if_type_fp:NTwFw #1 \s__fp #2 #3 \q_stop {#2} +\cs_new:Npn \__fp_array_if_all_fp:nTF #1 + { + \__fp_array_if_all_fp_loop:w #1 { \s__fp \__prg_break: } ; + \__prg_break_point: \use_i:nn + } +\cs_new:Npn \__fp_array_if_all_fp_loop:w #1#2 ; + { + \__fp_if_type_fp:NTwFw + #1 \__fp_array_if_all_fp_loop:w + \s__fp { \__prg_break:n \use_iii:nnn } + \q_stop + } +\cs_new:Npn \__fp_type_from_scan:N #1 + { + \__fp_if_type_fp:NTwFw + #1 { } + \s__fp { \__fp_type_from_scan_other:N #1 } + \q_stop + } +\cs_new:Npx \__fp_type_from_scan_other:N #1 + { + \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w + \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark + \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop + } +\use:x + { + \cs_new:Npn \exp_not:N \__fp_type_from_scan:w + ##1 \tl_to_str:n { s__fp } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop + {##2} + } +\cs_new:Npn \__fp_change_func_type:NNN #1#2#3 + { + \__fp_if_type_fp:NTwFw + #1 #2 + \s__fp + { + \exp_after:wN \__fp_change_func_type_chk:NNN + \cs:w + __fp \__fp_type_from_scan_other:N #1 + \exp_after:wN \__fp_change_func_type_aux:w \token_to_str:N #2 + \cs_end: + #2 #3 + } + \q_stop + } +\exp_last_unbraced:NNNNo + \cs_new:Npn \__fp_change_func_type_aux:w #1 { \tl_to_str:n { __fp } } { } +\cs_new:Npn \__fp_change_func_type_chk:NNN #1#2#3 + { + \if_meaning:w \scan_stop: #1 + \exp_after:wN #3 \exp_after:wN #2 + \else: + \exp_after:wN #1 + \fi: + } +\cs_new:Npn \__fp_exp_after_any_f:Nnw #1 + { \cs:w __fp_exp_after \__fp_type_from_scan_other:N #1 _f:nw \cs_end: } +\cs_new:Npn \__fp_exp_after_any_f:nw #1#2 + { + \__fp_if_type_fp:NTwFw + #2 \__fp_exp_after_f:nw + \s__fp { \__fp_exp_after_any_f:Nnw #2 } + \q_stop + {#1} #2 } \cs_new_eq:NN \__fp_exp_after_stop_f:nw \use_none:nn +\cs_new:Npn \__fp_exp_after_tuple_f:nw #1 \s__fp_tuple \__fp_tuple_chk:w #2 ; + { + \exp_after:wN \s__fp_tuple + \exp_after:wN \__fp_tuple_chk:w + \exp_after:wN { + \exp:w \exp_end_continue_f:w + \__fp_exp_after_array_f:w #2 \s__fp_stop + \exp_after:wN } + \exp_after:wN ; + \exp:w \exp_end_continue_f:w #1 + } +\cs_new:Npn \__fp_exp_after_array_f:w + { \__fp_exp_after_any_f:nw { \__fp_exp_after_array_f:w } } \int_const:Nn \c__fp_leading_shift_int { - 5 0000 } \int_const:Nn \c__fp_middle_shift_int { 5 0000 * 9999 } \int_const:Nn \c__fp_trailing_shift_int { 5 0000 * 10000 } @@ -11462,15 +11632,6 @@ \exp_after:wN \use_ii:nn \fi: } -\cs_new:Npn \__fp_array_count:n #1 - { - \__int_value:w \__int_eval:w 0 - \__fp_array_count_loop:Nw #1 { ? \__prg_break: } ; - \__prg_break_point: - \__int_eval_end: - } -\cs_new:Npn \__fp_array_count_loop:Nw #1#2; - { \use_none:n #1 + 1 \__fp_array_count_loop:Nw } \cs_new:Npn \__fp_expand:n #1 { \__fp_expand_loop:nwnN { } @@ -11484,12 +11645,17 @@ #2 \s__fp_mark { #3 #1 } #4 } -\__msg_kernel_new:nnnn { kernel } { misused-fp } +\cs_new:Npn \__fp_func_to_name:N #1 + { \exp_last_unbraced:Nf \__fp_func_to_name_aux:w { \cs_to_str:N #1 } X } +\cs_set_protected:Npn \__fp_tmp:w #1 #2 + { \cs_new:Npn \__fp_func_to_name_aux:w ##1 #1 ##2 #2 ##3 X {##2} } +\exp_args:Nff \__fp_tmp:w { \tl_to_str:n { __fp_ } } { \tl_to_str:n { _o: } } +\__kernel_msg_new:nnnn { kernel } { misused-fp } { A~floating~point~with~value~'#1'~was~misused. } { To~obtain~the~value~of~a~floating~point~variable,~use~ '\token_to_str:N \fp_to_decimal:N',~ - '\token_to_str:N \fp_to_scientific:N',~or~other~ + '\token_to_str:N \fp_to_tl:N',~or~other~ conversion~functions. } %% File: l3fp-traps.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project @@ -11505,11 +11671,11 @@ { invalid_operation , division_by_zero , overflow , underflow } {#1} { - \__msg_kernel_error:nnxx { kernel } + \__kernel_msg_error:nnxx { kernel } { unknown-fpu-trap-type } {#1} {#2} } { - \__msg_kernel_error:nnx + \__kernel_msg_error:nnx { kernel } { unknown-fpu-exception } {#1} } } @@ -11620,9 +11786,9 @@ { \__fp_invalid_operation:nnw { \exp_after:wN \c_nan_fp } } \cs_generate_variant:Nn \__fp_invalid_operation_o:nw { f } \cs_new:Npn \__fp_error:nnnn - { \__msg_kernel_expandable_error:nnnnn { kernel } } + { \__kernel_msg_expandable_error:nnnnn { kernel } } \cs_generate_variant:Nn \__fp_error:nnnn { nnf, nff } -\__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception } +\__kernel_msg_new:nnnn { kernel } { unknown-fpu-exception } { The~FPU~exception~'#1'~is~not~known:~ that~trap~will~never~be~triggered. @@ -11637,7 +11803,7 @@ * ~ underflow } } -\__msg_kernel_new:nnnn { kernel } { unknown-fpu-trap-type } +\__kernel_msg_new:nnnn { kernel } { unknown-fpu-trap-type } { The~FPU~trap~type~'#2'~is~not~known. } { The~trap~type~must~be~one~of \\ @@ -11648,19 +11814,21 @@ * ~ none } } -\__msg_kernel_new:nnn { kernel } { fp-flow } +\__kernel_msg_new:nnn { kernel } { fp-flow } { An ~ #3 ~ occurred. } -\__msg_kernel_new:nnn { kernel } { fp-flow-to } +\__kernel_msg_new:nnn { kernel } { fp-flow-to } { #1 ~ #3 ed ~ to ~ #2 . } -\__msg_kernel_new:nnn { kernel } { fp-zero-div } +\__kernel_msg_new:nnn { kernel } { fp-zero-div } { Division~by~zero~in~ #1 (#2) } -\__msg_kernel_new:nnn { kernel } { fp-zero-div-ii } +\__kernel_msg_new:nnn { kernel } { fp-zero-div-ii } { Division~by~zero~in~ (#1) #3 (#2) } -\__msg_kernel_new:nnn { kernel } { fp-invalid } +\__kernel_msg_new:nnn { kernel } { fp-invalid } { Invalid~operation~ #1 (#2) } -\__msg_kernel_new:nnn { kernel } { fp-invalid-ii } +\__kernel_msg_new:nnn { kernel } { fp-invalid-ii } { Invalid~operation~ (#1) #3 (#2) } -%% File: l3fp-round.dtx Copyright(C) 2011-2017 The LaTeX3 Project +\__kernel_msg_new:nnn { kernel } { fp-unknown-type } + { Unknown~type~for~'#1' } +%% File: l3fp-round.dtx Copyright(C) 2011-2018 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_trunc:N { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_zero:NNN } \cs_new:Npn \__fp_parse_word_floor:N @@ -11684,14 +11852,13 @@ \__fp_round_o:Nw \__fp_round_to_nearest:NNN #1 #2 } -\__debug:TF +\__kernel_debug:TF { - \tl_gput_right:Nn \g__debug_deprecation_on_tl + \__kernel_deprecation_code:nn { \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw } - \tl_gput_right:Nn \g__debug_deprecation_off_tl { \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_no_error:Nw @@ -11830,7 +11997,13 @@ } \cs_new_eq:NN \__fp_round_to_nearest_pinf_neg:NNN \__fp_round_to_nearest_ninf:NNN \cs_new_eq:NN \__fp_round_neg:NNN \__fp_round_to_nearest_neg:NNN -\cs_new:Npn \__fp_round_o:Nw #1#2 @ +\cs_new:Npn \__fp_round_o:Nw #1 + { + \__fp_parse_function_all_fp_o:fnw + { \__fp_round_name_from_cs:N #1 } + { \__fp_round_aux_o:Nw #1 } + } +\cs_new:Npn \__fp_round_aux_o:Nw #1#2 @ { \if_case:w \__int_eval:w \__fp_array_count:n {#2} \__int_eval_end: @@ -11969,9 +12142,8 @@ \exp_after:wN \__fp_exp_after_o:w \exp:w \exp_end_continue_f:w \__fp_sanitize:Nw #1#2; {1000}{0000}{0000}{0000}; } -%% File: l3fp-parse.dtx Copyright (C) 2011-2017 The LaTeX3 Project -\int_const:Nn \c__fp_prec_funcii_int { 16 } -\int_const:Nn \c__fp_prec_func_int { 15 } +%% File: l3fp-parse.dtx Copyright (C) 2011-2018 The LaTeX3 Project +\int_const:Nn \c__fp_prec_func_int { 16 } \int_const:Nn \c__fp_prec_hatii_int { 14 } \int_const:Nn \c__fp_prec_hat_int { 13 } \int_const:Nn \c__fp_prec_not_int { 12 } @@ -11983,23 +12155,11 @@ \int_const:Nn \c__fp_prec_quest_int { 4 } \int_const:Nn \c__fp_prec_colon_int { 3 } \int_const:Nn \c__fp_prec_comma_int { 2 } -\int_const:Nn \c__fp_prec_paren_int { 1 } +\int_const:Nn \c__fp_prec_tuple_int { 1 } \int_const:Nn \c__fp_prec_end_int { 0 } \cs_new:Npn \__fp_parse_expand:w #1 { \exp_end_continue_f:w #1 } \cs_new:Npn \__fp_parse_return_semicolon:w #1 \fi: \__fp_parse_expand:w { \fi: ; #1 } -\cs_new:Npx \__fp_type_from_scan:N #1 - { - \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w - \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark - \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop - } -\use:x - { - \cs_new:Npn \exp_not:N \__fp_type_from_scan:w - ##1 \tl_to_str:n { s__fp } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop - {##2} - } \cs_set_protected:Npn \__fp_tmp:w #1 #2 #3 { \cs_new:cpn { __fp_parse_digits_ #1 :N } ##1 @@ -12044,23 +12204,35 @@ \fi: #1 #2 } -\cs_new:Npn \__fp_parse_one_fp:NN #1#2 +\cs_new:Npn \__fp_parse_one_fp:NN #1 { - \cs:w __fp_exp_after \__fp_type_from_scan:N #2 _f:nw \cs_end: + \__fp_exp_after_any_f:nw { \exp_after:wN \__fp_parse_infix:NN \exp_after:wN #1 \exp:w \__fp_parse_expand:w } - #2 } \cs_new:Npn \__fp_exp_after_mark_f:nw #1 { - \__msg_kernel_expandable_error:nn { kernel } { fp-early-end } - \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1 + \int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 } + { + \c__fp_prec_comma_int { } + \c__fp_prec_tuple_int { } + \c__fp_prec_end_int + { + \exp_after:wN \c__fp_empty_tuple_fp + \exp:w \exp_end_continue_f:w + } + } + { + \__kernel_msg_expandable_error:nn { kernel } { fp-early-end } + \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w + } + #1 } \cs_new:cpn { __fp_exp_after_?_f:nw } #1#2 { - \__msg_kernel_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 } \cs_set_protected:Npn \__fp_tmp:w #1 @@ -12073,9 +12245,9 @@ \str_if_eq:nnTF {##2} { \protect } { \cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n } - { \__msg_kernel_expandable_error:nnn { kernel } { fp-robust-cmd } } + { \__kernel_msg_expandable_error:nnn { kernel } { fp-robust-cmd } } } - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {##2} } + { \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {##2} } } } } @@ -12174,7 +12346,7 @@ { \cs_if_exist_use:cF { __fp_parse_caseless_ \str_fold_case:n {#2} :N } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { unknown-fp-word } {#2} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN @@ -12213,13 +12385,13 @@ { \cs_if_exist:cTF { __fp_parse_infix_ \token_to_str:N #1 :N } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-missing-number } {#1} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN #3 #1 } { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-unknown-symbol } {#1} \__fp_parse_one:Nw #3 } @@ -12556,12 +12728,12 @@ \__str_if_eq_x:nn { \s__fp } { \exp_not:N #1 } = 0 \exp_stop_f: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-after-e } { floating~point~ } \prg_return_true: \else: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#1} \prg_return_false: \fi: @@ -12572,24 +12744,52 @@ \__int_value:w #1 \else: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-after-e } { dimension~#1 } \fi: \prg_return_false: \fi: \else: 0 - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { fp-missing } { exponent } \prg_return_true: \fi: } \cs_new_eq:cN { __fp_parse_prefix_+:Nw } \__fp_parse_one:Nw +\cs_new:Npn \__fp_parse_apply_function:NNNwN #1#2#3#4@#5 + { + #3 #2 #4 @ + \exp:w \exp_end_continue_f:w #5 #1 + } \cs_new:Npn \__fp_parse_apply_unary:NNNwN #1#2#3#4@#5 { + \__fp_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop + \__fp_parse_apply_unary_type:NNN #3 #2 #4 @ \exp:w \exp_end_continue_f:w #5 #1 } +\cs_new:Npn \__fp_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop + { + \if_meaning:w @ #3 \else: + \token_if_eq_meaning:NNTF . #3 + { \__fp_parse_apply_unary_chk:nNNNNw { no } } + { \__fp_parse_apply_unary_chk:nNNNNw { multi } } + \fi: + } +\cs_new:Npn \__fp_parse_apply_unary_chk:nNNNNw #1#2#3#4#5#6 @ + { + #2 + \__fp_error:nffn { fp-#1-arg } { \__fp_func_to_name:N #4 } { } { } + \exp_after:wN #4 \exp_after:wN #5 \c_nan_fp @ + } +\cs_new:Npn \__fp_parse_apply_unary_type:NNN #1#2#3 + { + \__fp_change_func_type:NNN #3 #1 \__fp_parse_apply_unary_error:NNw + #2 #3 + } +\cs_new:Npn \__fp_parse_apply_unary_error:NNw #1#2#3 @ + { \__fp_invalid_operation_o:fw { \__fp_func_to_name:N #1 } #3 } \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4 { \cs_new:cpn { __fp_parse_prefix_ #1 :Nw } ##1 @@ -12622,10 +12822,10 @@ \exp_after:wN \__fp_parse_lparen_after:NwN \exp_after:wN #1 \exp:w - \if_int_compare:w #1 = \c__fp_prec_funcii_int + \if_int_compare:w #1 = \c__fp_prec_func_int \__fp_parse_operand:Nw \c__fp_prec_comma_int \else: - \__fp_parse_operand:Nw \c__fp_prec_paren_int + \__fp_parse_operand:Nw \c__fp_prec_tuple_int \fi: \__fp_parse_expand:w } @@ -12642,8 +12842,9 @@ \exp_not:N \__fp_parse_expand:w } { - \exp_not:N \__msg_kernel_expandable_error:nnn + \exp_not:N \__kernel_msg_expandable_error:nnn { kernel } { fp-missing } { ) } + \exp_not:N \tl_if_empty:nT {#2} \exp_not:N \c__fp_empty_tuple_fp #2 @ \exp_not:N \use_none:n #3 } @@ -12652,9 +12853,14 @@ { \if_int_compare:w #1 = \c__fp_prec_comma_int \else: - \__msg_kernel_expandable_error:nnn - { kernel } { fp-missing-number } { ) } - \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w + \if_int_compare:w #1 = \c__fp_prec_tuple_int + \exp_after:wN \c__fp_empty_tuple_fp \exp:w + \else: + \__kernel_msg_expandable_error:nnn + { kernel } { fp-missing-number } { ) } + \exp_after:wN \c_nan_fp \exp:w + \fi: + \exp_end_continue_f:w \fi: \__fp_parse_infix:NN #1 ) } @@ -12712,12 +12918,12 @@ } \cs_new:Npn \__fp_parse_function:NNN #1#2#3 { - \exp_after:wN \__fp_parse_apply_unary:NNNwN + \exp_after:wN \__fp_parse_apply_function:NNNwN \exp_after:wN #3 \exp_after:wN #2 \exp_after:wN #1 \exp:w - \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w + \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w } \cs_new:Npn \__fp_parse:n #1 { @@ -12749,52 +12955,100 @@ \exp:w } \cs_new:Npn \__fp_parse_continue:NwN #1 #2 @ #3 { #3 #1 #2 @ } -\cs_new:Npn \__fp_parse_apply_binary:NwNwN #1 #2@ #3 #4@ #5 +\cs_new:Npn \__fp_parse_apply_binary:NwNwN #1 #2#3@ #4 #5#6@ #7 { \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 - \exp:w \exp_end_continue_f:w \cs:w __fp_#3_o:ww \cs_end: #2 #4 - \exp:w \exp_end_continue_f:w #5 #1 + \exp:w \exp_end_continue_f:w + \exp_after:wN \__fp_parse_apply_binary_chk:NN + \cs:w + __fp + \__fp_type_from_scan:N #2 + _#4 + \__fp_type_from_scan:N #5 + _o:ww + \cs_end: + #4 + #2#3 #5#6 + \exp:w \exp_end_continue_f:w #7 #1 + } +\cs_new:Npn \__fp_parse_apply_binary_chk:NN #1#2 + { + \if_meaning:w \scan_stop: #1 + \__fp_parse_apply_binary_error:NNN #2 + \fi: + #1 + } +\cs_new:Npn \__fp_parse_apply_binary_error:NNN #1#2#3 + { + #2 + \__fp_invalid_operation_o:Nww #1 + } +\cs_new:Npn \__fp_binary_type_o:Nww #1 #2#3 ; #4 + { + \exp_after:wN \__fp_parse_apply_binary_chk:NN + \cs:w + __fp + \__fp_type_from_scan:N #2 + _ #1 + \__fp_type_from_scan:N #4 + _o:ww + \cs_end: + #1 + #2 #3 ; #4 + } +\cs_new:Npn \__fp_binary_rev_type_o:Nww #1 #2#3 ; #4#5 ; + { + \exp_after:wN \__fp_parse_apply_binary_chk:NN + \cs:w + __fp + \__fp_type_from_scan:N #4 + _ #1 + \__fp_type_from_scan:N #2 + _o:ww + \cs_end: + #1 + #4 #5 ; #2 #3 ; } \cs_new:Npn \__fp_parse_infix_after_operand:NwN #1 #2; { \__fp_exp_after_f:nw { \__fp_parse_infix:NN #1 } #2; } - \cs_new:Npn \__fp_parse_infix:NN #1 #2 - { - \if_catcode:w \scan_stop: \exp_not:N #2 - \if_int_compare:w - \__str_if_eq_x:nn { \s__fp_mark } { \exp_not:N #2 } - = 0 \exp_stop_f: - \exp_after:wN \exp_after:wN - \exp_after:wN \__fp_parse_infix_mark:NNN - \else: - \exp_after:wN \exp_after:wN - \exp_after:wN \__fp_parse_infix_juxtapose:N - \fi: +\cs_new:Npn \__fp_parse_infix:NN #1 #2 + { + \if_catcode:w \scan_stop: \exp_not:N #2 + \if_int_compare:w + \__str_if_eq_x:nn { \s__fp_mark } { \exp_not:N #2 } + = 0 \exp_stop_f: + \exp_after:wN \exp_after:wN + \exp_after:wN \__fp_parse_infix_mark:NNN \else: - \if_int_compare:w - \__int_eval:w - ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26 - = 3 \exp_stop_f: - \exp_after:wN \exp_after:wN - \exp_after:wN \__fp_parse_infix_juxtapose:N - \else: - \exp_after:wN \__fp_parse_infix_check:NNN - \cs:w - __fp_parse_infix_ \token_to_str:N #2 :N - \exp_after:wN \exp_after:wN \exp_after:wN - \cs_end: - \fi: + \exp_after:wN \exp_after:wN + \exp_after:wN \__fp_parse_infix_mul:N \fi: - #1 - #2 - } + \else: + \if_int_compare:w + \__int_eval:w + ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26 + = 3 \exp_stop_f: + \exp_after:wN \exp_after:wN + \exp_after:wN \__fp_parse_infix_mul:N + \else: + \exp_after:wN \__fp_parse_infix_check:NNN + \cs:w + __fp_parse_infix_ \token_to_str:N #2 :N + \exp_after:wN \exp_after:wN \exp_after:wN + \cs_end: + \fi: + \fi: + #1 + #2 + } \cs_new:Npx \__fp_parse_infix_check:NNN #1#2#3 { \exp_not:N \if_meaning:w \scan_stop: #1 - \exp_not:N \__msg_kernel_expandable_error:nnn + \exp_not:N \__kernel_msg_expandable_error:nnn { kernel } { fp-missing } { * } \exp_not:N \exp_after:wN \exp_not:c { __fp_parse_infix_*:N } @@ -12815,15 +13069,15 @@ { \cs_new:Npn #1 ##1 { - \if_int_compare:w ##1 < \c__fp_prec_paren_int - \__msg_kernel_expandable_error:nnn { kernel } { fp-extra } { ) } - \exp_after:wN \__fp_parse_infix:NN - \exp_after:wN ##1 - \exp:w \exp_after:wN \__fp_parse_expand:w - \else: + \if_int_compare:w ##1 > \c__fp_prec_end_int \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN #1 + \else: + \__kernel_msg_expandable_error:nnn { kernel } { fp-extra } { ) } + \exp_after:wN \__fp_parse_infix:NN + \exp_after:wN ##1 + \exp:w \exp_after:wN \__fp_parse_expand:w \fi: } } @@ -12838,10 +13092,15 @@ \exp_after:wN #1 \else: \if_int_compare:w ##1 < \c__fp_prec_comma_int - \__fp_parse_infix_comma_error:w + \exp_after:wN @ + \exp_after:wN \__fp_parse_apply_comma:NwNwN + \exp_after:wN , + \exp:w + \else: + \exp_after:wN \__fp_parse_infix_comma:w + \exp:w \fi: - \exp_after:wN \__fp_parse_infix_comma:w - \exp:w \__fp_parse_operand:Nw \c__fp_prec_comma_int + \__fp_parse_operand:Nw \c__fp_prec_comma_int \exp_after:wN \__fp_parse_expand:w \fi: } @@ -12849,28 +13108,15 @@ \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_,:N } \cs_new:Npn \__fp_parse_infix_comma:w #1 @ { #1 @ \use_none:n } -\cs_new:Npn \__fp_parse_infix_comma_error:w #1 \exp:w - { - \fi: - \__msg_kernel_expandable_error:nn { kernel } { fp-extra-comma } - \exp_after:wN @ - \exp_after:wN \__fp_parse_apply_binary:NwNwN - \exp_after:wN , - \exp:w - } -\cs_set_protected:Npn \__fp_tmp:w #1 +\cs_new:Npn \__fp_parse_apply_comma:NwNwN #1 #2@ #3 #4@ #5 { - \cs_new:Npn #1 ##1 - { - \if_meaning:w \s__fp ##1 - \exp_after:wN \__fp_use_i_until_s:nw - \exp_after:wN #1 - \fi: - \exp_after:wN \c_nan_fp - ##1 - } + \exp_after:wN \__fp_parse_continue:NwN + \exp_after:wN #1 + \exp:w \exp_end_continue_f:w + \__fp_exp_after_tuple_f:nw { } + \s__fp_tuple \__fp_tuple_chk:w { #2 #4 } ; + #5 #1 } -\exp_args:Nc \__fp_tmp:w { __fp_,_o:ww } \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4 { \cs_new:Npn #1 ##1 @@ -12904,32 +13150,7 @@ \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_or:N } | \c__fp_prec_or_int \c__fp_prec_or_int \cs_new:cpn { __fp_parse_infix_(:N } #1 - { \__fp_parse_infix_juxtapose:N #1 ( } -\cs_new:Npn \__fp_parse_infix_juxtapose:N #1 - { - \if_int_compare:w #1 < \c__fp_prec_times_int - \exp_after:wN @ - \exp_after:wN \__fp_parse_apply_juxtapose:NwwN - \exp:w - \__fp_parse_operand:Nw \c__fp_prec_times_int - \exp_after:wN \__fp_parse_expand:w - \else: - \exp_after:wN @ - \exp_after:wN \use_none:n - \exp_after:wN \__fp_parse_infix_juxtapose:N - \fi: - } -\cs_new:Npn \__fp_parse_apply_juxtapose:NwwN #1 #2;#3@ #4;#5@ - { - \if_catcode:w ^ \tl_to_str:n { #3 #5 } ^ - \else: - \__fp_error:nffn { fp-invalid-ii } - { \__fp_array_to_clist:n { #2; #3 } } - { \__fp_array_to_clist:n { #4; #5 } } - { } - \fi: - \__fp_parse_apply_binary:NwNwN #1 #2;@ * #4;@ - } + { \__fp_parse_infix_mul:N #1 ( } \cs_set_protected:Npn \__fp_tmp:w #1 { \cs_new:cpn { __fp_parse_infix_*:N } ##1##2 @@ -12985,7 +13206,7 @@ \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_::N } \__fp_ternary_auxii:NwwN \c__fp_prec_colon_int { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { fp-missing } { ? } { ~for~?: } } \cs_new:cpn { __fp_parse_infix_<:N } #1 @@ -13006,7 +13227,7 @@ } \cs_new:Npn \__fp_parse_excl_error: { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { fp-missing } { = } { ~after~!. } } \cs_new:Npn \__fp_parse_compare:NNNNNNN #1 @@ -13095,12 +13316,99 @@ } \cs_new:Npn \__fp_parse_continue_compare:NNwNN #1#2 #3@ #4#5 { #4 #2 #3@ #1 } +\cs_new:Npn \__fp_parse_function_all_fp_o:fnw #1#2#3 @ + { + \__fp_array_if_all_fp:nTF {#3} + { #2 #3 @ } + { + \__fp_error:nffn { fp-bad-args } + {#1} + { \fp_to_tl:n { \s__fp_tuple \__fp_tuple_chk:w {#3} ; } } + { } + \exp_after:wN \c_nan_fp + } + } +\cs_new:Npn \__fp_parse_function_one_two:nnw #1#2#3 + { + \__fp_if_type_fp:NTwFw + #3 { } \s__fp \__fp_parse_function_one_two_error_o:w \q_stop + \__fp_parse_function_one_two_aux:nnw {#1} {#2} #3 + } +\cs_new:Npn \__fp_parse_function_one_two_error_o:w #1#2#3#4 @ + { + \__fp_error:nffn { fp-bad-args } + {#2} + { \fp_to_tl:n { \s__fp_tuple \__fp_tuple_chk:w {#4} ; } } + { } + \exp_after:wN \c_nan_fp + } +\cs_new:Npn \__fp_parse_function_one_two_aux:nnw #1#2 #3; #4 + { + \__fp_if_type_fp:NTwFw + #4 { } + \s__fp + { + \if_meaning:w @ #4 + \exp_after:wN \use_iv:nnnn + \fi: + \__fp_parse_function_one_two_error_o:w + } + \q_stop + \__fp_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4 + } +\cs_new:Npn \__fp_parse_function_one_two_auxii:nnw #1#2#3; #4; #5 + { + \if_meaning:w @ #5 \else: + \exp_after:wN \__fp_parse_function_one_two_error_o:w + \fi: + \use_ii:nn {#1} { \use_none:n #2 } #3; #4; #5 + } +\cs_new:Npn \__fp_tuple_map_o:nw #1 \s__fp_tuple \__fp_tuple_chk:w #2 ; + { + \exp_after:wN \s__fp_tuple + \exp_after:wN \__fp_tuple_chk:w + \exp_after:wN { + \exp:w \exp_end_continue_f:w + \__fp_tuple_map_loop_o:nw {#1} #2 + { \s__fp \__prg_break: } ; + \__prg_break_point: + \exp_after:wN } \exp_after:wN ; + } +\cs_new:Npn \__fp_tuple_map_loop_o:nw #1#2#3 ; + { + \use_none:n #2 + #1 #2 #3 ; + \exp:w \exp_end_continue_f:w + \__fp_tuple_map_loop_o:nw {#1} + } +\cs_new:Npn \__fp_tuple_mapthread_o:nww #1 + \s__fp_tuple \__fp_tuple_chk:w #2 ; + \s__fp_tuple \__fp_tuple_chk:w #3 ; + { + \exp_after:wN \s__fp_tuple + \exp_after:wN \__fp_tuple_chk:w + \exp_after:wN { + \exp:w \exp_end_continue_f:w + \__fp_tuple_mapthread_loop_o:nw {#1} + #2 { \s__fp \__prg_break: } ; @ + #3 { \s__fp \__prg_break: } ; + \__prg_break_point: + \exp_after:wN } \exp_after:wN ; + } +\cs_new:Npn \__fp_tuple_mapthread_loop_o:nw #1#2#3 ; #4 @ #5#6 ; + { + \use_none:n #2 + \use_none:n #5 + #1 #2 #3 ; #5 #6 ; + \exp:w \exp_end_continue_f:w + \__fp_tuple_mapthread_loop_o:nw {#1} #4 @ + } \cs_new:Npn \fp_function:Nw #1 { \exp_after:wN \__fp_function_apply:nw \exp_after:wN #1 \exp:w - \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w + \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w } \cs_new_protected:Npn \fp_new_function:Npn #1#2# { @@ -13120,7 +13428,7 @@ \__int_value:w #3 \exp_after:wN ; \exp_after:wN } \exp:w - \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w + \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w } \cs_new:Npn #2 #4 {#5} } @@ -13130,7 +13438,7 @@ \int_compare:nNnTF { \tl_count:n {#3} } = {#2} { #1 #3 } { - \__msg_kernel_expandable_error:nnnnn + \__kernel_msg_expandable_error:nnnnn { kernel } { fp-num-args } { #1() } {#2} {#2} \c_nan_fp } @@ -13152,32 +13460,96 @@ \cs_new:Npn \__fp_function_store_end:wnnn #1 \s__fp_stop #2#3#4 { #4 {#2} } -\__msg_kernel_new:nnn { kernel } { fp-deprecated } +\__kernel_msg_new:nnn { kernel } { fp-deprecated } { '#1'~deprecated;~use~'#2' } -\__msg_kernel_new:nnn { kernel } { unknown-fp-word } +\__kernel_msg_new:nnn { kernel } { unknown-fp-word } { Unknown~fp~word~#1. } -\__msg_kernel_new:nnn { kernel } { fp-missing } +\__kernel_msg_new:nnn { kernel } { fp-missing } { Missing~#1~inserted #2. } -\__msg_kernel_new:nnn { kernel } { fp-extra } +\__kernel_msg_new:nnn { kernel } { fp-extra } { Extra~#1~ignored. } -\__msg_kernel_new:nnn { kernel } { fp-early-end } +\__kernel_msg_new:nnn { kernel } { fp-early-end } { Premature~end~in~fp~expression. } -\__msg_kernel_new:nnn { kernel } { fp-after-e } +\__kernel_msg_new:nnn { kernel } { fp-after-e } { Cannot~use~#1 after~'e'. } -\__msg_kernel_new:nnn { kernel } { fp-missing-number } +\__kernel_msg_new:nnn { kernel } { fp-missing-number } { Missing~number~before~'#1'. } -\__msg_kernel_new:nnn { kernel } { fp-unknown-symbol } +\__kernel_msg_new:nnn { kernel } { fp-unknown-symbol } { Unknown~symbol~#1~ignored. } -\__msg_kernel_new:nnn { kernel } { fp-extra-comma } - { Unexpected~comma:~extra~arguments~ignored. } -\__msg_kernel_new:nnn { kernel } { fp-num-args } +\__kernel_msg_new:nnn { kernel } { fp-extra-comma } + { Unexpected~comma~turned~to~nan~result. } +\__kernel_msg_new:nnn { kernel } { fp-no-arg } + { #1~got~no~argument;~used~nan. } +\__kernel_msg_new:nnn { kernel } { fp-multi-arg } + { #1~got~more~than~one~argument;~used~nan. } +\__kernel_msg_new:nnn { kernel } { fp-num-args } { #1~expects~between~#2~and~#3~arguments. } +\__kernel_msg_new:nnn { kernel } { fp-bad-args } + { Arguments~in~#1#2~are~invalid. } \cs_if_exist:cT { @unexpandable@protect } { - \__msg_kernel_new:nnn { kernel } { fp-robust-cmd } + \__kernel_msg_new:nnn { kernel } { fp-robust-cmd } { Robust~command~#1 invalid~in~fp~expression! } } -%% File: l3fp-logic.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3fp-assign.dtx Copyright (C) 2011-2017 The LaTeX3 project +\cs_new_protected:Npn \fp_new:N #1 + { \cs_new_eq:NN #1 \c_zero_fp } +\cs_generate_variant:Nn \fp_new:N {c} +\cs_new_protected:Npn \fp_set:Nn #1#2 + { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } +\cs_new_protected:Npn \fp_gset:Nn #1#2 + { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } +\cs_new_protected:Npn \fp_const:Nn #1#2 + { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } +\cs_generate_variant:Nn \fp_set:Nn {c} +\cs_generate_variant:Nn \fp_gset:Nn {c} +\cs_generate_variant:Nn \fp_const:Nn {c} +\cs_new_eq:NN \fp_set_eq:NN \tl_set_eq:NN +\cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN +\cs_generate_variant:Nn \fp_set_eq:NN { c , Nc , cc } +\cs_generate_variant:Nn \fp_gset_eq:NN { c , Nc , cc } +\cs_new_protected:Npn \fp_zero:N #1 { \fp_set_eq:NN #1 \c_zero_fp } +\cs_new_protected:Npn \fp_gzero:N #1 { \fp_gset_eq:NN #1 \c_zero_fp } +\cs_generate_variant:Nn \fp_zero:N { c } +\cs_generate_variant:Nn \fp_gzero:N { c } +\cs_new_protected:Npn \fp_zero_new:N #1 + { \fp_if_exist:NTF #1 { \fp_zero:N #1 } { \fp_new:N #1 } } +\cs_new_protected:Npn \fp_gzero_new:N #1 + { \fp_if_exist:NTF #1 { \fp_gzero:N #1 } { \fp_new:N #1 } } +\cs_generate_variant:Nn \fp_zero_new:N { c } +\cs_generate_variant:Nn \fp_gzero_new:N { c } +\cs_new_protected:Npn \fp_add:Nn { \__fp_add:NNNn \fp_set:Nn + } +\cs_new_protected:Npn \fp_gadd:Nn { \__fp_add:NNNn \fp_gset:Nn + } +\cs_new_protected:Npn \fp_sub:Nn { \__fp_add:NNNn \fp_set:Nn - } +\cs_new_protected:Npn \fp_gsub:Nn { \__fp_add:NNNn \fp_gset:Nn - } +\cs_new_protected:Npn \__fp_add:NNNn #1#2#3#4 + { #1 #3 { #3 #2 \__fp_parse:n {#4} } } +\cs_generate_variant:Nn \fp_add:Nn { c } +\cs_generate_variant:Nn \fp_gadd:Nn { c } +\cs_generate_variant:Nn \fp_sub:Nn { c } +\cs_generate_variant:Nn \fp_gsub:Nn { c } +\cs_new_protected:Npn \fp_show:N { \__fp_show:NN \tl_show:n } +\cs_generate_variant:Nn \fp_show:N { c } +\cs_new_protected:Npn \fp_log:N { \__fp_show:NN \tl_log:n } +\cs_generate_variant:Nn \fp_log:N { c } +\cs_new_protected:Npn \__fp_show:NN #1#2 + { + \__kernel_check_defined:NT #2 + { \exp_args:Nx #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } } + } +\cs_new_protected:Npn \fp_show:n + { \msg_show_eval:Nn \fp_to_tl:n } +\cs_new_protected:Npn \fp_log:n + { \msg_log_eval:Nn \fp_to_tl:n } +\fp_const:Nn \c_e_fp { 2.718 2818 2845 9045 } +\fp_const:Nn \c_one_fp { 1 } +\fp_const:Nn \c_pi_fp { 3.141 5926 5358 9793 } +\fp_const:Nn \c_one_degree_fp { 0.0 1745 3292 5199 4330 } +\fp_new:N \l_tmpa_fp +\fp_new:N \l_tmpb_fp +\fp_new:N \g_tmpa_fp +\fp_new:N \g_tmpb_fp +%% File: l3fp-logic.dtx Copyright (C) 2011-2018 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_max:N { \__fp_parse_function:NNN \__fp_minmax_o:Nw 2 } \cs_new:Npn \__fp_parse_word_min:N @@ -13335,7 +13707,7 @@ } { \token_if_eq_meaning:NNTF #2 0 - { \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#6} } + { \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#6} } { \__fp_error:nnfn { fp-bad-step } { } { \fp_to_tl:n { \s__fp \__fp_chk:w #2#3#4 ; } } {#6} @@ -13386,11 +13758,17 @@ \fp_step_function:nnnN {#3} {#4} {#5} #2 \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int } } -\__msg_kernel_new:nnn { kernel } { fp-bad-step } +\__kernel_msg_new:nnn { kernel } { fp-bad-step } { Invalid~step~size~#2~in~step~function~#3. } -\__msg_kernel_new:nnn { kernel } { fp-tiny-step } +\__kernel_msg_new:nnn { kernel } { fp-tiny-step } { Tiny~step~size~(#1+#2=#1)~in~step~function~#3. } -\cs_new:Npn \__fp_minmax_o:Nw #1#2 @ +\cs_new:Npn \__fp_minmax_o:Nw #1 + { + \__fp_parse_function_all_fp_o:fnw + { \token_if_eq_meaning:NNTF 0 #1 { min } { max } } + { \__fp_minmax_aux_o:Nw #1 } + } +\cs_new:Npn \__fp_minmax_aux_o:Nw #1#2 @ { \if_meaning:w 0 #1 \exp_after:wN \__fp_minmax_loop:Nww \exp_after:wN + @@ -13467,7 +13845,7 @@ \__fp_parse_operand:Nw \c__fp_prec_colon_int \__fp_parse_expand:w \else: - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { fp-missing } { : } { ~for~?: } \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 @@ -13507,7 +13885,7 @@ \__fp_exp_after_array_f:w #3 \s__fp_stop #4 #1 } -%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project +%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016-2018 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_abs:N { \__fp_parse_unary_function:NNN \__fp_set_sign_o:w 0 } \cs_new:Npn \__fp_parse_word_sign:N @@ -14269,6 +14647,43 @@ \if_case:w #3 \exp_stop_f: #1 \or: 1 \or: 0 \fi: \exp_stop_f: #4; } +\cs_new:Npn \__fp_tuple_set_sign_o:w #1 + { + \if_meaning:w 2 #1 + \exp_after:wN \__fp_tuple_set_sign_aux_o:Nnw + \fi: + \__fp_invalid_operation_o:nw { abs } + } +\cs_new:Npn \__fp_tuple_set_sign_aux_o:Nnw #1#2#3 @ + { \__fp_tuple_map_o:nw \__fp_tuple_set_sign_aux_o:w #3 } +\cs_new:Npn \__fp_tuple_set_sign_aux_o:w #1#2 ; + { + \__fp_change_func_type:NNN #1 \__fp_set_sign_o:w + \__fp_parse_apply_unary_error:NNw + 2 #1 #2 ; @ + } +\cs_new:cpn { __fp_*_tuple_o:ww } #1 ; + { \__fp_tuple_map_o:nw { \__fp_binary_type_o:Nww * #1 ; } } +\cs_new:cpn { __fp_tuple_*_o:ww } #1 ; #2 ; + { \__fp_tuple_map_o:nw { \__fp_binary_rev_type_o:Nww * #2 ; } #1 ; } +\cs_new:cpn { __fp_tuple_/_o:ww } #1 ; #2 ; + { \__fp_tuple_map_o:nw { \__fp_binary_rev_type_o:Nww / #2 ; } #1 ; } +\cs_set_protected:Npn \__fp_tmp:w #1 + { + \cs_new:cpn { __fp_tuple_#1_tuple_o:ww } + \s__fp_tuple \__fp_tuple_chk:w ##1 ; + \s__fp_tuple \__fp_tuple_chk:w ##2 ; + { + \int_compare:nNnTF + { \__fp_array_count:n {##1} } = { \__fp_array_count:n {##2} } + { \__fp_tuple_mapthread_o:nww { \__fp_binary_type_o:Nww #1 } } + { \__fp_invalid_operation_o:nww #1 } + \s__fp_tuple \__fp_tuple_chk:w {##1} ; + \s__fp_tuple \__fp_tuple_chk:w {##2} ; + } + } +\__fp_tmp:w + +\__fp_tmp:w - %% File: l3fp-extended.dtx Copyright (C) 2011-2017 The LaTeX3 Project \tl_const:Nn \c__fp_one_fixed_tl { {10000} {0000} {0000} {0000} {0000} {0000} ; } @@ -15379,7 +15794,7 @@ 1 \fi: } -%% File: l3fp-trig.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3fp-trig.dtx Copyright (C) 2011-2018 The LaTeX3 Project \tl_map_inline:nn { {acos} {acsc} {asec} {asin} @@ -15912,32 +16327,21 @@ } #1 } -\cs_new:Npn \__fp_atan_o:Nw - { - \__fp_atan_dispatch_o:NNnNw - \__fp_acotii_o:Nww \__fp_atanii_o:Nww { atan } - } -\cs_new:Npn \__fp_acot_o:Nw +\cs_new:Npn \__fp_atan_o:Nw #1 { - \__fp_atan_dispatch_o:NNnNw - \__fp_atanii_o:Nww \__fp_acotii_o:Nww { acot } + \__fp_parse_function_one_two:nnw + { #1 { atan } { atand } } + { \__fp_atan_default:w \__fp_atanii_o:Nww #1 } } -\cs_new:Npn \__fp_atan_dispatch_o:NNnNw #1#2#3#4#5@ +\cs_new:Npn \__fp_acot_o:Nw #1 { - \if_case:w - \__int_eval:w \__fp_array_count:n {#5} - 1 \__int_eval_end: - \exp_after:wN #1 \exp_after:wN #4 \c_one_fp #5 - \exp:w - \or: #2 #4 #5 \exp:w - \else: - \__msg_kernel_expandable_error:nnnnn - { kernel } { fp-num-args } { #3() } { 1 } { 2 } - \exp_after:wN \c_nan_fp \exp:w - \fi: - \exp_after:wN \exp_end: + \__fp_parse_function_one_two:nnw + { #1 { acot } { acotd } } + { \__fp_atan_default:w \__fp_acotii_o:Nww #1 } } +\cs_new:Npx \__fp_atan_default:w #1#2#3 @ { #1 #2 #3 \c_one_fp @ } \cs_new:Npn \__fp_atanii_o:Nww - #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5 + #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5 #6 @ { \if_meaning:w 3 #2 \__fp_case_return_i_o:ww \fi: \if_meaning:w 3 #5 \__fp_case_return_ii_o:ww \fi: @@ -15954,7 +16358,7 @@ \fi: \__fp_atan_normal_o:NNnwNnw #1 \s__fp \__fp_chk:w #2#3#4; - \s__fp \__fp_chk:w #5 + \s__fp \__fp_chk:w #5 #6 } \cs_new:Npn \__fp_acotii_o:Nww #1#2; #3; { \__fp_atanii_o:Nww #1#3; #2; } @@ -16185,7 +16589,28 @@ { \__fp_asin_auxi_o:NnNww #1 {#3} #4 } } } -%% File: l3fp-convert.dtx Copyright(C) 2011-2017 The LaTeX3 Project +%% File: l3fp-convert.dtx Copyright(C) 2011-2018 The LaTeX3 Project +\cs_new:Npn \__fp_tuple_convert:Nw #1 \s__fp_tuple \__fp_tuple_chk:w #2 ; + { + \int_case:nnF { \__fp_array_count:n {#2} } + { + { 0 } { ( ) } + { 1 } { \__fp_tuple_convert_end:w @ { #1 #2 , } } + } + { + \__fp_tuple_convert_loop:nNw { } #1 + #2 { ? \__fp_tuple_convert_end:w } ; + @ { \use_none:nn } + } + } +\cs_new:Npn \__fp_tuple_convert_loop:nNw #1#2#3#4; #5 @ #6 + { + \use_none:n #3 + \exp_args:Nf \__fp_tuple_convert_loop:nNw { #2 #3#4 ; } #2 #5 + @ { #6 , ~ #1 } + } +\cs_new:Npn \__fp_tuple_convert_end:w #1 @ #2 + { \exp_after:wN ( \exp:w \exp_end_continue_f:w #2 ) } \cs_new:Npn \__fp_trim_zeros:w #1 ; { \__fp_trim_zeros_loop:w #1 @@ -16202,7 +16627,20 @@ \exp_after:wN \__fp_to_scientific_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } -\cs_new:Npn \__fp_to_scientific_dispatch:w \s__fp \__fp_chk:w #1#2 +\cs_new:Npn \__fp_to_scientific_dispatch:w #1 + { + \__fp_change_func_type:NNN + #1 \__fp_to_scientific:w \__fp_to_scientific_recover:w + #1 + } +\cs_new:Npn \__fp_to_scientific_recover:w #1 #2 ; + { + \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { } + nan + } +\cs_new:Npn \__fp_tuple_to_scientific:w + { \__fp_tuple_convert:Nw \__fp_to_scientific_dispatch:w } +\cs_new:Npn \__fp_to_scientific:w \s__fp \__fp_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: @@ -16243,7 +16681,20 @@ \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } -\cs_new:Npn \__fp_to_decimal_dispatch:w \s__fp \__fp_chk:w #1#2 +\cs_new:Npn \__fp_to_decimal_dispatch:w #1 + { + \__fp_change_func_type:NNN + #1 \__fp_to_decimal:w \__fp_to_decimal_recover:w + #1 + } +\cs_new:Npn \__fp_to_decimal_recover:w #1 #2 ; + { + \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { } + nan + } +\cs_new:Npn \__fp_tuple_to_decimal:w + { \__fp_tuple_convert:Nw \__fp_to_decimal_dispatch:w } +\cs_new:Npn \__fp_to_decimal:w \s__fp \__fp_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: @@ -16308,7 +16759,16 @@ \exp_after:wN \__fp_to_tl_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } -\cs_new:Npn \__fp_to_tl_dispatch:w \s__fp \__fp_chk:w #1#2 +\cs_new:Npn \__fp_to_tl_dispatch:w #1 + { \__fp_change_func_type:NNN #1 \__fp_to_tl:w \__fp_to_tl_recover:w #1 } +\cs_new:Npn \__fp_to_tl_recover:w #1 #2 ; + { + \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { } + nan + } +\cs_new:Npn \__fp_tuple_to_tl:w + { \__fp_tuple_convert:Nw \__fp_to_tl_dispatch:w } +\cs_new:Npn \__fp_to_tl:w \s__fp \__fp_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: @@ -16337,10 +16797,21 @@ \cs_new:Npn \__fp_to_tl_scientific:wNw #1 ; #2#3; { \__fp_trim_zeros:w #2.#3 ; #1 } \cs_new:Npn \fp_to_dim:N #1 - { \fp_to_decimal:N #1 pt } + { \exp_after:wN \__fp_to_dim_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_dim:N { c } -\cs_new:Npn \fp_to_dim:n #1 - { \fp_to_decimal:n {#1} pt } +\cs_new:Npn \fp_to_dim:n + { + \exp_after:wN \__fp_to_dim_dispatch:w + \exp:w \exp_end_continue_f:w \__fp_parse:n + } +\cs_new:Npn \__fp_to_dim_dispatch:w #1#2 ; + { + \__fp_change_func_type:NNN #1 \__fp_to_dim:w \__fp_to_dim_recover:w + #1 #2 ; + } +\cs_new:Npn \__fp_to_dim_recover:w #1 + { \__fp_invalid_operation:nnw { 0pt } { fp_to_dim } } +\cs_new:Npn \__fp_to_dim:w #1 ; { \__fp_to_decimal:w #1 ; pt } \cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \__fp_to_int_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_int:N { c } \cs_new:Npn \fp_to_int:n @@ -16348,12 +16819,19 @@ \exp_after:wN \__fp_to_int_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } -\cs_new:Npn \__fp_to_int_dispatch:w #1; +\cs_new:Npn \__fp_to_int_dispatch:w #1#2 ; { - \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w + \__fp_change_func_type:NNN #1 \__fp_to_int:w \__fp_to_int_recover:w + #1 #2 ; + } +\cs_new:Npn \__fp_to_int_recover:w #1 + { \__fp_invalid_operation:nnw { 0 } { fp_to_int } } +\cs_new:Npn \__fp_to_int:w #1; + { + \exp_after:wN \__fp_to_decimal:w \exp:w \exp_end_continue_f:w \__fp_round:Nwn \__fp_round_to_nearest:NNN #1; { 0 } } -\__debug_patch_args:nNNpn { { (#1) } } +\__kernel_patch_args:nNNpn { { (#1) } } \cs_new:Npn \dim_to_fp:n #1 { \exp_after:wN \__fp_from_dim_test:ww @@ -16423,18 +16901,18 @@ } \exp_not:N \__fp_array_to_clist_loop:Nw } -%% File: l3fp-random.dtx Copyright (C) 2016,2017 The LaTeX3 Project +%% File: l3fp-random.dtx Copyright (C) 2016-2018 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_rand:N { \__fp_parse_function:NNN \__fp_rand_o:Nw ? } \cs_new:Npn \__fp_parse_word_randint:N { \__fp_parse_function:NNN \__fp_randint_o:Nw ? } \cs_if_exist:NF \pdftex_uniformdeviate:D { - \__msg_kernel_new:nnn { kernel } { fp-no-random } + \__kernel_msg_new:nnn { kernel } { fp-no-random } { Random~numbers~unavailable } \cs_new:Npn \__fp_rand_o:Nw ? #1 @ { - \__msg_kernel_expandable_error:nn { kernel } { fp-no-random } + \__kernel_msg_expandable_error:nn { kernel } { fp-no-random } \exp_after:wN \c_nan_fp } \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw @@ -16495,26 +16973,20 @@ \tl_if_empty:nTF {#1} { \__fp_rand_o: } { - \__msg_kernel_expandable_error:nnnnn + \__kernel_msg_expandable_error:nnnnn { kernel } { fp-num-args } { rand() } { 0 } { 0 } \exp_after:wN \c_nan_fp } } \cs_new:Npn \__fp_rand_o: { \__fp_parse_o:n { . \__fp_rand_myriads:n { xxxx } } } -\cs_new:Npn \__fp_randint_o:Nw ? #1 @ +\cs_new:Npn \__fp_randint_o:Nw ? { - \if_case:w - \__int_eval:w \__fp_array_count:n {#1} - 1 \__int_eval_end: - \exp_after:wN \__fp_randint_e:w \c_one_fp #1 - \or: \__fp_randint_e:w #1 - \else: - \__msg_kernel_expandable_error:nnnnn - { kernel } { fp-num-args } { randint() } { 1 } { 2 } - \exp_after:wN \c_nan_fp \exp:w - \fi: - \exp_after:wN \exp_end: + \__fp_parse_function_one_two:nnw + { randint } + { \__fp_randint_default:w \__fp_randint_o:w } } +\cs_new:Npn \__fp_randint_default:w #1 { \exp_after:wN #1 \c_one_fp } \cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3; { \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3; @@ -16528,7 +17000,7 @@ } { 1 \exp_stop_f: } } -\cs_new:Npn \__fp_randint_e:w #1; #2; +\cs_new:Npn \__fp_randint_o:w #1; #2; @ { \if_case:w \__fp_randint_badarg:w #1; @@ -16541,6 +17013,7 @@ { randint } { \__fp_array_to_clist:n { #1; #2; } } \exp:w \fi: + \exp_after:wN \exp_end: } \cs_new:Npn \__fp_randint_e:wnn #1; { @@ -16585,65 +17058,7 @@ { \__fp_exp_after_o:w #1 ; \exp:w } } } -%% File: l3fp-assign.dtx Copyright (C) 2011-2017 The LaTeX3 project -\cs_new_protected:Npn \fp_new:N #1 - { \cs_new_eq:NN #1 \c_zero_fp } -\cs_generate_variant:Nn \fp_new:N {c} -\cs_new_protected:Npn \fp_set:Nn #1#2 - { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } -\cs_new_protected:Npn \fp_gset:Nn #1#2 - { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } -\cs_new_protected:Npn \fp_const:Nn #1#2 - { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } -\cs_generate_variant:Nn \fp_set:Nn {c} -\cs_generate_variant:Nn \fp_gset:Nn {c} -\cs_generate_variant:Nn \fp_const:Nn {c} -\cs_new_eq:NN \fp_set_eq:NN \tl_set_eq:NN -\cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN -\cs_generate_variant:Nn \fp_set_eq:NN { c , Nc , cc } -\cs_generate_variant:Nn \fp_gset_eq:NN { c , Nc , cc } -\cs_new_protected:Npn \fp_zero:N #1 { \fp_set_eq:NN #1 \c_zero_fp } -\cs_new_protected:Npn \fp_gzero:N #1 { \fp_gset_eq:NN #1 \c_zero_fp } -\cs_generate_variant:Nn \fp_zero:N { c } -\cs_generate_variant:Nn \fp_gzero:N { c } -\cs_new_protected:Npn \fp_zero_new:N #1 - { \fp_if_exist:NTF #1 { \fp_zero:N #1 } { \fp_new:N #1 } } -\cs_new_protected:Npn \fp_gzero_new:N #1 - { \fp_if_exist:NTF #1 { \fp_gzero:N #1 } { \fp_new:N #1 } } -\cs_generate_variant:Nn \fp_zero_new:N { c } -\cs_generate_variant:Nn \fp_gzero_new:N { c } -\cs_new_protected:Npn \fp_add:Nn { \__fp_add:NNNn \fp_set:Nn + } -\cs_new_protected:Npn \fp_gadd:Nn { \__fp_add:NNNn \fp_gset:Nn + } -\cs_new_protected:Npn \fp_sub:Nn { \__fp_add:NNNn \fp_set:Nn - } -\cs_new_protected:Npn \fp_gsub:Nn { \__fp_add:NNNn \fp_gset:Nn - } -\cs_new_protected:Npn \__fp_add:NNNn #1#2#3#4 - { #1 #3 { #3 #2 \__fp_parse:n {#4} } } -\cs_generate_variant:Nn \fp_add:Nn { c } -\cs_generate_variant:Nn \fp_gadd:Nn { c } -\cs_generate_variant:Nn \fp_sub:Nn { c } -\cs_generate_variant:Nn \fp_gsub:Nn { c } -\cs_new_protected:Npn \fp_show:N { \__fp_show:NN \tl_show:n } -\cs_generate_variant:Nn \fp_show:N { c } -\cs_new_protected:Npn \fp_log:N { \__fp_show:NN \tl_log:n } -\cs_generate_variant:Nn \fp_log:N { c } -\cs_new_protected:Npn \__fp_show:NN #1#2 - { - \__kernel_check_defined:NT #2 - { \exp_args:Nx #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } } - } -\cs_new_protected:Npn \fp_show:n - { \msg_show_eval:Nn \fp_to_tl:n } -\cs_new_protected:Npn \fp_log:n - { \msg_log_eval:Nn \fp_to_tl:n } -\fp_const:Nn \c_e_fp { 2.718 2818 2845 9045 } -\fp_const:Nn \c_one_fp { 1 } -\fp_const:Nn \c_pi_fp { 3.141 5926 5358 9793 } -\fp_const:Nn \c_one_degree_fp { 0.0 1745 3292 5199 4330 } -\fp_new:N \l_tmpa_fp -\fp_new:N \l_tmpb_fp -\fp_new:N \g_tmpa_fp -\fp_new:N \g_tmpb_fp -%% File l3sort.dtx (C) Copyright 2012-2017 The LaTeX3 Project +%% File l3sort.dtx (C) Copyright 2012-2018 The LaTeX3 Project \int_new:N \l__sort_length_int \int_new:N \l__sort_min_int \int_new:N \l__sort_top_int @@ -16864,14 +17279,14 @@ \cs_new_protected:Npn \__sort_return_mark:N #1 { } \cs_new_protected:Npn \__sort_return_none_error: { - \__msg_kernel_error:nnxx { kernel } { return-none } + \__kernel_msg_error:nnxx { kernel } { return-none } { \tex_the:D \tex_toks:D \l__sort_A_int } { \tex_the:D \tex_toks:D \l__sort_C_int } \__sort_return_same: } \cs_new_protected:Npn \__sort_return_two_error:w #1 \__sort_return_none_error: - { \__msg_kernel_error:nn { kernel } { return-two } } + { \__kernel_msg_error:nn { kernel } { return-two } } \cs_new_protected:Npn \__sort_return_same: { \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int @@ -16993,12 +17408,12 @@ { \cs_set_eq:NN \toksdef \__sort_disabled_toksdef:n } \cs_new_protected:Npn \__sort_disabled_toksdef:n #1 { - \__msg_kernel_error:nnx { kernel } { toksdef } + \__kernel_msg_error:nnx { kernel } { toksdef } { \token_to_str:N #1 } \__sort_error: \tex_toksdef:D #1 } -\__msg_kernel_new:nnnn { kernel } { toksdef } +\__kernel_msg_new:nnnn { kernel } { toksdef } { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. } { The~comparison~code~used~for~sorting~a~list~has~attempted~to~ @@ -17008,20 +17423,20 @@ \cs_new_protected:Npn \__sort_too_long_error:NNw #1#2 \fi: { \fi: - \__msg_kernel_error:nnxxx { kernel } { too-large } + \__kernel_msg_error:nnxxx { kernel } { too-large } { \token_to_str:N #2 } { \int_eval:n { \l__sort_true_max_int - \l__sort_min_int } } { \int_eval:n { \l__sort_top_int - \l__sort_min_int } } #1 \__sort_error: } -\__msg_kernel_new:nnnn { kernel } { too-large } +\__kernel_msg_new:nnnn { kernel } { too-large } { The~list~#1~is~too~long~to~be~sorted~by~TeX. } { TeX~has~#2~toks~registers~still~available:~ this~only~allows~to~sort~with~up~to~#3~ items.~All~extra~items~will~be~deleted. } -\__msg_kernel_new:nnnn { kernel } { return-none } +\__kernel_msg_new:nnnn { kernel } { return-none } { The~comparison~code~did~not~return. } { When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~ @@ -17030,7 +17445,7 @@ \iow_char:N\\sort_return_swapped: .~ Exactly~one~of~these~should~be~called. } -\__msg_kernel_new:nnnn { kernel } { return-two } +\__kernel_msg_new:nnnn { kernel } { return-two } { The~comparison~code~returned~multiple~times. } { When~sorting~a~list,~the~code~to~compare~items~called~ @@ -17038,9 +17453,9 @@ \iow_char:N\\sort_return_swapped: ~multiple~times.~ Exactly~one~of~these~should~be~called. } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: } \cs_new_protected:Npn \sort_ordered: { \sort_return_same: } -\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: } +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: } \cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: } %% File: l3tl-build.dtx Copyright (C) 2011-2017 The LaTeX3 Project \int_new:N \l__tl_build_start_index_int @@ -17519,14 +17934,14 @@ \cs_generate_variant:Nn \__tl_analysis_show_long_aux:nnnn { oof } \tl_const:Nx \c__tl_analysis_show_etc_str % ( { \token_to_str:N \ETC.) } -\__msg_kernel_new:nnn { kernel } { show-tl-analysis } +\__kernel_msg_new:nnn { kernel } { show-tl-analysis } { The~token~list~ \tl_if_empty:nF {#1} { #1 ~ } \tl_if_empty:nTF {#2} { is~empty } { contains~the~tokens: #2 } } -%% File: l3regex.dtx Copyright (C) 2011-2017 The LaTeX3 Project +%% File: l3regex.dtx Copyright (C) 2011-2018 The LaTeX3 Project \cs_new_protected:Npn \__regex_standard_escapechar: { \int_set:Nn \tex_escapechar:D { `\\ } } \cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D } @@ -17785,11 +18200,11 @@ \__regex_item_caseful_range:nn { `A } { `F } \__regex_item_caseful_range:nn { `a } { `f } } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn + \__regex_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn \__tl_build:Nw \l__regex_internal_a_tl - \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn } + \__tl_build_one:n { \__regex_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn } \use_none:nn } { } @@ -17830,7 +18245,7 @@ \cs_new:cpn { __regex_escape_/break:w } { \if_false: { \fi: } - \__msg_kernel_error:nn { kernel } { trailing-backslash } + \__kernel_msg_error:nn { kernel } { trailing-backslash } \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } \cs_new:cpn { __regex_escape_~:w } { } @@ -17857,7 +18272,7 @@ { \if_false: { \fi: } \__tl_build_one:o \l__regex_internal_b_tl - \__msg_kernel_error:nnx { kernel } { x-overflow } {#1} + \__kernel_msg_error:nnx { kernel } { x-overflow } {#1} \tl_set:Nx \l__regex_internal_b_tl { \if_false: } \fi: } @@ -17921,7 +18336,7 @@ { \if_false: { \fi: } \__tl_build_one:o \l__regex_internal_b_tl - \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1} + \__kernel_msg_error:nnx { kernel } { x-missing-rbrace } {#1} \tl_set:Nx \l__regex_internal_b_tl { \if_false: } \fi: \__regex_escape_loop:N #1 } @@ -18085,7 +18500,7 @@ \if_int_compare:w \l__regex_mode_int = \c__regex_class_mode_int \exp_after:wN \exp_after:wN \exp_after:wN \use:n \else: - \__msg_kernel_error:nn { kernel } { c-bad-mode } + \__kernel_msg_error:nn { kernel } { c-bad-mode } \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n \fi: \fi: @@ -18114,13 +18529,13 @@ { \__regex_if_in_class:TF { - \__msg_kernel_error:nn { kernel } { missing-rbrack } + \__kernel_msg_error:nn { kernel } { missing-rbrack } \use:c { __regex_compile_]: } \prg_do_nothing: \prg_do_nothing: } { } \if_int_compare:w \l__regex_group_level_int > 0 \exp_stop_f: - \__msg_kernel_error:nnx { kernel } { missing-rparen } + \__kernel_msg_error:nnx { kernel } { missing-rparen } { \int_use:N \l__regex_group_level_int } \prg_replicate:nn { \l__regex_group_level_int } @@ -18156,10 +18571,10 @@ \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \int_compare:nNnT \l__regex_mode_int = \c__regex_catcode_mode_int - { \__msg_kernel_error:nn { kernel } { c-trailing } } + { \__kernel_msg_error:nn { kernel } { c-trailing } } \int_compare:nNnT \l__regex_mode_int < \c__regex_outer_mode_int { - \__msg_kernel_error:nn { kernel } { c-missing-rbrace } + \__kernel_msg_error:nn { kernel } { c-missing-rbrace } \__regex_compile_end_cs: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: @@ -18219,7 +18634,7 @@ \cs_new_protected:Npn \__regex_compile_quantifier_abort:xNN #1#2#3 { \__regex_compile_quantifier_none: - \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3} + \__kernel_msg_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3} \__regex_compile_abort_tokens:x {#1} #2 #3 } @@ -18286,7 +18701,7 @@ { #1 #2 } { \__regex_compile_special:N \c_right_brace_str } { \if_int_compare:w \l__regex_internal_a_int > \l__regex_internal_b_int - \__msg_kernel_error:nnxx { kernel } { backwards-quantifier } + \__kernel_msg_error:nnxx { kernel } { backwards-quantifier } { \int_use:N \l__regex_internal_a_int } { \int_use:N \l__regex_internal_b_int } \int_zero:N \l__regex_internal_b_int @@ -18309,7 +18724,7 @@ } \cs_new_protected:Npn \__regex_compile_raw_error:N #1 { - \__msg_kernel_error:nnx { kernel } { bad-escape } {#1} + \__kernel_msg_error:nnx { kernel } { bad-escape } {#1} \__regex_compile_raw:N #1 } \cs_new_protected:Npn \__regex_compile_raw:N #1#2#3 @@ -18351,7 +18766,7 @@ \__regex_if_end_range:NNTF #2 #3 { \if_int_compare:w `#1 > `#3 \exp_stop_f: - \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3} + \__kernel_msg_error:nnxx { kernel } { range-backwards } {#1} {#3} \else: \__tl_build_one:x { @@ -18365,7 +18780,7 @@ \fi: } { - \__msg_kernel_warning:nnxx { kernel } { range-missing-end } + \__kernel_msg_warning:nnxx { kernel } { range-missing-end } {#1} { \c_backslash_str #3 } \__tl_build_one:x { @@ -18517,8 +18932,8 @@ \str_case:nn { #2 } { : { \__regex_compile_class_posix:NNNNw } - = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } } - . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } } + = { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { = } } + . { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { . } } } } \__regex_compile_raw:N [ #1 #2 @@ -18557,7 +18972,7 @@ } } { - \__msg_kernel_warning:nnx { kernel } { posix-unknown } + \__kernel_msg_warning:nnx { kernel } { posix-unknown } { \l__regex_internal_a_tl } \__regex_compile_abort_tokens:x { @@ -18567,7 +18982,7 @@ } } { - \__msg_kernel_error:nnxx { kernel } { posix-missing-close } + \__kernel_msg_error:nnxx { kernel } { posix-missing-close } { [: \l__regex_internal_a_tl } { #2 #4 } \__regex_compile_abort_tokens:x { [: \l__regex_internal_a_tl } #1 #2 #3 #4 @@ -18591,7 +19006,7 @@ \__tl_build_one:o \l__regex_internal_regex \exp_after:wN \__regex_compile_quantifier:w \else: - \__msg_kernel_warning:nn { kernel } { extra-rparen } + \__kernel_msg_warning:nn { kernel } { extra-rparen } \exp_after:wN \__regex_compile_raw:N \exp_after:wN ) \fi: } @@ -18607,7 +19022,7 @@ \cs_if_exist_use:cF { __regex_compile_special_group_\token_to_str:N #4 :w } { - \__msg_kernel_warning:nnx { kernel } { special-group-unknown } + \__kernel_msg_warning:nnx { kernel } { special-group-unknown } { (? #4 } \__regex_compile_group_begin:N \__regex_group:nnnN \__regex_compile_raw:N ? #3 #4 @@ -18643,7 +19058,7 @@ \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseless_range:nn } } { - \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 } + \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?i #2 } \__regex_compile_raw:N ( \__regex_compile_raw:N ? \__regex_compile_raw:N i @@ -18659,7 +19074,7 @@ \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseful_range:nn } } { - \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 } + \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?-#2#4 } \__regex_compile_raw:N ( \__regex_compile_raw:N ? \__regex_compile_raw:N - @@ -18686,7 +19101,7 @@ } { \cs_if_exist_use:cF { __regex_compile_c_#2:w } } { - \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2} + \__kernel_msg_error:nnx { kernel } { c-missing-category } {#2} #1 #2 } } @@ -18699,7 +19114,7 @@ { \token_if_eq_charcode:NNF #2 ( } % ) } { \use:n } - { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} } + { \__kernel_msg_error:nnn { kernel } { c-C-invalid } {#2} } #1 #2 } \cs_new_protected:cpn { __regex_compile_c_[:w } #1#2 @@ -18738,7 +19153,7 @@ { \__regex_compile_c_lbrack_end: } } { - \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2} + \__kernel_msg_error:nnx { kernel } { c-missing-rbrack } {#2} \__regex_compile_c_lbrack_end: #1 #2 } @@ -18840,7 +19255,7 @@ \__regex_compile_u_loop:NN } { - \__msg_kernel_error:nn { kernel } { u-missing-lbrace } + \__kernel_msg_error:nn { kernel } { u-missing-lbrace } \__regex_compile_raw:N u #1 #2 } } @@ -18858,7 +19273,7 @@ } { \if_false: { \fi: } - \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2} + \__kernel_msg_error:nnx { kernel } { u-missing-rbrace } {#2} \__regex_compile_u_end: #1 #2 } @@ -19078,11 +19493,11 @@ \__regex_compile:n {#1} \__regex_build:N \l__regex_internal_regex } -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \__regex_build:N } +\__kernel_patch:nnNNpn + { \__regex_trace_push:nnN { regex } { 1 } \__regex_build:N } { \__regex_trace_states:n { 2 } - \__debug_trace_pop:nnN { regex } { 1 } \__regex_build:N + \__regex_trace_pop:nnN { regex } { 1 } \__regex_build:N } \cs_new_protected:Npn \__regex_build:N #1 { @@ -19097,11 +19512,11 @@ \__regex_toks_put_right:Nn \l__regex_right_state_int { \__regex_action_success: } } -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \__regex_build_for_cs:n } +\__kernel_patch:nnNNpn + { \__regex_trace_push:nnN { regex } { 1 } \__regex_build_for_cs:n } { \__regex_trace_states:n { 2 } - \__debug_trace_pop:nnN { regex } { 1 } \__regex_build_for_cs:n + \__regex_trace_pop:nnN { regex } { 1 } \__regex_build_for_cs:n } \cs_new_protected:Npn \__regex_build_for_cs:n #1 { @@ -19136,9 +19551,9 @@ { \__regex_toks_put_left:Nx #2 { #1 { \int_eval:n { #3 - #2 } } } } \cs_new_protected:Npn \__regex_build_transition_right:nNn #1#2#3 { \__regex_toks_put_right:Nx #2 { #1 { \int_eval:n { #3 - #2 } } } } -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_trace:nnx { regex } { 2 } + \__regex_trace:nnx { regex } { 2 } { regex~new~state~ L=\int_use:N \l__regex_left_state_int ~ -> ~ @@ -19220,9 +19635,9 @@ \__regex_tests_action_cost:n \l__regex_right_state_int } } -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \__regex_group_aux:nnnnN } - { \__debug_trace_pop:nnN { regex } { 1 } \__regex_group_aux:nnnnN } +\__kernel_patch:nnNNpn + { \__regex_trace_push:nnN { regex } { 1 } \__regex_group_aux:nnnnN } + { \__regex_trace_pop:nnN { regex } { 1 } \__regex_group_aux:nnnnN } \cs_new_protected:Npn \__regex_group_aux:nnnnN #1#2#3#4#5 { \if_int_compare:w #3 = 0 \exp_stop_f: @@ -19272,9 +19687,9 @@ { \int_max:nn {#1} { \l__regex_capturing_group_int } } {#2} } -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \__regex_branch:n } - { \__debug_trace_pop:nnN { regex } { 1 } \__regex_branch:n } +\__kernel_patch:nnNNpn + { \__regex_trace_push:nnN { regex } { 1 } \__regex_branch:n } + { \__regex_trace_pop:nnN { regex } { 1 } \__regex_branch:n } \cs_new_protected:Npn \__regex_branch:n #1 { \__regex_build_new_state: @@ -19461,12 +19876,12 @@ \bool_new:N \g__regex_success_bool \bool_new:N \l__regex_saved_success_bool \bool_new:N \l__regex_match_success_bool -\__debug_patch:nnNNpn +\__kernel_patch:nnNNpn { - \__debug_trace_push:nnN { regex } { 1 } \__regex_match:n - \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list } + \__regex_trace_push:nnN { regex } { 1 } \__regex_match:n + \__regex_trace:nnx { regex } { 1 } { analyzing~query~token~list } } - { \__debug_trace_pop:nnN { regex } { 1 } \__regex_match:n } + { \__regex_trace_pop:nnN { regex } { 1 } \__regex_match:n } \cs_new_protected:Npn \__regex_match:n #1 { \int_zero:N \l__regex_balance_int @@ -19480,8 +19895,8 @@ \__regex_match_init: \__regex_match_once: } -\__debug_patch:nnNNpn - { \__debug_trace:nnx { regex } { 1 } { initializing } } +\__kernel_patch:nnNNpn + { \__regex_trace:nnx { regex } { 1 } { initializing } } { } \cs_new_protected:Npn \__regex_match_init: { @@ -19586,8 +20001,8 @@ = \__intarray_item_fast:Nn \g__regex_catcode_intarray { \l__regex_curr_pos_int } \scan_stop: } -\__debug_patch:nnNNpn - { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l__regex_curr_state_int } } +\__kernel_patch:nnNNpn + { \__regex_trace:nnx { regex } { 2 } { state~\int_use:N \l__regex_curr_state_int } } { } \cs_new_protected:Npn \__regex_use_state: { @@ -19737,9 +20152,9 @@ } } } -\__debug_patch:nnNNpn - { \__debug_trace_push:nnN { regex } { 1 } \__regex_replacement:n } - { \__debug_trace_pop:nnN { regex } { 1 } \__regex_replacement:n } +\__kernel_patch:nnNNpn + { \__regex_trace_push:nnN { regex } { 1 } \__regex_replacement:n } + { \__regex_trace_pop:nnN { regex } { 1 } \__regex_replacement:n } \cs_new_protected:Npn \__regex_replacement:n #1 { \__tl_build:Nw \l__regex_internal_a_tl @@ -19759,14 +20174,14 @@ {#1} \prg_do_nothing: \prg_do_nothing: \if_int_compare:w \l__regex_replacement_csnames_int > 0 \exp_stop_f: - \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace } + \__kernel_msg_error:nnx { kernel } { replacement-missing-rbrace } { \int_use:N \l__regex_replacement_csnames_int } \__tl_build_one:x { \prg_replicate:nn \l__regex_replacement_csnames_int \cs_end: } \fi: \seq_if_empty:NF \l__regex_replacement_category_seq { - \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen } + \__kernel_msg_error:nnx { kernel } { replacement-missing-rparen } { \seq_count:N \l__regex_replacement_category_seq } \seq_clear:N \l__regex_replacement_category_seq } @@ -19901,11 +20316,11 @@ \cs_new_protected:Npn \__regex_replacement_cat:NNN #1#2#3 { \token_if_eq_meaning:NNTF \prg_do_nothing: #3 - { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } } + { \__kernel_msg_error:nn { kernel } { replacement-catcode-end } } { \int_compare:nNnTF { \l__regex_replacement_csnames_int } > 0 { - \__msg_kernel_error:nnnn + \__kernel_msg_error:nnnn { kernel } { replacement-catcode-in-cs } {#1} {#3} #2 #3 } @@ -19921,7 +20336,7 @@ { \__regex_char_if_alphanumeric:NTF #3 { - \__msg_kernel_error:nnnn + \__kernel_msg_error:nnnn { kernel } { replacement-catcode-escaped } {#1} {#3} } @@ -19982,7 +20397,7 @@ \cs_new_protected:Npn \__regex_replacement_c_S:w #1#2 { \if_int_compare:w `#2 = 0 \exp_stop_f: - \__msg_kernel_error:nn { kernel } { replacement-null-space } + \__kernel_msg_error:nn { kernel } { replacement-null-space } \fi: \tex_lccode:D `\ = `#2 \scan_stop: \tex_lowercase:D { \__tl_build_one:n {~} } @@ -19996,7 +20411,7 @@ \group_end: \cs_new_protected:Npn \__regex_replacement_error:NNN #1#2#3 { - \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3} + \__kernel_msg_error:nnx { kernel } { replacement-#1 } {#3} #2 #3 } \cs_new_protected:Npn \regex_new:N #1 @@ -20181,7 +20596,7 @@ { \flag_height:n { __regex_begin } + \flag_height:n { __regex_end } } = 0 { - \__msg_kernel_error:nnxxx { kernel } { result-unbalanced } + \__kernel_msg_error:nnxxx { kernel } { result-unbalanced } { splitting~or~extracting~submatches } { \flag_height:n { __regex_end } } { \flag_height:n { __regex_begin } } @@ -20304,7 +20719,7 @@ { \if_int_compare:w \l__regex_balance_int = 0 \exp_stop_f: \else: - \__msg_kernel_error:nnxxx { kernel } { result-unbalanced } + \__kernel_msg_error:nnxxx { kernel } { result-unbalanced } { replacing } { \int_max:nn { - \l__regex_balance_int } { 0 } } { \int_max:nn { \l__regex_balance_int } { 0 } } @@ -20326,20 +20741,20 @@ } } } -\__msg_kernel_new:nnnn { kernel } { trailing-backslash } +\__kernel_msg_new:nnnn { kernel } { trailing-backslash } { Trailing~escape~character~'\iow_char:N\\'. } { A~regular~expression~or~its~replacement~text~ends~with~ the~escape~character~'\iow_char:N\\'.~It~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { x-missing-rbrace } +\__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. } -\__msg_kernel_new:nnnn { kernel } { x-overflow } +\__kernel_msg_new:nnnn { kernel } { x-overflow } { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. } { You~wrote~something~like~ @@ -20347,20 +20762,20 @@ The~character~code~#1~is~larger~than~ the~maximum~value~\int_use:N \c_max_char_int. } -\__msg_kernel_new:nnnn { kernel } { invalid-quantifier } +\__kernel_msg_new:nnnn { kernel } { invalid-quantifier } { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. } { The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~ The~only~valid~quantifiers~are~'*',~'?',~'+',~'{<int>}',~ '{<min>,}'~and~'{<min>,<max>}',~optionally~followed~by~'?'. } -\__msg_kernel_new:nnnn { kernel } { missing-rbrack } +\__kernel_msg_new:nnnn { kernel } { missing-rbrack } { Missing~right~bracket~inserted~in~regular~expression. } { LaTeX~was~given~a~regular~expression~where~a~character~class~ was~started~with~'[',~but~the~matching~']'~is~missing. } -\__msg_kernel_new:nnnn { kernel } { missing-rparen } +\__kernel_msg_new:nnnn { kernel } { missing-rparen } { Missing~right~ \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~ @@ -20370,13 +20785,13 @@ LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~ more~left~parentheses~than~right~parentheses. } -\__msg_kernel_new:nnnn { kernel } { extra-rparen } +\__kernel_msg_new:nnnn { kernel } { extra-rparen } { Extra~right~parenthesis~ignored~in~regular~expression. } { LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~ was~open.~The~parenthesis~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { bad-escape } +\__kernel_msg_new:nnnn { kernel } { bad-escape } { Invalid~escape~'\iow_char:N\\#1'~ \__regex_if_in_cs:TF { within~a~control~sequence. } @@ -20400,14 +20815,14 @@ because~it~does~not~match~exactly~one~character. } } -\__msg_kernel_new:nnnn { kernel } { range-missing-end } +\__kernel_msg_new:nnnn { kernel } { range-missing-end } { Invalid~end-point~for~range~'#1-#2'~in~character~class. } { The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~ end-point~for~a~range:~alphanumeric~characters~should~not~be~ escaped,~and~non-alphanumeric~characters~should~be~escaped. } -\__msg_kernel_new:nnnn { kernel } { range-backwards } +\__kernel_msg_new:nnnn { kernel } { range-backwards } { Range~'[#1-#2]'~out~of~order~in~character~class. } { In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~ @@ -20415,34 +20830,34 @@ Here,~'#1'~has~character~code~\int_eval:n {`#1},~while~ '#2'~has~character~code~\int_eval:n {`#2}. } -\__msg_kernel_new:nnnn { kernel } { c-bad-mode } +\__kernel_msg_new:nnnn { kernel } { c-bad-mode } { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. } { The~'\iow_char:N\\c'~escape~cannot~be~used~within~ a~control~sequence~test~'\iow_char:N\\c{...}'.~ To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'. } -\__msg_kernel_new:nnnn { kernel } { c-C-invalid } +\__kernel_msg_new:nnnn { kernel } { c-C-invalid } { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. } { The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~ control~sequence~or~the~next~group~to~be~made~of~control~sequences.~ It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group. } -\__msg_kernel_new:nnnn { kernel } { c-missing-rbrace } +\__kernel_msg_new:nnnn { kernel } { c-missing-rbrace } { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. } { LaTeX~was~given~a~regular~expression~where~a~ '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~ with~a~closing~brace~'\iow_char:N\}'. } -\__msg_kernel_new:nnnn { kernel } { c-missing-rbrack } +\__kernel_msg_new:nnnn { kernel } { c-missing-rbrack } { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. } { A~construction~'\iow_char:N\\c[...'~appears~in~a~ regular~expression,~but~the~closing~']'~is~not~present. } -\__msg_kernel_new:nnnn { kernel } { c-missing-category } +\__kernel_msg_new:nnnn { kernel } { c-missing-category } { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. } { In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~ @@ -20450,19 +20865,19 @@ capital~letter~representing~a~character~category,~namely~ one~of~'ABCDELMOPSTU'. } -\__msg_kernel_new:nnnn { kernel } { c-trailing } +\__kernel_msg_new:nnnn { kernel } { c-trailing } { Trailing~category~code~escape~'\iow_char:N\\c'... } { A~regular~expression~ends~with~'\iow_char:N\\c'~followed~ by~a~letter.~It~will~be~ignored. } -\__msg_kernel_new:nnnn { kernel } { u-missing-lbrace } +\__kernel_msg_new:nnnn { kernel } { u-missing-lbrace } { Missing~left~brace~following~'\iow_char:N\\u'~escape. } { The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~ a~brace~group~with~the~name~of~the~variable~to~use. } -\__msg_kernel_new:nnnn { kernel } { u-missing-rbrace } +\__kernel_msg_new:nnnn { kernel } { u-missing-rbrace } { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. } { LaTeX~ @@ -20471,14 +20886,14 @@ { encountered~an~escaped~alphanumeric~character '\iow_char:N\\#2'~ } when~parsing~the~argument~of~an~'\iow_char:N\\u\iow_char:N\{...\}'~escape. } -\__msg_kernel_new:nnnn { kernel } { posix-unsupported } +\__kernel_msg_new:nnnn { kernel } { posix-unsupported } { POSIX~collating~element~'[#1 ~ #1]'~not~supported. } { The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~ in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~ Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class? } -\__msg_kernel_new:nnnn { kernel } { posix-unknown } +\__kernel_msg_new:nnnn { kernel } { posix-unknown } { POSIX~class~'[:#1:]'~unknown. } { '[:#1:]'~is~not~among~the~known~POSIX~classes~ @@ -20487,10 +20902,10 @@ '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~ '[:word:]',~and~'[:xdigit:]'. } -\__msg_kernel_new:nnnn { kernel } { posix-missing-close } +\__kernel_msg_new:nnnn { kernel } { posix-missing-close } { Missing~closing~':]'~for~POSIX~class. } { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. } -\__msg_kernel_new:nnnn { kernel } { result-unbalanced } +\__kernel_msg_new:nnnn { kernel } { result-unbalanced } { Missing~brace~inserted~when~#1. } { LaTeX~was~asked~to~do~some~regular~expression~operation,~ @@ -20498,33 +20913,33 @@ of~begin-group~and~end-group~tokens.~Braces~were~inserted:~ #2~left,~#3~right. } -\__msg_kernel_new:nnnn { kernel } { unknown-option } +\__kernel_msg_new:nnnn { kernel } { unknown-option } { Unknown~option~'#1'~for~regular~expressions. } { The~only~available~option~is~'case-insensitive',~toggled~by~ '(?i)'~and~'(?-i)'. } -\__msg_kernel_new:nnnn { kernel } { special-group-unknown } +\__kernel_msg_new:nnnn { kernel } { special-group-unknown } { Unknown~special~group~'#1~...'~in~a~regular~expression. } { The~only~valid~constructions~starting~with~'(?'~are~ '(?:~...~)',~'(?|~...~)',~'(?i)',~and~'(?-i)'. } -\__msg_kernel_new:nnnn { kernel } { replacement-c } +\__kernel_msg_new:nnnn { kernel } { replacement-c } { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~ can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~ or~a~brace~group,~not~by~'#1'. } -\__msg_kernel_new:nnnn { kernel } { replacement-u } +\__kernel_msg_new:nnnn { kernel } { replacement-u } { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~ must~be~~followed~by~a~brace~group~holding~the~name~of~the~ variable~to~use. } -\__msg_kernel_new:nnnn { kernel } { replacement-g } +\__kernel_msg_new:nnnn { kernel } { replacement-g } { Missing~brace~for~the~'\iow_char:N\\g'~construction~ in~a~replacement~text. @@ -20534,7 +20949,7 @@ submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~ or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing. } -\__msg_kernel_new:nnnn { kernel } { replacement-catcode-end } +\__kernel_msg_new:nnnn { kernel } { replacement-catcode-end } { Missing~character~for~the~'\iow_char:N\\c<category><character>'~ construction~in~a~replacement~text. @@ -20545,7 +20960,7 @@ the~character~category.~Then,~a~character~must~follow.~LaTeX~ reached~the~end~of~the~replacement~when~looking~for~that. } -\__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped } +\__kernel_msg_new:nnnn { kernel } { replacement-catcode-escaped } { Escaped~letter~or~digit~after~category~code~in~replacement~text. } @@ -20555,7 +20970,7 @@ the~character~category.~Then,~a~character~must~follow,~not~ '\iow_char:N\\#2'. } -\__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs } +\__kernel_msg_new:nnnn { kernel } { replacement-catcode-in-cs } { Category~code~'\iow_char:N\\c#1#3'~ignored~inside~ '\iow_char:N\\c\{...\}'~in~a~replacement~text. @@ -20565,7 +20980,7 @@ '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~ sequence~name. } -\__msg_kernel_new:nnnn { kernel } { replacement-null-space } +\__kernel_msg_new:nnnn { kernel } { replacement-null-space } { TeX~cannot~build~a~space~token~with~character~code~0. } { You~asked~for~a~character~token~with~category~space,~ @@ -20574,19 +20989,19 @@ This~specific~case~is~impossible~and~will~be~replaced~ by~a~normal~space. } -\__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace } +\__kernel_msg_new:nnnn { kernel } { replacement-missing-rbrace } { Missing~right~brace~inserted~in~replacement~text. } { There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~ missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } . } -\__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen } +\__kernel_msg_new:nnnn { kernel } { replacement-missing-rparen } { 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 } . } -\__msg_kernel_new:nnn { kernel } { show-regex } +\__kernel_msg_new:nnn { kernel } { show-regex } { >~Compiled~regex~ \tl_if_empty:nTF {#1} { variable~ #2 } { {#1} } : @@ -20608,22 +21023,22 @@ } } } -\__debug:TF +\__kernel_debug:TF { - \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3 - { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } } - \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3 - { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } } - \cs_new_protected:Npn \__debug_trace:nnx #1#2#3 + \cs_new_protected:Npn \__regex_trace_push:nnN #1#2#3 + { \__regex_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } } + \cs_new_protected:Npn \__regex_trace_pop:nnN #1#2#3 + { \__regex_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } } + \cs_new_protected:Npn \__regex_trace:nnx #1#2#3 { \int_compare:nNnF - { \int_use:c { g__debug_trace_#1_int } } < {#2} + { \int_use:c { g__regex_trace_#1_int } } < {#2} { \iow_term:x { Trace:~#3 } } } } { } -\int_new:N \g__debug_trace_regex_int -\__debug:TF +\int_new:N \g__regex_trace_regex_int +\__kernel_debug:TF { \cs_new_protected:Npn \__regex_trace_states:n #1 { @@ -20632,13 +21047,13 @@ { 1 } { \l__regex_max_state_int - 1 } { - \__debug_trace:nnx { regex } {#1} + \__regex_trace:nnx { regex } {#1} { \iow_char:N \\toks ##1 = { \__regex_toks_use:w ##1 } } } } } { } -%% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project +%% File: l3box.dtx Copyright (C) 2005-2018 The LaTeX3 Project \cs_new_protected:Npn \box_new:N #1 { \__chk_if_free_cs:N #1 @@ -20657,18 +21072,18 @@ { \box_if_exist:NTF #1 { \box_gclear:N #1 } { \box_new:N #1 } } \cs_generate_variant:Nn \box_clear_new:N { c } \cs_generate_variant:Nn \box_gclear_new:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_eq:NN #1#2 { \tex_setbox:D #1 \tex_copy:D #2 } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_eq:NN #1#2 { \tex_global:D \tex_setbox:D #1 \tex_copy:D #2 } \cs_generate_variant:Nn \box_set_eq:NN { c , Nc , cc } \cs_generate_variant:Nn \box_gset_eq:NN { c , Nc , cc } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_eq_clear:NN #1#2 { \tex_setbox:D #1 \tex_box:D #2 } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_eq_clear:NN #1#2 { \tex_global:D \tex_setbox:D #1 \tex_box:D #2 } \cs_generate_variant:Nn \box_set_eq_clear:NN { c , Nc , cc } @@ -20719,10 +21134,10 @@ { \if_box_empty:N #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \box_if_empty:N { c } { p , T , F , TF } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_to_last:N #1 { \tex_setbox:D #1 \tex_lastbox:D } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_to_last:N #1 { \tex_global:D \tex_setbox:D #1 \tex_lastbox:D } \cs_generate_variant:Nn \box_set_to_last:N { c } @@ -20763,28 +21178,28 @@ \group_end: } { - \__msg_kernel_error:nnx { kernel } { variable-not-defined } + \__kernel_msg_error:nnx { kernel } { variable-not-defined } { \token_to_str:N #2 } } } \cs_generate_variant:Nn \__box_show:NNnn { NNff } \cs_new_protected:Npn \hbox:n #1 { \tex_hbox:D \scan_stop: { \group_begin: #1 \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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 { \group_begin: #2 \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } } \cs_generate_variant:Nn \hbox_set:Nn { c } \cs_generate_variant:Nn \hbox_gset:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} { \group_begin: #3 \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -20792,14 +21207,14 @@ } \cs_generate_variant:Nn \hbox_set_to_wd:Nnn { c } \cs_generate_variant:Nn \hbox_gset_to_wd:Nnn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \hbox_set:Nw #1 { \tex_setbox:D #1 \tex_hbox:D \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset:Nw #1 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D @@ -20814,14 +21229,14 @@ \c_group_end_token } \cs_new_eq:NN \hbox_gset_end: \hbox_set_end: -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -20859,13 +21274,13 @@ \tex_vbox:D to \c_zero_dim { \group_begin: #1 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set:Nn #1#2 { \tex_setbox:D #1 \tex_vbox:D { \group_begin: #2 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D @@ -20873,13 +21288,13 @@ } \cs_generate_variant:Nn \vbox_set:Nn { c } \cs_generate_variant:Nn \vbox_gset:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set_top:Nn #1#2 { \tex_setbox:D #1 \tex_vtop:D { \group_begin: #2 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset_top:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vtop:D @@ -20887,13 +21302,13 @@ } \cs_generate_variant:Nn \vbox_set_top:Nn { c } \cs_generate_variant:Nn \vbox_gset_top:Nn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} { \group_begin: #3 \par \group_end: } } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -20901,14 +21316,14 @@ } \cs_generate_variant:Nn \vbox_set_to_ht:Nnn { c } \cs_generate_variant:Nn \vbox_gset_to_ht:Nnn { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set:Nw #1 { \tex_setbox:D #1 \tex_vbox:D \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset:Nw #1 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D @@ -20924,14 +21339,14 @@ \c_group_end_token } \cs_new_eq:NN \vbox_gset_end: \vbox_set_end: -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} \c_group_begin_token \group_begin: } -\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } +\__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} @@ -20944,7 +21359,7 @@ \cs_new_eq:NN \vbox_unpack_clear:N \tex_unvbox:D \cs_generate_variant:Nn \vbox_unpack:N { c } \cs_generate_variant:Nn \vbox_unpack_clear:N { c } -\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } +\__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} } \fp_new:N \l__box_angle_fp @@ -21246,19 +21661,19 @@ } } } -\__debug_deprecation:nnNNpn +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn } \cs_new_protected:Npn \box_resize:Nnn { \box_resize_to_wd_and_ht_plus_dp:Nnn } -\__debug_deprecation:nnNNpn +\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn } \cs_new_protected:Npn \box_resize:cnn { \box_resize_to_wd_and_ht_plus_dp:cnn } -\__debug_deprecation:nnNNpn - { 2018-12-31 } { \box_use_clear:N } +\__kernel_patch_deprecation:nnNNpn + { 2018-12-31 } { \box_use_drop:N } \cs_new_protected:Npn \box_use_clear:N { \box_use_drop:N } -\__debug_deprecation:nnNNpn - { 2018-12-31 } { \box_use_clear:c } +\__kernel_patch_deprecation:nnNNpn + { 2018-12-31 } { \box_use_drop:c } \cs_new_protected:Npn \box_use_clear:c { \box_use_drop:c } %% File: l3coffins.dtx Copyright(C) 2010-2017 The LaTeX3 Project \box_new:N \l__coffin_internal_box @@ -21311,7 +21726,7 @@ \coffin_if_exist:NTF #1 { #2 } { - \__msg_kernel_error:nnx { kernel } { unknown-coffin } + \__kernel_msg_error:nnx { kernel } { unknown-coffin } { \token_to_str:N #1 } } } @@ -21456,7 +21871,7 @@ \prop_get:cnNF { l__coffin_poles_ \__int_value:w #1 _prop } {#2} #3 { - \__msg_kernel_error:nnxx { kernel } { unknown-coffin-pole } + \__kernel_msg_error:nnxx { kernel } { unknown-coffin-pole } {#2} { \token_to_str:N #1 } \tl_set:Nn #3 { { 0pt } { 0pt } { 0pt } { 0pt } } } @@ -21564,7 +21979,7 @@ \l__coffin_pole_a_tl \l__coffin_pole_b_tl \bool_if:NT \l__coffin_error_bool { - \__msg_kernel_error:nn { kernel } { no-pole-intersection } + \__kernel_msg_error:nn { kernel } { no-pole-intersection } \dim_zero:N \l__coffin_x_dim \dim_zero:N \l__coffin_y_dim } @@ -22039,7 +22454,7 @@ { } } } -\__msg_kernel_new:nnnn { kernel } { no-pole-intersection } +\__kernel_msg_new:nnnn { kernel } { no-pole-intersection } { No~intersection~between~coffin~poles. } { \c__msg_coding_error_text_tl @@ -22047,22 +22462,22 @@ but~they~do~not~have~a~unique~meeting~point:~ the~value~(0~pt,~0~pt)~will~be~used. } -\__msg_kernel_new:nnnn { kernel } { unknown-coffin } +\__kernel_msg_new:nnnn { kernel } { unknown-coffin } { Unknown~coffin~'#1'. } { The~coffin~'#1'~was~never~defined. } -\__msg_kernel_new:nnnn { kernel } { unknown-coffin-pole } +\__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. } -\__msg_kernel_new:nnn { kernel } { show-coffin } +\__kernel_msg_new:nnn { kernel } { show-coffin } { Size~of~coffin~#1 : #2 \\ Poles~of~coffin~#1 : #3 . } -%% File: l3color.dtx Copyright(C) 2011,2012,2014,2016,2017 The LaTeX3 Project +%% File: l3color-base.dtx Copyright(C) 2011,2012,2014,2016-2018 The LaTeX3 Project \cs_new_eq:NN \color_group_begin: \group_begin: \cs_new_protected:Npn \color_group_end: { @@ -22071,10 +22486,23 @@ } \cs_new_protected:Npn \color_ensure_current: { - \__driver_color_pickup:N \l__color_current_tl - \__driver_color_select:V \l__color_current_tl - \group_insert_after:N \__driver_color_reset: - } + \driver_color_pickup:N \l__color_current_tl + \__color_select:V \l__color_current_tl + \group_insert_after:N \driver_color_reset: + } +\cs_new_protected:Npn \__color_select:n #1 + { \__color_select:w #1 \q_stop } +\cs_generate_variant:Nn \__color_select:n { V } +\cs_new_protected:Npn \__color_select:w #1 ~ #2 \q_stop + { \use:c { __color_select_ #1 :w } #2 \q_stop } +\cs_new_protected:Npn \__color_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop + { \driver_color_cmyk:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \__color_select_gray:w #1 \q_stop + { \driver_color_gray:n {#1} } +\cs_new_protected:Npn \__color_select_rgb:w #1 ~ #2 ~ #3 \q_stop + { \driver_color_rgb:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \__color_select_spot:w #1 ~ #2 \q_stop + { \driver_color_spot:nn {#1} {#2} } \tl_new:N \l__color_current_tl \tl_set:Nn \l__color_current_tl { gray~0 } %% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project @@ -22161,15 +22589,15 @@ \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool \str_const:Nn \c_sys_output_str { dvi } } -%% File: l3deprecation.dtx (C) Copyright 2017 The LaTeX3 Project +%% File: l3deprecation.dtx (C) Copyright 2017-2018 The LaTeX3 Project \cs_new_protected:Npn \__deprecation_error:Nnn #1#2#3 { \etex_protected:D \tex_outer:D \tex_edef:D #1 { - \exp_not:N \__msg_kernel_expandable_error:nnnnn + \exp_not:N \__kernel_msg_expandable_error:nnnnn { kernel } { deprecated-command } { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} } - \exp_not:N \__msg_kernel_error:nnxxx + \exp_not:N \__kernel_msg_error:nnxxx { kernel } { deprecated-command } { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} } } @@ -22205,21 +22633,16 @@ \__deprecation_error:Nnn \xetex_if_engine:F { \sys_if_engine_xetex:F } { 2017-01-01 } \__deprecation_error:Nnn \xetex_if_engine:T { \sys_if_engine_xetex:T } { 2017-01-01 } \__deprecation_error:Nnn \xetex_if_engine:TF { \sys_if_engine_xetex:TF } { 2017-01-01 } -\__debug:TF +\__kernel_deprecation_code:nn { - \tl_gput_right:Nn \g__debug_deprecation_on_tl - { - \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx - { \__msg_kernel_error:nnxxxx } - } - \tl_gput_right:Nn \g__debug_deprecation_off_tl - { - \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx - { \__msg_kernel_warning:nnxxxx } - } + \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx + { \__kernel_msg_error:nnxxxx } } - { } -%% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project + { + \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx + { \__kernel_msg_warning:nnxxxx } + } +%% File: l3candidates.dtx Copyright (C) 2012-2018 The LaTeX3 Project \cs_new_protected:Npx \mode_leave_vertical: { \cs_if_exist:NTF \pdftex_quitvmode:D @@ -22615,13 +23038,13 @@ \cs_set_protected:Npn \__file_get_details:nnN #1#2#3 { \tl_clear:N #3 - \__msg_kernel_error:nnx + \__kernel_msg_error:nnx { kernel } { xetex-primitive-not-available } { \exp_not:c { pdffile #2 } } } } } -\__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available } +\__kernel_msg_new:nnnn { kernel } { xetex-primitive-not-available } { Primitive~\token_to_str:N #1 not~available } { XeTeX~does~not~currently~provide~functionality~equivalent~to~the~ @@ -22640,7 +23063,7 @@ {#2} { \__file_input:V \l__file_full_name_str } } -\__debug_deprecation:nnNNpn { 2017-12-31 } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \file_if_exist:nTF and~ \file_input:n } \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3 { @@ -22648,7 +23071,7 @@ \str_if_empty:NTF \l__file_full_name_str {#3} { #2 \__file_input:V \l__file_full_name_str } } -\__debug_deprecation:nnNNpn { 2017-12-31 } +\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \file_if_exist:nT and~ \file_input:n } \cs_new_protected:Npn \file_if_exist_input:nT #1#2 { @@ -22659,10 +23082,10 @@ \cs_new_protected:Npn \file_input_stop: { \tex_endinput:D } \cs_if_exist:NTF \pdftex_uniformdeviate:D { - \__debug_patch_args:nNNpn + \__kernel_patch_args:nNNpn { - { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_rand:nn } - { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_rand:nn } + { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_rand:nn } + { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_rand:nn } } \cs_new:Npn \int_rand:nn #1#2 { @@ -22674,7 +23097,7 @@ { \int_compare:nNnTF {#1} > {#2} { - \__msg_kernel_expandable_error:nnnn + \__kernel_msg_expandable_error:nnnn { kernel } { backward-range } {#1} {#2} \__int_rand:ww #2; #1; } @@ -22709,13 +23132,13 @@ { \cs_new:Npn \int_rand:nn #1#2 { - \__msg_kernel_expandable_error:nn { kernel } { fp-no-random } + \__kernel_msg_expandable_error:nn { kernel } { fp-no-random } \int_eval:n {#1} } } \cs_if_exist:NT \pdftex_uniformdeviate:D { - \__msg_kernel_new:nnn { kernel } { backward-range } + \__kernel_msg_new:nnn { kernel } { backward-range } { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. } } \cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6 @@ -22768,7 +23191,7 @@ \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } \exp_not:N \tl_to_str:n {#2} } -\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } +\__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 @@ -24200,7 +24623,7 @@ { \cs_set:Npn #1 ##1 { - \__msg_kernel_expandable_error:nnn + \__kernel_msg_expandable_error:nnn { kernel } { luatex-required } { #1 } } } @@ -24209,12 +24632,12 @@ { \cs_set_protected:Npn #1 ##1 { - \__msg_kernel_error:nnn + \__kernel_msg_error:nnn { kernel } { luatex-required } { #1 } } } } -\__msg_kernel_new:nnnn { kernel } { luatex-required } +\__kernel_msg_new:nnnn { kernel } { luatex-required } { LuaTeX~engine~not~in~use!~Ignoring~#1. } { The~feature~you~are~using~is~only~available~ diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index 6dad32cd813..09c9c25667e 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -6,7 +6,7 @@ %% %% expl3.dtx (with options: `generic,loader') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project -\def\ExplFileDate{2017/12/16}% +\def\ExplFileDate{2018/02/21}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \def\tempa{LaTeX2e}% diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index fe60630658f..a64a5919bfd 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -6,7 +6,7 @@ %% %% expl3.dtx (with options: `package,loader') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project -\def\ExplFileDate{2017/12/16}% +\def\ExplFileDate{2018/02/21}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% @@ -83,7 +83,7 @@ \cs_if_exist:NF \color { \DeclareRobustCommand \color [2] [ ] { } } } -\__msg_kernel_new:nnnn { expl } { wrong-driver } +\__kernel_msg_new:nnnn { expl } { wrong-driver } { Driver~request~inconsistent~with~engine:~using~'#2'~driver. } { You~have~requested~driver~'#1',~but~this~is~not~suitable~for~use~with~the~ @@ -117,14 +117,14 @@ \tl_set:Nn \l__expl_driver_tl { dvipdfmx } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvipdfmx } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:T { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvipdfmx } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } @@ -135,14 +135,14 @@ \tl_set:Nn \l__expl_driver_tl { dvips } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:T { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } @@ -153,14 +153,14 @@ \tl_set:Nn \l__expl_driver_tl { dvisvgm } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:T { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { dvips } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } @@ -173,14 +173,14 @@ \tl_set:Nn \l__expl_driver_tl { pdfmode } \sys_if_engine_xetex:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { pdfmode } { xdvipdfmx } \tl_set:Nn \l__expl_driver_tl { xdvipdfmx } } { \sys_if_output_pdf:F { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { pdfmode } { dvips } \tl_set:Nn \l__expl_driver_tl { dvips } } @@ -193,12 +193,12 @@ { \sys_if_output_pdf:TF { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { xdvipdfmx } { pdfmode } \tl_set:Nn \l__expl_driver_tl { pdfmode } } { - \__msg_kernel_error:nnnn { expl } { wrong-driver } + \__kernel_msg_error:nnnn { expl } { wrong-driver } { xdvipdfmx } { dvips } \tl_set:Nn \l__expl_driver_tl { dvips } } @@ -219,7 +219,7 @@ \str_if_eq:VnTF \l__expl_driver_tl { latex2e } { \tl_gput_left:Nn \@begindocumenthook { \RequirePackage { graphics } } - \__msg_kernel_new:nnnn { box } { clipping-not-available } + \__kernel_msg_new:nnnn { box } { clipping-not-available } { Box~clipping~not~available. } { The~\box_clip:N~function~is~only~available~when~loading~expl3~ @@ -228,7 +228,7 @@ \cs_set_protected:Npn \box_clip:N #1 { \hbox_set:Nn #1 { \box_use:N #1 } - \__msg_kernel_error:nn { box } { clipping-not-available } + \__kernel_msg_error:nn { box } { clipping-not-available } } \cs_set_protected:Npn \box_rotate:Nn #1#2 { \hbox_set:Nn #1 { \rotatebox {#2} { \box_use:N #1 } } } diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty b/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty index 83546093332..6513f7bea98 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3basics,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3basics} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty b/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty index ab73fb16f17..de805c07768 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3bootstrap,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3bootstrap} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3box.sty b/Master/texmf-dist/tex/latex/l3kernel/l3box.sty index f2921c27952..c183f86ce4e 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3box.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3box.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3box,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3box} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty b/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty index 2cb30d74231..31ef689d272 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3candidates,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3candidates} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty b/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty index 7fde726a15c..25cb92d0d00 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3clist,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3clist} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty b/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty index f93caa6358d..2d25931277b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3coffins,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3coffins} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3color.sty b/Master/texmf-dist/tex/latex/l3kernel/l3color.sty deleted file mode 100644 index bb0cd8200dc..00000000000 --- a/Master/texmf-dist/tex/latex/l3kernel/l3color.sty +++ /dev/null @@ -1,50 +0,0 @@ -%% -%% This is file `l3color.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% l3oldmodules.dtx (with options: `l3color,oldmodules') -%% -%% Copyright (C) 1990-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. -%% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project -\def\old@liii@module@name -{l3color} -\ProvidesPackage\old@liii@module@name - [% - 2017/03/18 Obsolete L3 package - ] -\typeout{*****************************************************************} -\typeout{** } -\typeout{** Package \old@liii@module@name\space is obsolete and has been removed!} -\typeout{** } -\typeout{** Its functionality is now only provided as part of the expl3 package.} -\typeout{** } -\typeout{** After showing you an error message you can hit <return> we will continue} -\typeout{** for now by loading expl3 for you. However, the old packages will be} -\typeout{** removed entirely at the end of 2017.} -\typeout{** } -\typeout{** Therefore, please replace '\string\usepackage{\old@liii@module@name}'} -\typeout{** with '\string\usepackage{expl3}' in your documents as soon as possible.} -\typeout{** } -\typeout{*******************************************************************} -\PackageError - \old@liii@module@name{This package is obsolete --- - use 'expl3' instead} - \@ehc -\RequirePackage{expl3} - -%% -%% -%% End of file `l3color.sty'. diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls index ecf9682900c..522760bb24c 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls +++ b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls @@ -6,7 +6,7 @@ %% %% l3doc.dtx (with options: `class') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,9 +18,9 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project +%% File: l3doc.dtx Copyright (C) 1990-2018 The LaTeX3 project \RequirePackage{expl3,xparse,calc} -\ProvidesExplClass{l3doc}{2017/12/16}{} +\ProvidesExplClass{l3doc}{2018/02/21}{} {L3 Experimental documentation class} \clist_new:N \g_docinput_clist \seq_new:N \g_doc_functions_seq @@ -110,7 +110,7 @@ \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT { o } \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF { o } \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF { V } -\cs_generate_variant:Nn \tl_if_in:nnTF { no } +\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo } \cs_generate_variant:Nn \tl_if_in:NnTF { No } \cs_generate_variant:Nn \tl_if_in:NnT { No } \cs_generate_variant:Nn \tl_if_in:NnF { No } @@ -136,6 +136,16 @@ \tl_set:Nx #1 { \exp_after:wN \__codedoc_tmp:w #1 #2 \q_stop } } \cs_generate_variant:Nn \__codedoc_trim_right:Nn { No } +\prg_new_protected_conditional:Npnn \__codedoc_str_if_begin:nn #1#2 { TF , T , F } + { + \tl_if_in:ooTF + { \exp_after:wN \scan_stop: \tl_to_str:n {#1} } + { \exp_after:wN \scan_stop: \tl_to_str:n {#2} } + { \prg_return_true: } + { \prg_return_false: } + } +\prg_generate_conditional_variant:Nnn \__codedoc_str_if_begin:nn + { oo } { TF , T , F } \cs_new_protected:Npn \__codedoc_replace_at_at:N #1 { \bool_if:NT \l__codedoc_in_implementation_bool @@ -172,32 +182,38 @@ \__codedoc_trim_right:No \l__codedoc_detect_internals_tl \c_catcode_active_space_tl \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl ^^M - \tl_set_eq:NN \l__codedoc_detect_internals_cs_tl \l__codedoc_detect_internals_tl - \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl _ - \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl : - \__codedoc_trim_right:No \l__codedoc_detect_internals_tl { \token_to_str:N : } - \tl_if_empty:NF \l__codedoc_detect_internals_tl + \__codedoc_if_detect_internals_ok:NF \l__codedoc_detect_internals_tl { - \str_if_eq:NNF \l__codedoc_detect_internals_tl \g__codedoc_module_name_tl - { - \bool_lazy_and:nnF - { \g__codedoc_kernel_bool } - { - \str_if_eq_x_p:nn - { \tl_to_str:N \l__codedoc_detect_internals_tl } - { kernel } - } - { - \msg_warning:nnxxx { l3doc } { foreign-internal } - { \tl_to_str:N \l__codedoc_detect_internals_cs_tl } - { \tl_to_str:N \l__codedoc_detect_internals_tl } - { \tl_to_str:N \g__codedoc_module_name_tl } - } - } + \tl_set_eq:NN \l__codedoc_detect_internals_cs_tl \l__codedoc_detect_internals_tl + \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl _ + \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl : + \__codedoc_trim_right:No \l__codedoc_detect_internals_tl { \token_to_str:N : } + \msg_warning:nnxxx { l3doc } { foreign-internal } + { \tl_to_str:N \l__codedoc_detect_internals_cs_tl } + { \tl_to_str:N \l__codedoc_detect_internals_tl } + { \tl_to_str:N \g__codedoc_module_name_tl } } } } \group_end: +\prg_new_protected_conditional:Npnn \__codedoc_if_detect_internals_ok:N #1 { F } + { + \__codedoc_str_if_begin:ooTF {#1} { \g__codedoc_module_name_tl _ } + { \prg_return_true: } + { + \__codedoc_str_if_begin:ooTF {#1} { \g__codedoc_module_name_tl : } + { \prg_return_true: } + { + \bool_if:NTF \g__codedoc_kernel_bool + { + \__codedoc_str_if_begin:ooTF {#1} { kernel _ } + { \prg_return_true: } + { \prg_return_false: } + } + { \prg_return_false: } + } + } + } \cs_new:Npn \__codedoc_signature_base_form:n #1 { \__codedoc_signature_base_form_aux:n #1 \q_stop } \cs_new:Npn \__codedoc_signature_base_form_aux:n #1 diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex b/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex index e95c14de641..b82834ddc81 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex @@ -6,7 +6,7 @@ %% %% l3docstrip.dtx (with options: `program') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def index 49851740957..60fac7b2529 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def @@ -6,7 +6,7 @@ %% %% l3drivers.dtx (with options: `package,dvipdfmx') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -22,12 +22,12 @@ \ProvidesExplFile {l3dvidpfmx.def}{2017/03/18}{} {L3 Experimental driver: dvipdfmx} -\cs_new_protected:Npn \__driver_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \__driver_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { \exp_args:NV \tl_if_head_is_space:nTF \current@color { @@ -37,31 +37,24 @@ \exp_after:wN \use:n \current@color \c_space_tl 1 } } - { \exp_after:wN \__driver_color_pickup_aux:w \current@color \q_stop #1 } + { \exp_after:wN \__driver_color_pickup:w \current@color \q_stop #1 } } - \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3 + \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3 { \tl_set:Nn #3 { #1 ~ #2 } } } { } } +\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4 + { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \__driver_color_select:n { gray~ #1 } } +\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3 + { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } } +\cs_new_protected:Npn \driver_color_spot:nn #1#2 + { \__driver_color_select:n { color~push~\c_space_tl #1 } } \cs_new_protected:Npn \__driver_color_select:n #1 - { - \tex_special:D - { - color~push~ - \cs_if_exist_use:cF - { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n } - { \use:n } - {#1} - } - } -\cs_generate_variant:Nn \__driver_color_select:n { V } -\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1} -\cs_new:Npn \__driver_color_convert_spot:n #1 - { \__driver_color_convert_spot:w #1 \q_stop } -\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop - { \c_space_tl #2 } -\cs_new_protected:Npn \__driver_color_reset: + { \tex_special:D { color~push~ #1 } } +\cs_new_protected:Npn \driver_color_reset: { \tex_special:D { color~pop } } \cs_new_protected:Npn \__driver_literal:n #1 { \tex_special:D { pdf:literal~ #1 } } @@ -276,7 +269,7 @@ { \dim_to_decimal_in_bp:n {#1} ~ w } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } } + { \__driver_draw_literal:x { #1 ~ M } } \cs_new_protected:Npn \driver_draw_cap_butt: { \__driver_draw_literal:n { 0 ~ J } } \cs_new_protected:Npn \driver_draw_cap_round: @@ -291,82 +284,35 @@ { \__driver_draw_literal:n { 2 ~ j } } \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4 { - \use:x - { - \__driver_draw_color_cmyk_aux:nnnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - { \fp_eval:n {#4} } - } - } -\cs_new_protected:Npn \__driver_draw_color_cmyk_aux:nnnn #1#2#3#4 - { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4 { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - k - } + \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k } } \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4 - { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - K - } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_color_gray:n #1 - { - \use:x - { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } } - } -\cs_new_protected:Npn \__driver_draw_color_gray_aux:n #1 - { - \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } - } + { \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } } \cs_new_protected:Npn \driver_draw_fill_gray:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } } + { \__driver_draw_literal:n { #1 ~ g } } \cs_new_protected:Npn \driver_draw_stroke_gray:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } } + { \__driver_draw_literal:n { #1 ~ G } } \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3 { - \use:x - { - \__driver_draw_color_rgb_aux:nnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - } - } -\cs_new_protected:Npn \__driver_draw_color_rgb_aux:nnn #1#2#3 - { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3 - { - \__driver_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } } \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3 - { - \__driver_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \__driver_draw_literal:x { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ + #1 ~ #2 ~ #3 ~ #4 ~ \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~ cm } diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def index 384008e0540..ad402056269 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def @@ -6,7 +6,7 @@ %% %% l3drivers.dtx (with options: `package,dvips') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -22,12 +22,12 @@ \ProvidesExplFile {l3dvips.def}{2017/03/18}{} {L3 Experimental driver: dvips} -\cs_new_protected:Npn \__driver_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \__driver_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { \exp_args:NV \tl_if_head_is_space:nTF \current@color { @@ -37,31 +37,24 @@ \exp_after:wN \use:n \current@color \c_space_tl 1 } } - { \exp_after:wN \__driver_color_pickup_aux:w \current@color \q_stop #1 } + { \exp_after:wN \__driver_color_pickup:w \current@color \q_stop #1 } } - \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3 + \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3 { \tl_set:Nn #3 { #1 ~ #2 } } } { } } +\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4 + { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \__driver_color_select:n { gray~ #1 } } +\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3 + { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } } +\cs_new_protected:Npn \driver_color_spot:nn #1#2 + { \__driver_color_select:n { color~push~\c_space_tl #1 } } \cs_new_protected:Npn \__driver_color_select:n #1 - { - \tex_special:D - { - color~push~ - \cs_if_exist_use:cF - { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n } - { \use:n } - {#1} - } - } -\cs_generate_variant:Nn \__driver_color_select:n { V } -\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1} -\cs_new:Npn \__driver_color_convert_spot:n #1 - { \__driver_color_convert_spot:w #1 \q_stop } -\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop - { \c_space_tl #2 } -\cs_new_protected:Npn \__driver_color_reset: + { \tex_special:D { color~push~ #1 } } +\cs_new_protected:Npn \driver_color_reset: { \tex_special:D { color~pop } } \cs_new_protected:Npn \__driver_literal:n #1 { @@ -288,7 +281,7 @@ { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } } + { \__driver_draw_literal:n { #1 ~ setmiterlimit } } \cs_new_protected:Npn \driver_draw_cap_butt: { \__driver_draw_literal:n { 0 ~ setlinecap } } \cs_new_protected:Npn \driver_draw_cap_round: @@ -308,89 +301,49 @@ } \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4 { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - setcmykcolor ~ - } + \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor } \__driver_draw_color_reset: } \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4 { - \__driver_draw_literal:x - { - /l3fc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - setcmykcolor - } ~ - def - } + \__driver_draw_literal:n + { /l3fc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def } } \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4 { - \__driver_draw_literal:x - { - /l3sc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - setcmykcolor - } ~ - def - } + \__driver_draw_literal:n + { /l3sc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def } } \cs_new_protected:Npn \driver_draw_color_gray:n #1 { - \__driver_draw_literal:x { fp_eval:n {#1} ~ setgray } + \__driver_draw_literal:n { #1 ~ setgray } \__driver_draw_color_reset: } \cs_new_protected:Npn \driver_draw_fill_gray:n #1 - { \__driver_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } } + { \__driver_draw_literal:n { /l3fc ~ { #1 ~ setgray } ~ def } } \cs_new_protected:Npn \driver_draw_stroke_gray:n #1 - { \__driver_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } } + { \__driver_draw_literal:n { /l3sc ~ { #1 ~ setgray } ~ def } } \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3 { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ - setrgbcolor - } + \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ setrgbcolor } \__driver_draw_color_reset: } \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3 { - \__driver_draw_literal:x - { - /l3fc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ - setrgbcolor - } ~ - def - } + \__driver_draw_literal:n + { /l3fc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def } } \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3 { - \__driver_draw_literal:x - { - /l3sc ~ - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ - setrgbcolor - } ~ - def - } + \__driver_draw_literal:n + { /l3sc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def } } \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \__driver_draw_literal:x { [ - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ + #1 ~ #2 ~ #3 ~ #4 ~ \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~ ] ~ concat diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def index 89dfe25c2ab..0274ecdaea7 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def @@ -6,7 +6,7 @@ %% %% l3drivers.dtx (with options: `package,dvisvgm') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -22,12 +22,12 @@ \ProvidesExplFile {l3dvisvgm.def}{2017/03/18}{} {L3 Experimental driver: dvisvgm} -\cs_new_protected:Npn \__driver_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \__driver_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { \exp_args:NV \tl_if_head_is_space:nTF \current@color { @@ -37,31 +37,24 @@ \exp_after:wN \use:n \current@color \c_space_tl 1 } } - { \exp_after:wN \__driver_color_pickup_aux:w \current@color \q_stop #1 } + { \exp_after:wN \__driver_color_pickup:w \current@color \q_stop #1 } } - \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3 + \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3 { \tl_set:Nn #3 { #1 ~ #2 } } } { } } +\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4 + { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \__driver_color_select:n { gray~ #1 } } +\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3 + { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } } +\cs_new_protected:Npn \driver_color_spot:nn #1#2 + { \__driver_color_select:n { color~push~\c_space_tl #1 } } \cs_new_protected:Npn \__driver_color_select:n #1 - { - \tex_special:D - { - color~push~ - \cs_if_exist_use:cF - { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n } - { \use:n } - {#1} - } - } -\cs_generate_variant:Nn \__driver_color_select:n { V } -\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1} -\cs_new:Npn \__driver_color_convert_spot:n #1 - { \__driver_color_convert_spot:w #1 \q_stop } -\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop - { \c_space_tl #2 } -\cs_new_protected:Npn \__driver_color_reset: + { \tex_special:D { color~push~ #1 } } +\cs_new_protected:Npn \driver_color_reset: { \tex_special:D { color~pop } } \cs_new_protected:Npn \__driver_literal:n #1 { \tex_special:D { dvisvgm:raw~ #1 { ?nl } } } @@ -343,7 +336,7 @@ \cs_new_protected:Npn \driver_draw_linewidth:n #1 { \__driver_draw_scope:x { stroke-width=" \dim_to_decimal:n {#1} " } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \__driver_draw_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } } + { \__driver_draw_scope:x { stroke-miterlimit=" #1 " } } \cs_new_protected:Npn \driver_draw_cap_butt: { \__driver_draw_scope:n { stroke-linecap="butt" } } \cs_new_protected:Npn \driver_draw_cap_round: diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty b/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty index 7abf782a148..07f85a89444 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3expan,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3expan} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3file.sty b/Master/texmf-dist/tex/latex/l3kernel/l3file.sty index b911996ddd0..5a9b4dd8f12 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3file.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3file.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3file,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3file} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty b/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty index 8e67cfcd40c..329b88718cd 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3fp,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3fp} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3int.sty b/Master/texmf-dist/tex/latex/l3kernel/l3int.sty index 30f88f5264a..fe63078628d 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3int.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3int.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3int,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3int} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty b/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty index 163534d9220..99870da46cd 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3keys,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3keys} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty b/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty index 5e7846eb1d1..823be11785b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3msg,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3msg} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3names.sty b/Master/texmf-dist/tex/latex/l3kernel/l3names.sty index 626e8e776b0..4070330e1c1 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3names.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3names.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3names,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3names} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def index 6441a44a021..11e0b7afb70 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def @@ -6,7 +6,7 @@ %% %% l3drivers.dtx (with options: `package,pdfmode') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -22,17 +22,17 @@ \ProvidesExplFile {l3pdfmode.def}{2017/03/18}{} {L3 Experimental driver: PDF mode} -\cs_new_protected:Npn \__driver_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \__driver_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { - \exp_last_unbraced:Nx \__driver_color_pickup_aux:w + \exp_last_unbraced:Nx \__driver_color_pickup:w { \current@color } ~ 0 ~ 0 ~ 0 \q_stop #1 } - \cs_new_protected:Npn \__driver_color_pickup_aux:w + \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop #7 { \str_if_eq:nnTF {#2} { g } @@ -59,32 +59,22 @@ { } } \int_new:N \l__driver_color_stack_int +\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4 + { \__driver_color_select:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \__driver_color_select:n { #1 ~ g ~ #1 ~ G } } +\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3 + { \__driver_color_select:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } } +\cs_new_protected:Npn \driver_color_spot:nn #1#2 + { \__driver_color_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } } \cs_new_protected:Npx \__driver_color_select:n #1 { \cs_if_exist:NTF \luatex_pdfextension:D { \luatex_pdfextension:D colorstack } { \pdftex_pdfcolorstack:D } - \exp_not:N \l__driver_color_stack_int push - { - \exp_not:N \__driver_color_convert:w - #1 - \exp_not:N \q_stop - } - } -\cs_generate_variant:Nn \__driver_color_select:n { V } -\cs_new:Npn \__driver_color_convert:w #1 ~ #2 \q_stop - { \use:c { __driver_color_convert_ #1 :w } #2 \q_stop } -\cs_new:Npn \__driver_color_convert_gray:w #1 \q_stop - { #1 ~ g ~ #1 ~ G } -\cs_new:Npn \__driver_color_convert_cmyk:w #1 \q_stop - { #1 ~ k ~ #1 ~ K } -\cs_new:Npn \__driver_color_convert_rgb:w #1 \q_stop - { #1 ~ rg ~ #1 ~ RG } -\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 \q_stop - { - /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC + \exp_not:N \l__driver_color_stack_int push {#1} } -\cs_new_protected:Npx \__driver_color_reset: +\cs_new_protected:Npx \driver_color_reset: { \cs_if_exist:NTF \luatex_pdfextension:D { \luatex_pdfextension:D colorstack } @@ -323,7 +313,7 @@ { \dim_to_decimal_in_bp:n {#1} ~ w } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } } + { \__driver_draw_literal:x { #1 ~ M } } \cs_new_protected:Npn \driver_draw_cap_butt: { \__driver_draw_literal:n { 0 ~ J } } \cs_new_protected:Npn \driver_draw_cap_round: @@ -338,82 +328,35 @@ { \__driver_draw_literal:n { 2 ~ j } } \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4 { - \use:x - { - \__driver_draw_color_cmyk_aux:nnnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - { \fp_eval:n {#4} } - } - } -\cs_new_protected:Npn \__driver_draw_color_cmyk_aux:nnnn #1#2#3#4 - { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4 { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - k - } + \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k } } \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4 - { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - K - } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_color_gray:n #1 - { - \use:x - { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } } - } -\cs_new_protected:Npn \__driver_draw_color_gray_aux:n #1 - { - \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } - } + { \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } } \cs_new_protected:Npn \driver_draw_fill_gray:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } } + { \__driver_draw_literal:n { #1 ~ g } } \cs_new_protected:Npn \driver_draw_stroke_gray:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } } + { \__driver_draw_literal:n { #1 ~ G } } \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3 { - \use:x - { - \__driver_draw_color_rgb_aux:nnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - } - } -\cs_new_protected:Npn \__driver_draw_color_rgb_aux:nnn #1#2#3 - { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3 - { - \__driver_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } } \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3 - { - \__driver_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \__driver_draw_literal:x { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ + #1 ~ #2 ~ #3 ~ #4 ~ \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~ cm } diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty b/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty index bc6ffc38cf8..4c13ce414b5 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3prg,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3prg} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty b/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty index 28609aef962..2df08dc0dcd 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3prop,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3prop} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty b/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty index 1136c32252b..6c861dae9b2 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3quark,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3quark} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty b/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty index 0763c3c9365..163cac7b72b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3regex,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3regex} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty b/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty index 5f37ffd88fc..fa005ddd817 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3seq,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3seq} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty b/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty index f5fdce901ea..d92c579985a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3skip,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3skip} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty b/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty index bc8f4894f9b..c0b29d12b60 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3sort,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3sort} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3str.sty b/Master/texmf-dist/tex/latex/l3kernel/l3str.sty index 2c41ec36ed2..37a522d22b0 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3str,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3str} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty b/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty index 0c992d55880..77af8274a49 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3tl-analysis,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3tl-analysis} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty b/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty index b657fadce15..45819b53da9 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3tl-build,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3tl-build} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty b/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty index 13ae3bf734a..664667d568e 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3tl,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3tl} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3token.sty b/Master/texmf-dist/tex/latex/l3kernel/l3token.sty index 5ad017f1462..ec042d51175 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3token.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3token.sty @@ -6,7 +6,7 @@ %% %% l3oldmodules.dtx (with options: `l3token,oldmodules') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -18,7 +18,7 @@ %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% -%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project +%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project \def\old@liii@module@name {l3token} \ProvidesPackage\old@liii@module@name diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def index 0b0b7a183bb..a3448270a51 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def @@ -6,7 +6,7 @@ %% %% l3drivers.dtx (with options: `package,xdvipdfmx') %% -%% Copyright (C) 1990-2017 The LaTeX3 Project +%% 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 @@ -22,12 +22,12 @@ \ProvidesExplFile {l3xdvidpfmx.def}{2017/03/18}{} {L3 Experimental driver: xdvipdfmx} -\cs_new_protected:Npn \__driver_color_pickup:N #1 { } +\cs_new_protected:Npn \driver_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_set_protected:Npn \__driver_color_pickup:N #1 + \cs_set_protected:Npn \driver_color_pickup:N #1 { \exp_args:NV \tl_if_head_is_space:nTF \current@color { @@ -37,31 +37,24 @@ \exp_after:wN \use:n \current@color \c_space_tl 1 } } - { \exp_after:wN \__driver_color_pickup_aux:w \current@color \q_stop #1 } + { \exp_after:wN \__driver_color_pickup:w \current@color \q_stop #1 } } - \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3 + \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3 { \tl_set:Nn #3 { #1 ~ #2 } } } { } } +\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4 + { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } } +\cs_new_protected:Npn \driver_color_gray:n #1 + { \__driver_color_select:n { gray~ #1 } } +\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3 + { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } } +\cs_new_protected:Npn \driver_color_spot:nn #1#2 + { \__driver_color_select:n { color~push~\c_space_tl #1 } } \cs_new_protected:Npn \__driver_color_select:n #1 - { - \tex_special:D - { - color~push~ - \cs_if_exist_use:cF - { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n } - { \use:n } - {#1} - } - } -\cs_generate_variant:Nn \__driver_color_select:n { V } -\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1} -\cs_new:Npn \__driver_color_convert_spot:n #1 - { \__driver_color_convert_spot:w #1 \q_stop } -\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop - { \c_space_tl #2 } -\cs_new_protected:Npn \__driver_color_reset: + { \tex_special:D { color~push~ #1 } } +\cs_new_protected:Npn \driver_color_reset: { \tex_special:D { color~pop } } \cs_new_protected:Npn \__driver_literal:n #1 { \tex_special:D { pdf:literal~ #1 } } @@ -319,7 +312,7 @@ { \dim_to_decimal_in_bp:n {#1} ~ w } } \cs_new_protected:Npn \driver_draw_miterlimit:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } } + { \__driver_draw_literal:x { #1 ~ M } } \cs_new_protected:Npn \driver_draw_cap_butt: { \__driver_draw_literal:n { 0 ~ J } } \cs_new_protected:Npn \driver_draw_cap_round: @@ -334,82 +327,35 @@ { \__driver_draw_literal:n { 2 ~ j } } \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4 { - \use:x - { - \__driver_draw_color_cmyk_aux:nnnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - { \fp_eval:n {#4} } - } - } -\cs_new_protected:Npn \__driver_draw_color_cmyk_aux:nnnn #1#2#3#4 - { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4 { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - k - } + \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k } } \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4 - { - \__driver_draw_literal:x - { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ - K - } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } } \cs_new_protected:Npn \driver_draw_color_gray:n #1 - { - \use:x - { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } } - } -\cs_new_protected:Npn \__driver_draw_color_gray_aux:n #1 - { - \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } - } + { \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } } \cs_new_protected:Npn \driver_draw_fill_gray:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } } + { \__driver_draw_literal:n { #1 ~ g } } \cs_new_protected:Npn \driver_draw_stroke_gray:n #1 - { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } } + { \__driver_draw_literal:n { #1 ~ G } } \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3 { - \use:x - { - \__driver_draw_color_rgb_aux:nnn - { \fp_eval:n {#1} } - { \fp_eval:n {#2} } - { \fp_eval:n {#3} } - } - } -\cs_new_protected:Npn \__driver_draw_color_rgb_aux:nnn #1#2#3 - { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3 - { - \__driver_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } } \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3 - { - \__driver_draw_literal:x - { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG } - } + { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } } \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \__driver_draw_literal:x { - \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ - \fp_eval:n {#3} ~ \fp_eval:n {#4} ~ + #1 ~ #2 ~ #3 ~ #4 ~ \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~ cm } |