diff options
author | Karl Berry <karl@freefriends.org> | 2014-01-01 22:56:28 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2014-01-01 22:56:28 +0000 |
commit | 999dd6fa37bd291385b20ccf85f980eccfd2e683 (patch) | |
tree | 0556279ecc60a91218fc66f799180d9b30c6bf4a /Master/texmf-dist/source/latex/l3kernel | |
parent | 612e0aeaa3a96eceef8eb6e8de16fac2d6b4d8f0 (diff) |
l3 (1jan14)
git-svn-id: svn://tug.org/texlive/trunk@32537 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/l3kernel')
20 files changed, 1717 insertions, 1022 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 96631cf3ed0..56709098421 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -49,8 +49,8 @@ %<*driver|package> \def\ExplFileName{expl3} \def\ExplFileDescription{L3 Experimental code bundle wrapper} -\def\ExplFileDate{2013/11/19} -\def\ExplFileVersion{4610} +\def\ExplFileDate{2013/12/31} +\def\ExplFileVersion{4634} %</driver|package> %<*driver> \documentclass[full]{l3doc} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 22b8f3ccd5c..b0bb71b97f3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -119,7 +119,7 @@ % \end{macrocode} % \end{macro} % \end{macro} -\GetIdInfo$Id: l3bootstrap.dtx 4581 2013-07-28 08:38:50Z joseph $ +\GetIdInfo$Id: l3bootstrap.dtx 4629 2013-12-29 20:59:49Z joseph $ {L3 Bootstrap code} %</driver|package> %<*driver> @@ -167,11 +167,11 @@ % \cs{ExplSyntaxOn} \meta{code} \cs{ExplSyntaxOff} % \end{syntax} % The \cs{ExplSyntaxOn} function switches to a category code -% r{\'e}gime in which spaces are ignored and in which the colon (|:|) +% r\'{e}gime in which spaces are ignored and in which the colon (|:|) % and underscore (|_|) are treated as \enquote{letters}, thus allowing % access to the names of code functions and variables. Within this % environment, |~| is used to input a space. The \cs{ExplSyntaxOff} -% reverts to the document category code r{\'e}gime. +% reverts to the document category code r\'{e}gime. % \end{function} % % \begin{function}{\ProvidesExplPackage, \ProvidesExplClass, \ProvidesExplFile} @@ -424,7 +424,7 @@ \chardef\csname\detokenize{l__kernel_expl_bool}\endcsname = 0 \relax } \protected\edef\ExplSyntaxOn - { + {% \catcode 9 = 9 \relax \catcode 32 = 9 \relax \catcode 34 = 12 \relax diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index c31a0e478de..27baad8b08d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx @@ -36,7 +36,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3candidates.dtx 4602 2013-11-18 23:19:01Z bruno $ +\GetIdInfo$Id: l3candidates.dtx 4633 2013-12-31 17:28:46Z joseph $ {L3 Experimental additions to l3kernel} %</driver|package> %<*driver> @@ -456,6 +456,76 @@ % before being assigned to the \meta{floating point variable}. % \end{function} % +% \begin{function}[EXP]{\fp_function:Nw} +% \begin{syntax} +% \cs{fp_eval:n} +% ~~|{| +% ~~~~\cs{fp_function:Nw} \meta{function} +% ~~~~~~|(| \meta{fpexpr_1} |,| \ldots{} |,| \meta{fpexpr_n} |)| +% ~~|}| +% \end{syntax} +% Finds one or more arguments \meta{fpexpr_1} \ldots{} \meta{fpexpr_n} +% following the \meta{function}, and evaluate them. Then calls the +% \meta{function} followed by a single brace group containing +% \Arg{result_1} \ldots{} \Arg{result_n}. For instance, +% \begin{verbatim} +% \cs_new_nopar:Npn \mypkg_log:w +% { \fp_function:Nw \__mypkg_log:n } +% \cs_new:Npn \__mypkg_log:n #1 +% { +% \int_case:nnF { \tl_count:n {#1} } +% { +% { 1 } { \__mypkg_log_aux:nn #1 { 10 } } +% { 2 } { \__mypkg_log_aux:nn #1 } +% } +% { \ERROR \c_nan_fp } +% } +% \cs_new:Npn \__mypkg_log_aux:nn #1#2 { ln(#1) / ln(#2) } +% \fp_show:n { \mypkg_log:w (8, 2) + \mypkg_log:w (1e17) } +% \end{verbatim} +% shows $20 = \log_2(8) + \log(10^{17})$. The function |\mypkg_log:w| +% behaves like other built-in functions such as |ln|, but allows $1$ +% or~$2$ arguments, and computes either the base~$10$ logarithm or the +% logarithm of the first argument in a base given by the second +% argument. Checking the number of arguments is acheived by +% |\__mypkg_log:n|, which provides the default base~$10$ when there is +% only one argument. The computation itself is done by +% |\__mypkg_log_aux:nn|. +% \end{function} +% +% \begin{function}{\fp_new_function:Npn} +% \begin{syntax} +% \cs{fp_new_function:Npn} \meta{function} \meta{parameters} \Arg{code} +% \cs{fp_eval:n} |{| \meta{function} |(| \meta{fpexpr_1} |,| \ldots{} |,| \meta{fpexpr_n} |)| |}| +% \end{syntax} +% Defines the \meta{function} for use within floating point +% expressions, expecting some \meta{parameters}, and evaluating the +% \meta{code}, which must be expandable. When the \meta{function} +% appears in a floating point expression, arguments \meta{fpexpr_1}, +% \ldots{}, \meta{fpexpr_n} are found and evaluated in the same way as +% for built-in functions such as~|max|. If the number of arguments +% matches the number of \meta{parameters}, the arguments replace |#1|, +% \ldots{}, |#|$n$ in the \meta{code}, which is then evaluated to +% produce a floating point result. Otherwise, the result is +% \texttt{nan} after an error. The \meta{parameter text} must not +% contain delimited arguments, that is, it must be empty or one of +% |#1|, |#1#2|, |#1#2#3|, \ldots{} |#1#2#3#4#5#6#7#8#9|. The +% arguments replacing parameters in the \meta{code} are internal +% floating point numbers; operations such as |#1^2| thus correctly +% take into account the sign of~|#1|. For instance, +% \begin{verbatim} +% \fp_new_function:Npn \mypkg_sqrt:w #1 { #1^.5 } +% \fp_new_function:Npn \mypkg_veclen:w #1#2 +% { \mypkg_sqrt:w ( #1^2 + #2^2 ) } +% \fp_show:n { \mypkg_veclen:w ( 42 / 7 , 2 * 4 - 0 ) } +% \end{verbatim} +% shows~$10$. In the example, |\mypkg_veclen:w| receives the +% arguments $6=42/7$ and~$8=2\times 4-0$, thus expands to +% |\mypkg_sqrt:w ( 6^2 + 8^2 )|, then |\mypkg_sqrt:w| receives +% $100=6^2+8^2$ as an argument, and evaluates the square root $10 = +% 100^{0.5}$. +% \end{function} +% % \section{Additions to \pkg{l3prop}} % % \begin{function}[rEXP] @@ -2160,9 +2230,8 @@ % key \cs{q_recursion_tail}, which cannot appear in normal keys since % those are strings. The odd construction |\use:n {#1}| allows |#1| % to contain any token without interfering with \cs{prop_map_break:}. -% Argument |#2| of \cs{@@_map_tokens:nwwn} is empty, with two -% exceptions: it is \cs{s_@@} the first time and \cs{s_obj_end} the -% last. +% Argument |#2| of \cs{@@_map_tokens:nwwn} is \cs{s_@@} the first +% time, and is otherwise empty. % \begin{macrocode} \cs_new:Npn \prop_map_tokens:Nn #1#2 { @@ -2226,8 +2295,9 @@ % then the stop code |{ ? \__prg_break: } { }| will be used by the auxiliary, % terminating the loop and returning nothing at all. % \begin{macrocode} -\cs_new:Npn \seq_item:Nn #1 { \exp_after:wN \@@_item:wNn #1 #1 } -\cs_new:Npn \@@_item:wNn \s_@@ #1 \s_obj_end #2#3 +\cs_new:Npn \seq_item:Nn #1 + { \exp_after:wN \@@_item:wNn #1 \q_stop #1 } +\cs_new:Npn \@@_item:wNn \s_@@ #1 \q_stop #2#3 { \exp_args:Nf \@@_item:nnn { @@ -2260,31 +2330,31 @@ % \seq_mapthread_function:cNN, \seq_mapthread_function:ccN % } % \begin{macro}[aux] -% {\@@_mapthread_function:wNN, \@@_mapthread_function:wNw} -% \begin{macro}[aux]{\@@_mapthread_function:Nnnwnn} -% The idea here is to first expand both of the sequences, adding the +% {\@@_mapthread_function:NNw, \@@_mapthread_function:Nnnwnn} +% The idea here is to first expand both sequences, adding the % usual |{ ? \__prg_break: } { }| to the end of each one. This is % most conveniently done in two steps using an auxiliary function. % The mapping then throws away the first tokens of |#2| and |#5|, -% which for items in the sequences will both be \cs{s_@@} +% which for items in the sequences will both be % \cs{@@_item:n}. The function to be mapped will then be applied to % the two entries. When the code hits the end of one of the -% sequences, the break material will stop the entire loop and tidy up. -% This avoids needing to find the count of the two sequences, or +% sequences, \cs{__prg_break:} stops the entire loop and tidy up. +% This avoids needing to count items in the sequences, or % worrying about which is longer. % \begin{macrocode} \cs_new:Npn \seq_mapthread_function:NNN #1#2#3 - { \exp_after:wN \@@_mapthread_function:wNN #2 #1 #3 } -\cs_new:Npn \@@_mapthread_function:wNN \s_@@ #1 \s_obj_end #2#3 { - \exp_after:wN \@@_mapthread_function:wNw #2 #3 - #1 { ? \__prg_break: } { } + \exp_after:wN \@@_mapthread_function:NNw + \exp_after:wN #3 + \exp_after:wN #1 + #2 { ? \__prg_break: } { } \__prg_break_point: } -\cs_new:Npn \@@_mapthread_function:wNw \s_@@ #1 \s_obj_end #2 +\cs_new:Npn \@@_mapthread_function:NNw #1#2 { - \@@_mapthread_function:Nnnwnn #2 - #1 { ? \__prg_break: } { } + \exp_after:wN \@@_mapthread_function:Nnnwnn + \exp_after:wN #1 + #2 { ? \__prg_break: } { } \q_stop } \cs_new:Npn \@@_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6 @@ -2299,7 +2369,6 @@ % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro} % { @@ -2319,22 +2388,22 @@ \cs_new_protected:Npn \seq_set_from_clist:NN #1#2 { \tl_set:Nx #1 - { \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n \s_obj_end } + { \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n } } \cs_new_protected:Npn \seq_set_from_clist:Nn #1#2 { \tl_set:Nx #1 - { \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n \s_obj_end } + { \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n } } \cs_new_protected:Npn \seq_gset_from_clist:NN #1#2 { \tl_gset:Nx #1 - { \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n \s_obj_end } + { \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n } } \cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2 { \tl_gset:Nx #1 - { \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n \s_obj_end } + { \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n } } \cs_generate_variant:Nn \seq_set_from_clist:NN { Nc } \cs_generate_variant:Nn \seq_set_from_clist:NN { c , cc } @@ -2348,9 +2417,8 @@ % % \begin{macro} % {\seq_reverse:N, \seq_reverse:c, \seq_greverse:N, \seq_greverse:c} -% \begin{macro}[aux]{\@@_tmp:w} % \begin{macro}[aux]{\@@_reverse:NN} -% \begin{macro}[aux]{\@@_reverse_setup:w, \@@_reverse_item:nwn} +% \begin{macro}[aux, EXP]{\@@_reverse_item:nwn} % Previously, \cs{seq_reverse:N} was coded by collecting the items % in reverse order after an \cs{exp_stop_f:} marker. % \begin{verbatim} @@ -2383,7 +2451,6 @@ % of \cs{exp_not:n}. The previous calls are cleanly removed % from the stack, and the memory consumption becomes linear. % \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_tmp:w { } \cs_new_protected_nopar:Npn \seq_reverse:N { \@@_reverse:NN \tl_set:Nx } \cs_new_protected_nopar:Npn \seq_greverse:N @@ -2392,11 +2459,9 @@ { \cs_set_eq:NN \@@_tmp:w \@@_item:n \cs_set_eq:NN \@@_item:n \@@_reverse_item:nwn - #1 #2 { \exp_after:wN \@@_reverse_setup:w #2 } + #1 #2 { #2 \exp_not:n { } } \cs_set_eq:NN \@@_item:n \@@_tmp:w } -\cs_new:Npn \@@_reverse_setup:w #1 \s_obj_end - { #1 \exp_not:n { } \s_obj_end } \cs_new:Npn \@@_reverse_item:nwn #1 #2 \exp_not:n #3 { #2 @@ -2408,7 +2473,6 @@ % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}{\seq_set_filter:NNn, \seq_gset_filter:NNn} % \begin{macro}[aux]{\@@_set_filter:NNNn} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index e6369d38bb5..7197d72e18f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -36,7 +36,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3coffins.dtx 4212 2012-09-09 12:24:04Z bruno $ +\GetIdInfo$Id: l3coffins.dtx 4624 2013-12-14 13:58:48Z bruno $ {L3 Coffin code layer} %</driver|package> %<*driver> @@ -1007,7 +1007,7 @@ { \dim_compare:nNnTF {#8} = \c_zero_dim { - \dim_set:Nn \l_@@_x_dim {#6} + \dim_set:Nn \l_@@_y_dim {#6} \@@_calculate_intersection_aux:nnnnnN {#6} {#2} {#1} {#4} {#3} \l_@@_x_dim } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx index 46426e18186..5eb91ddc2cb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx @@ -36,7 +36,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3drivers.dtx 4602 2013-11-18 23:19:01Z bruno $ +\GetIdInfo$Id: l3drivers.dtx 4632 2013-12-31 17:09:37Z joseph $ {L3 Experimental drivers} %</driver|package> %<*driver> @@ -103,7 +103,7 @@ % % \section{Box rotation and scaling} % -% \begin{function}[added = 2011-09-01, updated = 2012-05-18] +% \begin{function}[added = 2011-09-01, updated = 2013-12-27] % {\__driver_box_rotate_begin:, \__driver_box_rotate_end:} % \begin{syntax} % \cs{__driver_box_rotate_begin:} @@ -119,7 +119,7 @@ % required by some drivers to obtain the correct output. % \end{function} % -% \begin{function}[added = 2011-09-02, updated = 2012-05-18] +% \begin{function}[added = 2011-09-02, updated = 2013-12-27] % {\__driver_box_scale_begin:, \__driver_box_scale_end:} % \begin{syntax} % \cs{__driver_box_scale_begin:} @@ -135,7 +135,7 @@ % to scale factors. % \end{function} % -% \section{Colour support} +% \section{Color support} % % \begin{function}[added = 2011-09-03, updated = 2012-05-18] % {\__driver_color_ensure_current:} @@ -187,7 +187,7 @@ % % If the driver loaded is \texttt{pdfmode} then direct PDF output is required. % (This may of course alter: it might be that the driver is picked based on the -% value of \cs{pdfmode_pdfoutput:D}.) +% value of \cs{pdftex_pdfoutput:D}.) % \begin{macrocode} %<*initex> %<*pdfmode> @@ -215,26 +215,26 @@ % \end{macrocode} % % \subsection{Driver utility functions} -% -% \begin{macro}{\@@_graphic_state_save:, \@@_graphic_state_restore:} +% +% \begin{macro}{\@@_state_save:, \@@_state_restore:} % All of the drivers have a stack for saving the graphic state. These % have slightly different interfaces. For both \texttt{dvips} and % \texttt{(x)dvipdfmx} this is done using an appropriate special. % \begin{macrocode} %<*!pdfmode> -\cs_new_protected_nopar:Npn \@@_graphic_state_save: +\cs_new_protected_nopar:Npn \@@_state_save: %<*dvips> { \tex_special:D { ps:gsave } } %</dvips> %<*dvipdfmx|xdvipdfmx> - { \tex_special:D { pdf:content~q } } + { \tex_special:D { pdf:bcontent } } %</dvipdfmx|xdvipdfmx> -\cs_new_protected_nopar:Npn \@@_graphic_state_restore: +\cs_new_protected_nopar:Npn \@@_state_restore: %<*dvips> { \tex_special:D { ps:grestore } } %</dvips> %<*dvipdfmx|xdvipdfmx> - { \tex_special:D { pdf:content~Q } } + { \tex_special:D { pdf:econtent } } %</dvipdfmx|xdvipdfmx> %</!pdfmode> % \end{macrocode} @@ -245,56 +245,67 @@ %<*pdfmode> \cs_if_exist:NTF \pdftex_pdfsave:D { - \cs_new_eq:NN \@@_graphic_state_save: \pdftex_pdfsave:D - \cs_new_eq:NN \@@_graphic_state_restore: \pdftex_pdfrestore:D + \cs_new_eq:NN \@@_state_save: \pdftex_pdfsave:D + \cs_new_eq:NN \@@_state_restore: \pdftex_pdfrestore:D } { - \cs_new_protected_nopar:Npn \@@_graphic_state_save: + \cs_new_protected_nopar:Npn \@@_state_save: { \pdftex_pdfliteral:D { q } } - \cs_new_protected_nopar:Npn \@@_graphic_state_restore: + \cs_new_protected_nopar:Npn \@@_state_restore: { \pdftex_pdfliteral:D { Q } } } %</pdfmode> % \end{macrocode} % \end{macro} -% -% \begin{macro}{\@@_pdf_literal:n, \@@_pdf_literal_direct:n} -% Both direct PDF mode and \texttt{xdvipdfmx} make use of direct PDF -% special insertion. These are slightly different in the two cases. -% The |direct| versions do not save the current matrix. +% +% \begin{macro}[int]{\@@_literal:n} +% The driver code needs to pass on a lot of \enquote{raw} information to +% the underlying binary. The exact command is driver-dependent but the +% concept is general enough to use a single function. However, it is +% important to remember this is a convenient shortcut: the arguments will +% be driver-specific. % \begin{macrocode} -%<*!dvips> -\cs_new_protected:Npn \@@_pdf_literal:n #1 -%<*pdfmode> - { \pdftex_pdfliteral:D {#1} } -%</pdfmode> +\cs_new_protected:Npn \@@_literal:n #1 %<*dvipdfmx|xdvipdfmx> - { \tex_special:D { pdf:content~ #1 } } + { \tex_special:D { pdf:literal~ #1 } } %</dvipdfmx|xdvipdfmx> -\cs_new_protected:Npn \@@_pdf_literal_direct:n #1 +%<*dvips> + { \tex_special:D { ps: #1 } } +%</dvips> %<*pdfmode> - { \pdftex_pdfliteral:D direct~{#1} } + { \pdftex_pdfliteral:D {#1} } %</pdfmode> -%<*dvipdfmx|xdvipdfmx> - { \tex_special:D { pdf:literal~direct~ #1 } } -%</dvipdfmx|xdvipdfmx> -%</!dvips> % \end{macrocode} % \end{macro} -% -% \begin{macro}{\@@_ps_literal:n} -% The same concept for PostScript: these are \enquote{direct} by default, -% but by keeping the same name life should be a little clearer. +% +% \begin{macro}[int]{\@@_matrix:n} +% Here the appropriate function is set up to insert an affine matrix +% into the PDF. With a new enough \pdfTeX{} (version~1.40.0 or later) +% there is a primitive for this, which only needs the rotation/scaling/skew +% part. With an older \pdfTeX{} or with \texttt{(x)dvipdfmx} the matrix +% also has to include a translation part: that is always zero and so is +% built in here. % \begin{macrocode} -%<*dvips> -\cs_new_protected:Npn \@@_ps_literal:n #1 - { \tex_special:D { ps: #1 } } -%</dvips> +%<*pdfmode> +\cs_if_exist:NTF \pdftex_pdfsetmatrix:D + { + \cs_new_protected:Npn \@@_matrix:n #1 + { \pdftex_pdfsetmatrix:D {#1} } + } + { + \cs_new_protected:Npn \@@_matrix:n #1 + { \@@_literal:n { #1 \c_space_tl 0~0~cm } } + } +%</pdfmode> +%<*dvipdfmx|xdvipdfmx> +\cs_new_protected:Npn \@@_matrix:n #1 + { \@@_literal:n { direct~ #1 \c_space_tl 0~0~cm } } +%</dvipdfmx|xdvipdfmx> % \end{macrocode} % \end{macro} % % \subsection{Box clipping} -% +% % \begin{macro}{\@@_box_use_clip:N} % The overall logic to clipping a box is the same in all cases. The general % method is to save the current location, define a clipping path equivalent @@ -307,27 +318,15 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_box_use_clip:N #1 { - \@@_graphic_state_save: -% \end{macrocode} -% The business end of the code sets up the clip box, using the higher-level -% rectangle operators rather than the lower level direct line drawing. This -% makes sense for a simple rectangular clip. There are a couple of approaches -% for \texttt{dvips}. The approach here is to save the current matrix, -% then translate to the current \TeX{} position and switch to big point -% measurement. The clip box can then be set up using the same conversion -% as for direct PDF output: notice that here the $y$-axis is upside down. -% The original matrix is then restored, so that \TeX{} inserts material -% in the correct place (there is an offset between the PostScript and -% \TeX{} current positions). -% \begin{macrocode} %<*dvips> - \@@_ps_literal:n + \@@_state_save: + \@@_literal:n { /savedmatrix~matrix~currentmatrix~def~ currentpoint~translate~ Resolution~72~div~VResolution~72~div~scale } - \@@_ps_literal:n + \@@_literal:n { 0~ \__dim_strip_bp:n { \box_dp:N #1 } ~ @@ -335,23 +334,34 @@ \__dim_strip_bp:n { - \box_ht:N #1 - \box_dp:N #1 } ~ rectclip } - \@@_ps_literal:n { savedmatrix~setmatrix } + \@@_literal:n { savedmatrix~setmatrix } %</dvips> % \end{macrocode} % The PDF box is easier to define as it is automatically in big points and % as the driver deals with the relationship between the \TeX{} and graphics -% locations automatically. +% locations automatically. The only slight issue is the need to handle +% \texttt{(x)dvipdfmx}'s requirements for mixing PostScript and PDF code: +% using the standard save/restore stack here fails. % \begin{macrocode} -%<*!dvips> - \@@_pdf_literal_direct:n +%<*dvipdfmx|xdvipdfmx> + \@@_literal:n { q } +%</dvipdfmx|xdvipdfmx> +%<*pdfmode> + \@@_state_save: +%</pdfmode> +%<*dvipdfmx|pdfmode|xdvipdfmx> + \@@_literal:n { - 0 ~ +%<*dvipdfmx|xdvipdfmx> + direct~ +%</dvipdfmx|xdvipdfmx> + 0~ \__dim_strip_bp:n { - \box_dp:N #1 } ~ \__dim_strip_bp:n { \box_wd:N #1 } ~ \__dim_strip_bp:n { \box_ht:N #1 + \box_dp:N #1 } ~ re~W~n } -%</!dvips> +%</dvipdfmx|pdfmode|xdvipdfmx> % \end{macrocode} % For \texttt{(x)dvipdfmx} the is a bit more to do yet. Using % \texttt{pdf:bcontent}/\texttt{pdf:econtent} for scoping seems the easiest @@ -367,9 +377,9 @@ % then the extra scope is closed (below). % \begin{macrocode} %<*dvipdfmx|xdvipdfmx> - \@@_pdf_matrix:n { -1~0~0~-1 } - \@@_graphic_state_save: - \@@_pdf_matrix:n { -1~0~0~-1 } + \@@_matrix:n { -1~0~0~-1 } + \@@_literal:n { q } + \@@_matrix:n { -1~0~0~-1 } %</dvipdfmx|xdvipdfmx> % \end{macrocode} % Insert the material in a box of no width, restore the graphic state @@ -377,9 +387,12 @@ % \begin{macrocode} \hbox_overlap_right:n { \box_use:N #1 } %<*dvipdfmx|xdvipdfmx> - \@@_graphic_state_restore: + \@@_literal:n { Q } + \@@_literal:n { Q } %</dvipdfmx|xdvipdfmx> - \@@_graphic_state_restore: +%<*dvips|pdfmode> + \@@_state_restore: +%</dvips|pdfmode> \skip_horizontal:n { \box_wd:N #1 } } % \end{macrocode} @@ -390,7 +403,7 @@ % \begin{macro}{\@@_box_rotate_begin:, \@@_box_rotate_end:} % The driver for \texttt{dvips} works with a simple rotation angle. % In PDF mode, an affine matrix is used instead. The transformation for -% \texttt{xdvipdfmx} can be done either way: to have some code sharing, +% \texttt{(x)dvipdfmx} can be done either way: to have some code sharing, % the choice here is to use an affine approach (at least some code is % shared in this way). For the \texttt{dvips}, that odd-looking % |currentpoint| at the beginning is used to put this data onto the @@ -408,27 +421,14 @@ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_box_rotate_begin: { - \@@_graphic_state_save: -%<*dvips> - \fp_set:Nn \l__box_angle_fp { round ( \l__box_angle_fp , 5 ) } - \@@_ps_literal:n - { - currentpoint~ - currentpoint~translate~ - \fp_compare:nNnTF \l__box_angle_fp = \c_zero_fp - { 0 } - { \fp_eval:n { - \l__box_angle_fp } } - \c_space_tl rotate~ - neg~exch~neg~exch~translate - } -%</dvips> -%<*!dvips> + \@@_state_save: +%<*dvipdfmx|pdfmode|xdvipdfmx> \box_set_wd:Nn \l__box_internal_box \c_zero_dim \fp_set:Nn \l__box_cos_fp { round ( \l__box_cos_fp , 5 ) } \fp_compare:nNnT \l__box_cos_fp = \c_zero_fp { \fp_zero:N \l__box_cos_fp } \fp_set:Nn \l__box_sin_fp { round ( \l__box_sin_fp , 5 ) } - \@@_pdf_matrix:n + \@@_matrix:n { \fp_use:N \l__box_cos_fp \c_space_tl \fp_compare:nNnTF \l__box_sin_fp = \c_zero_fp @@ -441,26 +441,40 @@ \c_space_tl \fp_use:N \l__box_cos_fp } -%</!dvips> +%</dvipdfmx|pdfmode|xdvipdfmx> +%<*dvips> + \fp_set:Nn \l__box_angle_fp { round ( \l__box_angle_fp , 5 ) } + \@@_literal:n + { + currentpoint~ + currentpoint~translate~ + \fp_compare:nNnTF \l__box_angle_fp = \c_zero_fp + { 0 } + { \fp_eval:n { - \l__box_angle_fp } } + \c_space_tl rotate~ + neg~exch~neg~exch~translate + } +%</dvips> } % \end{macrocode} +% \end{macro} % The end of a rotation means tidying up the output grouping. % \begin{macrocode} -\cs_new_eq:NN \@@_box_rotate_end: \@@_graphic_state_restore: +\cs_new_eq:NN \@@_box_rotate_end: \@@_state_restore: % \end{macrocode} % \end{macro} -% +% % \begin{macro}{\@@_box_scale_begin:, \@@_box_scale_end:} % Scaling is not dissimilar to rotation, but the calculations are somewhat % less complex. % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_box_scale_begin: { + \@@_state_save: \fp_set:Nn \l__box_scale_x_fp { round ( \l__box_scale_x_fp , 5 ) } \fp_set:Nn \l__box_scale_y_fp { round ( \l__box_scale_y_fp , 5 ) } - \@@_graphic_state_save: %<*dvips> - \@@_ps_literal:n + \@@_literal:n { currentpoint~ currentpoint~translate~ @@ -469,67 +483,41 @@ neg~exch~neg~exch~translate } %</dvips> -%<*!dvips> - \@@_pdf_matrix:n +%<*dvipdfmx|pdfmode|xdvipdfmx> + \@@_matrix:n { \fp_use:N \l__box_scale_x_fp \c_space_tl 0~0~ \fp_use:N \l__box_scale_y_fp } -%</!dvips> +%</dvipdfmx|pdfmode|xdvipdfmx> } -\cs_new_eq:NN \@@_box_scale_end: \@@_graphic_state_restore: -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_pdf_matrix:n} -% Here the appropriate function is set up to insert an affine matrix -% into the PDF. With a new enough \pdfTeX{} (version~1.40.0 or later) -% there is a primitive for this, which only needs the rotation/scaling/skew -% part. With an older \pdfTeX{} or with \texttt{xdvipdfmx} the matrix -% also has to include a translation part: that is always zero and so is -% built in here. -% \begin{macrocode} -%<*pdfmode> -\cs_if_exist:NTF \pdftex_pdfsetmatrix:D - { - \cs_new_protected:Npn \@@_pdf_matrix:n #1 - { \pdftex_pdfsetmatrix:D {#1} } - } - { - \cs_new_protected:Npn \@@_pdf_matrix:n #1 - { \@@_pdf_literal:n { #1 \c_space_tl 0~0~cm } } - } -%</pdfmode> -%<*dvipdfmx|xdvipdfmx> -\cs_new_protected:Npn \@@_pdf_matrix:n #1 - { \@@_pdf_literal_direct:n { #1 \c_space_tl 0~0~cm } } -%</dvipdfmx|xdvipdfmx> +\cs_new_eq:NN \@@_box_scale_end: \@@_state_restore: % \end{macrocode} % \end{macro} % -% \subsection{Colour support} +% \subsection{Color support} % % \begin{variable}{\l_@@_current_color_tl} % The current color is needed by all of the engines, but the way this % is stored varies. % \begin{macrocode} \tl_new:N \l_@@_current_color_tl +%<*dvipdfmx|xdvipdfmx> +\tl_set:Nn \l_@@_current_color_tl { gray~0 } +%</dvipdfmx|xdvipdfmx> %<*dvips> \tl_set:Nn \l_@@_current_color_tl { Black } %</dvips> %<*pdfmode> \tl_set:Nn \l_@@_current_color_tl { 0~g~0~G } %</pdfmode> -%<*dvipdfmx|xdvipdfmx> -\tl_set:Nn \l_@@_current_color_tl { gray~0 } -%</dvipdfmx|xdvipdfmx> -% \end{macrocode} +%% \end{macrocode} % \end{variable} % % \begin{variable}{\l_@@_color_stack_int} % \pdfTeX{} (version~1.40.0 or later) and \LuaTeX{} have multiple stacks -% available, and the color stack therefore needs a number. +% available, and the color stack therefore needs a number when in PDF mode. % \begin{macrocode} %<*pdfmode> \int_new:N \l_@@_color_stack_int @@ -543,7 +531,7 @@ % available. In all cases there is a need to reset the color after % the current group. % \begin{macrocode} -%<*!pdfmode> +%<*dvipdfmx|dvips|xdvipdfmx> \cs_new_protected_nopar:Npn \@@_color_ensure_current: { \tex_special:D { color~push~\l_@@_current_color_tl } @@ -551,7 +539,7 @@ } \cs_new_protected_nopar:Npn \@@_color_reset: { \tex_special:D { color~pop } } -%</!pdfmode> +%</dvipdfmx|dvips|xdvipdfmx> % \end{macrocode} % Once again there is a version switch for \pdfTeX{}, as the % \tn{pdfcolorstack} primitive was introduced in version~1.40.0. @@ -571,11 +559,11 @@ { \cs_new_protected_nopar:Npn \@@_color_ensure_current: { - \@@_pdf_literal:n { \l_@@_current_color_tl } + \@@_literal:n { \l_@@_current_color_tl } \group_insert_after:N \@@_color_reset: } \cs_new_protected_nopar:Npn \@@_color_reset: - { \@@_pdf_literal:n { \l_@@_current_color_tl } } + { \@@_literal:n { \l_@@_current_color_tl } } } %</pdfmode> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index ee40577fbe8..03708beff6f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-aux.dtx 4601 2013-11-18 23:13:28Z bruno $ +\GetIdInfo$Id: l3fp-aux.dtx 4622 2013-12-14 13:05:45Z bruno $ {L3 Floating-point support functions} \documentclass[full]{l3doc} \begin{document} @@ -211,7 +211,6 @@ % (typically digits). % \begin{macrocode} \cs_new:Npn \@@_use_s:n #1 { #1; } -\cs_new:Npn \@@_use_braced_s:n #1 { {#1} ; } \cs_new:Npn \@@_use_s:nn #1#2 { #1#2; } % \end{macrocode} % \end{macro} @@ -244,11 +243,12 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[int, EXP]{\@@_use_i:ww} +% \begin{macro}[int, EXP]{\@@_use_i:ww, \@@_use_i:www} % Many internal functions take arguments delimited by semicolons, and -% it is occasionally useful to remove one such argument. +% it is occasionally useful to remove one or two such arguments. % \begin{macrocode} \cs_new:Npn \@@_use_i:ww #1; #2; { #1; } +\cs_new:Npn \@@_use_i:www #1; #2; #3; { #1; } % \end{macrocode} % \end{macro} % @@ -591,7 +591,7 @@ % provide different sets of packing functions and shifts, depending on % ranges of input. % -% \begin{macro}[int, EXP]{\@@_pack:NNNNNw, \@@_pack:NNNNNwn} +% \begin{macro}[int, EXP]{\@@_pack:NNNNNw} % \begin{variable}[int] % { % \c_@@_trailing_shift_int , @@ -600,20 +600,17 @@ % } % This set of shifts allows for computations involving results in the % range $[-4\cdot 10^{8}, 5\cdot 10^{8}-1]$. Shifted values all have -% exactly $9$ digits. The \cs{@@_pack:NNNNNwn} function brings a -% braced \meta{continuation} up through the levels of expansion. +% exactly $9$ digits. % \begin{macrocode} \int_const:Nn \c_@@_leading_shift_int { - 5 0000 } \int_const:Nn \c_@@_middle_shift_int { 5 0000 * 9999 } \int_const:Nn \c_@@_trailing_shift_int { 5 0000 * 10000 } \cs_new:Npn \@@_pack:NNNNNw #1 #2#3#4#5 #6; { + #1#2#3#4#5 ; {#6} } -\cs_new:Npn \@@_pack:NNNNNwn #1 #2#3#4#5 #6; #7 - { + #1#2#3#4#5 ; {#7} {#6} } % \end{macrocode} % \end{variable} % \end{macro} % -% \begin{macro}[int, EXP]{\@@_pack_big:NNNNNNw, \@@_pack_big:NNNNNNwn} +% \begin{macro}[int, EXP]{\@@_pack_big:NNNNNNw} % \begin{variable}[int] % { % \c_@@_big_trailing_shift_int , @@ -632,8 +629,6 @@ \int_const:Nn \c_@@_big_trailing_shift_int { 15 2374 * 10000 } \cs_new:Npn \@@_pack_big:NNNNNNw #1#2 #3#4#5#6 #7; { + #1#2#3#4#5#6 ; {#7} } -\cs_new:Npn \@@_pack_big:NNNNNNwn #1#2 #3#4#5#6 #7; #8 - { + #1#2#3#4#5#6 ; {#8} {#7} } % \end{macrocode} % \end{variable} % \end{macro} @@ -949,9 +944,9 @@ % \@@_small_int_normal:NnwTF, % \@@_small_int_test:NnnwNTF % } -% This function tests if its floating point argument is an integer in -% the range $[-99999999,99999999]$. If it is, the result of the -% conversion is fed as a braced argument to the \meta{true code}. +% Tests if the floating point argument is an integer or $\pm\infty$. +% If so, it is converted to an integer in the range $[-10^{8},10^{8}]$ +% and fed as a braced argument to the \meta{true code}. % Otherwise, the \meta{false code} is performed. First filter special % cases: neither \texttt{nan} nor infinities are integers. Normal % numbers with a non-positive exponent are never integers. When the @@ -967,38 +962,45 @@ % coming from \cs{@@_small_int_normal:NnwTF}, hence will call the % \cs{use_iii:nnn} which follows, taking the false branch. % \begin{macrocode} -\cs_new:Npn \@@_small_int:wTF \s_@@ \@@_chk:w #1 +\cs_new:Npn \@@_small_int:wTF \s_@@ \@@_chk:w #1#2 { \if_case:w #1 \exp_stop_f: \@@_case_return:nw { \@@_small_int_true:wTF 0 ; } \or: \exp_after:wN \@@_small_int_normal:NnwTF + \or: + \@@_case_return:nw + { + \exp_after:wN \@@_small_int_true:wTF \__int_value:w + \if_meaning:w 2 #2 - \fi: 1 0000 0000 ; + } \else: \@@_case_return:nw \use_ii:nn \fi: + #2 } \cs_new:Npn \@@_small_int_true:wTF #1; #2#3 { #2 {#1} } \cs_new:Npn \@@_small_int_normal:NnwTF #1#2#3; { \if_int_compare:w #2 > \c_zero - \if_int_compare:w #2 > \c_eight - \exp_after:wN \exp_after:wN - \exp_after:wN \use_iii:nnn - \else: - \@@_decimate:nNnnnn { \c_sixteen - #2 } - \@@_small_int_test:NnnwNTF - #3 #1 - \fi: + \@@_decimate:nNnnnn { \c_sixteen - #2 } + \@@_small_int_test:NnnwNnw + #3 #1 {#2} \else: \exp_after:wN \use_iii:nnn \fi: ; } -\cs_new:Npn \@@_small_int_test:NnnwNTF #1#2#3#4; #5 +\cs_new:Npn \@@_small_int_test:NnnwNnw #1#2#3#4; #5#6 { \if_meaning:w 0 #1 \exp_after:wN \@@_small_int_true:wTF - \__int_value:w \if_meaning:w 2 #5 - \fi: #3 + \__int_value:w \if_meaning:w 2 #5 - \fi: + \if_int_compare:w #6 > \c_eight + 1 0000 0000 + \else: + #3 + \fi: \else: - \exp_after:wN \use_i:nn + \use_i:nn \fi: } % \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 104a118ca3b..d5ddae31ab0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-basics.dtx 4601 2013-11-18 23:13:28Z bruno $ +\GetIdInfo$Id: l3fp-basics.dtx 4619 2013-12-14 12:53:54Z bruno $ {L3 Floating-point arithmetic} \documentclass[full]{l3doc} \begin{document} @@ -107,12 +107,7 @@ % |{0000}|. % \begin{macrocode} \cs_new:Npn \@@_basics_pack_low:NNNNNw #1 #2#3#4#5 #6; - { - \if_meaning:w 2 #1 - + \c_one - \fi: - ; {#2#3#4#5} {#6} ; - } + { + #1 - \c_one ; {#2#3#4#5} {#6} ; } \cs_new:Npn \@@_basics_pack_high:NNNNNw #1 #2#3#4#5 #6; { \if_meaning:w 2 #1 @@ -1599,7 +1594,495 @@ % \end{macrocode} % \end{macro} % -% \subsection{Unary operations} +% \subsection{Square root} +% +% \begin{macro}[int, EXP]{\@@_sqrt_o:w} +% Zeros are unchanged: $\sqrt{-0} = -0$ and $\sqrt{+0} = +0$. +% Negative numbers (other than $-0$) have no real square root. +% Positive infinity, and \texttt{nan}, are unchanged. Finally, for +% normal positive numbers, there is some work to do. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_o:w #1 \s_@@ \@@_chk:w #2#3#4; @ + { + \if_meaning:w 0 #2 \@@_case_return_same_o:w \fi: + \if_meaning:w 2 #3 + \@@_case_use:nw { \@@_invalid_operation_o:nw { sqrt } } + \fi: + \if_meaning:w 1 #2 \else: \@@_case_return_same_o:w \fi: + \@@_sqrt_npos_o:w + \s_@@ \@@_chk:w #2 #3 #4; + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, EXP]{\@@_sqrt_npos_o:w} +% \begin{macro}[aux, rEXP] +% {\@@_sqrt_npos_auxi_o:wwnnN, \@@_sqrt_npos_auxii_o:wNNNNNNNN} +% Prepare \cs{@@_sanitize:Nw} to receive the final sign~|0| (the +% result is always positive) and the exponent, equal to half of the +% exponent~|#1| of the argument. If the exponent~|#1| is even, find a +% first approximation of the square root of the significand $10^{8} +% a_1 + a_2 = 10^{8} |#2#3| + |#4#5|$ through Newton's method, +% starting at $x = 57234133 \simeq 10^{7.75}$. Otherwise, first shift +% the significand of of the argument by one digit, getting +% $a_1'\in[10^{6}, 10^{7})$ instead of $[10^{7}, 10^{8})$, then use +% Newton's method starting at $17782794 \simeq 10^{7.25}$. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_npos_o:w \s_@@ \@@_chk:w 1 0 #1#2#3#4#5; + { + \exp_after:wN \@@_sanitize:Nw + \exp_after:wN 0 + \int_use:N \__int_eval:w + \if_int_odd:w #1 \exp_stop_f: + \exp_after:wN \@@_sqrt_npos_auxi_o:wwnnN + \fi: + #1 / \c_two + \@@_sqrt_Newton_o:wwn 56234133; 0; {#2#3} {#4#5} 0 + } +\cs_new:Npn \@@_sqrt_npos_auxi_o:wwnnN #1 / \c_two #2; 0; #3#4#5 + { + ( #1 + \c_one ) / \c_two + \@@_pack_eight:wNNNNNNNN + \@@_sqrt_npos_auxii_o:wNNNNNNNN + ; + 0 #3 #4 + } +\cs_new:Npn \@@_sqrt_npos_auxii_o:wNNNNNNNN #1; #2#3#4#5#6#7#8#9 + { \@@_sqrt_Newton_o:wwn 17782794; 0; {#1} {#2#3#4#5#6#7#8#9} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP]{\@@_sqrt_Newton_o:wwn} +% Newton's method maps $x\mapsto\bigl[(x + [10^{8} a_1 / x])/2\bigr]$ +% in each iteration, where $[b/c]$ denotes \eTeX{}'s division. This +% division rounds the real number $b/c$ to the closest integer, +% rounding ties away from zero, hence when $c$~is even, +% $b/c - 1/2 + 1/c \leq [b/c] \leq b/c + 1/2$ +% and when $c$~is odd, +% $b/c - 1/2 + 1/(2c) \leq [b/c] \leq b/c + 1/2 - 1/(2c)$. +% For all~$c$, $b/c - 1/2 + 1/(2c) \leq [b/c] \leq b/c + 1/2$. +% +% Let us prove that the method converges when implemented with \eTeX{} +% integer division, for any $10^{6} \leq a_1 < 10^{8}$ and starting +% value $10^{6} \leq x < 10^{8}$. Using the inequalities above and +% the arithmetic--geometric inequality $(x+t)/2 \geq \sqrt{xt}$ for $t +% = 10^{8} a_1 / x$, we find +% \[ +% x' +% = \left[\frac{x + [10^{8} a_1 / x]}{2}\right] +% \geq \frac{x + 10^{8} a_1 / x - 1/2 + 1/(2x)}{2} +% \geq \sqrt{10^{8} a_1} - \frac{1}{4} + \frac{1}{4x} \,. +% \] +% After any step of iteration, we thus have $\delta = x - \sqrt{10^{8} +% a_1} \geq -0.25 + 0.25 \cdot 10^{-8}$. The new difference +% $\delta' = x' - \sqrt{10^{8} a_1}$ after one step is bounded above +% as +% \[ +% x' - \sqrt{10^{8} a_1} +% \leq \frac{x + 10^{8} a_1 / x + 1/2}{2} + \frac{1}{2} +% - \sqrt{10^{8} a_1} +% \leq \frac{\delta}{2} \frac{\delta}{\sqrt{10^{8} a_1} + \delta} +% + \frac{3}{4} \,. +% \] +% For $\delta > 3/2$, this last expression is +% $\leq\delta/2+3/4<\delta$, hence $\delta$~decreases at each step: +% since all~$x$ are integers, $\delta$~must reach a value +% $-1/4<\delta\leq 3/2$. In this range of values, we get $\delta' +% \leq \frac{3}{4} \frac{3}{2\sqrt{10^{8} a_1}} + \frac{3}{4} \leq +% 0.75 + 1.125 \cdot 10^{-7}$. We deduce that the difference $\delta +% = x - \sqrt{10^{8} a_1}$ eventually reaches a value in the interval +% $[-0.25 + 0.25\cdot 10^{-8}, 0.75 + 11.25 \cdot 10^{-8}]$, whose +% width is $1 + 11 \cdot 10^{-8}$. The corresponding interval for~$x$ +% may contain two integers, hence $x$~might oscillate between those +% two values. +% +% However, the fact that $x\mapsto x-1$ and $x-1 \mapsto x$ puts +% stronger constraints, which are not compatible: the first implies +% \[ +% x + [10^{8} a_1 / x] \leq 2x - 2 +% \] +% hence $10^{8} a_1 / x \leq x - 3/2$, while the second implies +% \[ +% x - 1 + [10^{8} a_1 / (x - 1)] \geq 2x - 1 +% \] +% hence $10^{8} a_1 / (x - 1) \geq x - 1/2$. Combining the two +% inequalities yields $x^2 - 3x/2 \geq 10^{8} a_1 \geq x - 3x/2 + +% 1/2$, which cannot hold. Therefore, the iteration always converges +% to a single integer~$x$. To stop the iteration when two consecutive +% results are equal, the function \cs{@@_sqrt_Newton_o:wwn} receives +% the newly computed result as~|#1|, the previous result as~|#2|, and +% $a_1$ as~|#3|. Note that \eTeX{} combines the computation of a +% multiplication and a following division, thus avoiding overflow in +% |#3 * 100000000 / #1|. In any case, the result is within $[10^{7}, +% 10^{8}]$. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_Newton_o:wwn #1; #2; #3 + { + \if_int_compare:w #1 = #2 \exp_stop_f: + \exp_after:wN \@@_sqrt_auxi_o:NNNNwnnN + \int_use:N \__int_eval:w 9999 9999 + + \exp_after:wN \@@_use_none_until_s:w + \fi: + \exp_after:wN \@@_sqrt_Newton_o:wwn + \int_use:N \__int_eval:w (#1 + #3 * 1 0000 0000 / #1) / \c_two ; + #1; {#3} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP]{\@@_sqrt_auxi_o:NNNNwnnN} +% This function is followed by $10^{8}+x-1$, which has~$9$ digits +% starting with~$1$, then |;| \Arg{a_1} \Arg{a_2} \meta{a'}. Here, $x +% \simeq \sqrt{10^{8} a_1}$ and we want to estimate the square root of +% $a = 10^{-8} a_1 + 10^{-16} a_2 + 10^{-17} a'$. We set up an +% initial underestimate +% \[ +% y = (x - 1) 10^{-8} + 0.2499998875 \cdot 10^{-8} \lesssim \sqrt{a}\,. +% \] +% From the inequalities shown earlier, we know that $y \leq +% \sqrt{10^{-8} a_1} \leq \sqrt{a}$ and that $\sqrt{10^{-8} a_1} \leq +% y + 10^{-8} + 11\cdot 10^{-16}$ hence (using $0.1\leq y\leq +% \sqrt{a}\leq 1$) +% \[ +% a - y^2 \leq 10^{-8} a_1 + 10^{-8} - y^2 +% \leq (y + 10^{-8} + 11\cdot 10^{-16})^2 - y^2 + 10^{-8} +% < 3.2 \cdot 10^{-8} \,, +% \] +% and $\sqrt{a} - y = (a - y^2)/(\sqrt{a} + y) \leq 16 \cdot 10^{-8}$. +% Next, \cs{@@_sqrt_auxii_o:NnnnnnnnN} will be called several times to +% get closer and closer underestimates of~$\sqrt{a}$. By +% construction, the underestimates~$y$ are always increasing, $a - y^2 +% < 3.2 \cdot 10^{-8}$ for all. Also, $y<1$. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxi_o:NNNNwnnN 1 #1#2#3#4#5; + { + \@@_sqrt_auxii_o:NnnnnnnnN + \@@_sqrt_auxiii_o:wnnnnnnnn + {#1#2#3#4} {#5} {2499} {9988} {7500} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP]{\@@_sqrt_auxii_o:NnnnnnnnN} +% This receives a continuation function~|#1|, then five blocks of~$4$ +% digits for~$y$, then two $8$-digit blocks and a single digit +% for~$a$. A common estimate of $\sqrt{a} - y = (a - y^2) / (\sqrt{a} +% + y)$ is $(a - y^2)/(2y)$, which leads to alternating overestimates +% and underestimates. We tweak this, to only work with underestimates +% (no need then to worry about signs in the computation). Each step +% finds the largest integer $j\leq 6$ such that $10^{4j}(a-y^2) < +% 2\cdot 10^{8}$, then computes the integer (with \eTeX{}'s rounding +% division) +% \[ +% 10^{4j} z = +% \Bigl[\bigl(\lfloor 10^{4j}(a-y^2)\rfloor - 257\bigr) +% \cdot (0.5\cdot 10^{8}) +% \Bigm/ \lfloor 10^{8} y + 1\rfloor\Bigr] \,. +% \] +% The choice of~$j$ ensures that $10^{4j} z < 2\cdot 10^{8} \cdot +% 0.5\cdot 10^{8} / 10^{7} = 10^{9}$, thus $10^{9} + 10^{4j} z$ has +% exactly $10$~digits, does not overflow \TeX{}'s integer range, and +% starts with~$1$. Incidentally, since all $a - y^2 \leq 3.2\cdot +% 10^{-8}$, we know that $j\geq 3$. +% +% Let us show that $z$ is an underestimate of $\sqrt{a} - y$. On the +% one hand, $\sqrt{a} - y \leq 16\cdot 10^{-8}$ because this holds for +% the initial~$y$ and values of~$y$ can only increase. On the other +% hand, the choice of~$j$ implies that $\sqrt{a} - y \leq +% 5(\sqrt{a}+y)(\sqrt{a}-y) = 5(a - y^2) < 10^{9-4j}$. For $j=3$, the +% first bound is better, while for larger~$j$, the second bound is +% better. For all $j\in[3,6]$, we find $\sqrt{a}-y < 16\cdot +% 10^{-2j}$. From this, we deduce that +% \[ +% 10^{4j} (\sqrt{a}-y) +% = \frac{10^{4j}\bigl(a-y^2-(\sqrt{a}-y)^2\bigr)}{2y} +% \geq \frac{\bigl\lfloor 10^{4j}(a-y^2)\bigr\rfloor-257} +% {2\cdot 10^{-8} \lfloor 10^{8}y+1\rfloor} +% + \frac{1}{2} +% \] +% where we have replaced the bound $10^{4j}(16\cdot 10^{-2j}) = 256$ +% by~$257$ and extracted the corresponding term $1/\bigl(2\cdot +% 10^{-8} \lfloor 10^{8}y+1\rfloor\bigr) \geq 1/2$. Given that +% \eTeX{}'s integer division obeys $[b/c] \leq b/c + 1/2$, we deduce +% that $10^{4j} z \leq 10^{4j} (\sqrt{a}-y)$, hence $y+z\leq\sqrt{a}$ +% is an underestimate of~$\sqrt{a}$, as claimed. One implementation +% detail: because the computation involves |-#4*#4| |-| |2*#3*#5| |-| +% |2*#2*#6| which may be as low as $-5\cdot 10^{8}$, we need to use +% the \texttt{pack_big} functions, and the \texttt{big} shifts. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxii_o:NnnnnnnnN #1 #2#3#4#5#6 #7#8#9 + { + \exp_after:wN #1 + \int_use:N \__int_eval:w \c_@@_big_leading_shift_int + + #7 - #2 * #2 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + - 2 * #2 * #3 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + + #8 - #3 * #3 - 2 * #2 * #4 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + - 2 * #3 * #4 - 2 * #2 * #5 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + + #9 000 0000 - #4 * #4 - 2 * #3 * #5 - 2 * #2 * #6 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + - 2 * #4 * #5 - 2 * #3 * #6 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + - #5 * #5 - 2 * #4 * #6 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w + \c_@@_big_middle_shift_int + - 2 * #5 * #6 + \exp_after:wN \@@_pack_big:NNNNNNw + \int_use:N \__int_eval:w + \c_@@_big_trailing_shift_int + - #6 * #6 ; + % ( + - 257 ) * 5000 0000 / (#2#3 + 1) + 10 0000 0000 ; + {#2}{#3}{#4}{#5}{#6} {#7}{#8}#9 + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP] +% { +% \@@_sqrt_auxiii_o:wnnnnnnnn, +% \@@_sqrt_auxiv_o:NNNNNw, +% \@@_sqrt_auxv_o:NNNNNw, +% \@@_sqrt_auxvi_o:NNNNNw, +% \@@_sqrt_auxvii_o:NNNNNw +% } +% We receive here the difference $a-y^2=d=\sum_i d_i \cdot 10^{-4i}$, +% as \meta{d_2} |;| \Arg{d_3} \ldots{} \Arg{d_{10}}, where each block +% has~$4$ digits, except \meta{d_2}. This function finds the largest +% $j\leq 6$ such that $10^{4j}(a-y^2) < 2\cdot 10^{8}$, then leaves an +% open parenthesis and the integer +% $\bigl\lfloor 10^{4j}(a-y^2)\bigr\rfloor$ in an integer +% expression. The closing parenthesis is provided by the caller +% \cs{@@_sqrt_auxii_o:NnnnnnnnN}, which completes the expression +% \[ +% 10^{4j} z = +% \Bigl[\bigl(\lfloor 10^{4j}(a-y^2)\rfloor - 257\bigr) +% \cdot (0.5\cdot 10^{8}) +% \Bigm/ \lfloor 10^{8} y + 1\rfloor\Bigr] +% \] +% for an estimate of $10^{4j} (\sqrt{a} - y)$. If $d_2\geq 2$, $j=3$ +% and the \texttt{auxiv} auxiliary receives $10^{12} z$. If $d_2\leq +% 1$ but $10^{4} d_2 + d_3 \geq 2$, $j=4$ and the \texttt{auxv} +% auxiliary is called, and receives $10^{16} z$, and so on. In all +% those cases, the \texttt{auxviii} auxiliary is set up to add~$z$ +% to~$y$, then go back to the \texttt{auxii} step with continuation +% \texttt{auxiii} (the function we are currently describing). The +% maximum value of $j$ is~$6$, regardless of whether $10^{12} d_2 + +% 10^{8} d_3 + 10^{4} d_4 + d_5 \geq 1$. In this last case, we detect +% when $10^{24} z < 10^{7}$, which essentially means $\sqrt{a} - y +% \lesssim 10^{-17}$: once this threshold is reached, there is enough +% information to find the correctly rounded~$\sqrt{a}$ with only one +% more call to \cs{@@_sqrt_auxii_o:NnnnnnnnN}. Note that the +% iteration cannot be stuck before reaching $j=6$, because for $j<6$, +% one has $2\cdot 10^{8}\leq 10^{4(j+1)}(a-y^2)$, hence +% \[ +% 10^{4j} z +% \geq \frac{(20000-257)(0.5\cdot 10^{8})}{\lfloor 10^{8} y + 1\rfloor} +% \geq (20000-257)\cdot 0.5 > 0 \,. +% \] +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxiii_o:wnnnnnnnn + #1; #2#3#4#5#6#7#8#9 + { + \if_int_compare:w #1 > \c_one + \exp_after:wN \@@_sqrt_auxiv_o:NNNNNw + \int_use:N \__int_eval:w (#1#2 %) + \else: + \if_int_compare:w #1#2 > \c_one + \exp_after:wN \@@_sqrt_auxv_o:NNNNNw + \int_use:N \__int_eval:w (#1#2#3 %) + \else: + \if_int_compare:w #1#2#3 > \c_one + \exp_after:wN \@@_sqrt_auxvi_o:NNNNNw + \int_use:N \__int_eval:w (#1#2#3#4 %) + \else: + \exp_after:wN \@@_sqrt_auxvii_o:NNNNNw + \int_use:N \__int_eval:w (#1#2#3#4#5 %) + \fi: + \fi: + \fi: + } +\cs_new:Npn \@@_sqrt_auxiv_o:NNNNNw 1#1#2#3#4#5#6; + { \@@_sqrt_auxviii_o:nnnnnnn {#1#2#3#4#5#6} {00000000} } +\cs_new:Npn \@@_sqrt_auxv_o:NNNNNw 1#1#2#3#4#5#6; + { \@@_sqrt_auxviii_o:nnnnnnn {000#1#2#3#4#5} {#60000} } +\cs_new:Npn \@@_sqrt_auxvi_o:NNNNNw 1#1#2#3#4#5#6; + { \@@_sqrt_auxviii_o:nnnnnnn {0000000#1} {#2#3#4#5#6} } +\cs_new:Npn \@@_sqrt_auxvii_o:NNNNNw 1#1#2#3#4#5#6; + { + \if_int_compare:w #1#2 = \c_zero + \exp_after:wN \@@_sqrt_auxx_o:Nnnnnnnn + \fi: + \@@_sqrt_auxviii_o:nnnnnnn {00000000} {000#1#2#3#4#5} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP] +% {\@@_sqrt_auxviii_o:nnnnnnn, \@@_sqrt_auxix_o:wnwnw} +% Simply add the two $8$-digit blocks of~$z$, aligned to the last four +% of the five $4$-digit blocks of~$y$, then call the \texttt{auxii} +% auxiliary to evaluate $y'^{2} = (y+z)^{2}$. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxviii_o:nnnnnnn #1#2 #3#4#5#6#7 + { + \exp_after:wN \@@_sqrt_auxix_o:wnwnw + \int_use:N \__int_eval:w #3 + \exp_after:wN \@@_basics_pack_low:NNNNNw + \int_use:N \__int_eval:w #1 + 1#4#5 + \exp_after:wN \@@_basics_pack_low:NNNNNw + \int_use:N \__int_eval:w #2 + 1#6#7 ; + } +\cs_new:Npn \@@_sqrt_auxix_o:wnwnw #1; #2#3; #4#5; + { + \@@_sqrt_auxii_o:NnnnnnnnN + \@@_sqrt_auxiii_o:wnnnnnnnn {#1}{#2}{#3}{#4}{#5} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP] +% {\@@_sqrt_auxx_o:Nnnnnnnn, \@@_sqrt_auxxi_o:wwnnN} +% At this stage, $j=6$ and $10^{24} z < 10^{7}$, hence +% \[ +% 10^{7} + 1/2 > 10^{24} z + 1/2 \geq +% \bigl(10^{24}(a-y^2) - 258\bigr) \cdot (0.5\cdot 10^{8}) +% \Bigm/ (10^{8} y + 1) \,, +% \] +% then $10^{24}(a-y^2) - 258 < 2 (10^{7} + 1/2) (y + 10^{-8})$, and +% \[ +% 10^{24}(a-y^2) +% < (10^{7} + 1290.5) (1 + 10^{-8}/y) (2y) +% < (10^{7} + 1290.5) (1 + 10^{-7}) (y + \sqrt{a}) \,, +% \] +% which finally implies $0\leq\sqrt{a}-y < 0.2\cdot 10^{-16}$. In +% particular, $y$~is an underestimate of~$\sqrt{a}$ and $y+0.5\cdot +% 10^{-16}$ is a (strict) overestimate. There is at exactly one +% multiple $m$~of $0.5\cdot 10^{-16}$ in the interval $[y, y+0.5\cdot +% 10^{-16})$. If $m^2>a$, then the square root is inexact and is +% obtained by rounding $m-\epsilon$ to a multiple of $10^{-16}$ (the +% precise shift $0<\epsilon<0.5\cdot 10^{-16}$ is irrelevant for +% rounding). If $m^2=a$ then the square root is exactly~$m$, and +% there is no rounding. If $m^2<a$ then we round $m+\epsilon$. For +% now, discard a few irrelevant arguments |#1|, |#2|, |#3|, and find +% the multiple of $0.5\cdot 10^{-16}$ within $[y, y+0.5\cdot +% 10^{-16})$; rather, only the last $4$~digits |#8| of~$y$ are +% considered, and we do not perform any carry yet. The \texttt{auxxi} +% auxiliary sets up \texttt{auxii} with a continuation function +% \texttt{auxxii} instead of \texttt{auxiii} as before. To prevent +% \texttt{auxii} from giving a negative results $a-m^2$, we compute +% $a+10^{-16}-m^2$ instead, always positive since $m<\sqrt{a}+0.5\cdot +% 10^{-16}$ and $a\leq 1-10^{-16}$. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxx_o:Nnnnnnnn #1#2#3 #4#5#6#7#8 + { + \exp_after:wN \@@_sqrt_auxxi_o:wwnnN + \int_use:N \__int_eval:w + (#8 + 2499) / 5000 * 5000 ; + {#4} {#5} {#6} {#7} ; + } +\cs_new:Npn \@@_sqrt_auxxi_o:wwnnN #1; #2; #3#4#5 + { + \@@_sqrt_auxii_o:NnnnnnnnN + \@@_sqrt_auxxii_o:nnnnnnnnw + #2 {#1} + {#3} { #4 + \c_one } #5 + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP] +% {\@@_sqrt_auxxii_o:nnnnnnnnw, \@@_sqrt_auxxiii_o:w} +% The difference $0\leq a+10^{-16}-m^2\leq +% 10^{-16}+(\sqrt{a}-m)(\sqrt{a}+m)\leq 2\cdot 10^{-16}$ was just +% computed: its first $8$~digits vanish, as do the next four,~|#1|, +% and most of the following four,~|#2|. The guess~$m$ is an +% overestimate if $a+10^{-16}-m^2 < 10^{-16}$, that is, |#1#2| +% vanishes. Otherwise it is an underestimate, unless +% $a+10^{-16}-m^2=10^{-16}$ exactly. For an underestimate, call the +% \texttt{auxxiv} function with argument~$9998$. For an exact result +% call it with~$9999$, and for an overestimate call it with~$10000$. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxxii_o:nnnnnnnnw 0; #1#2#3#4#5#6#7#8 #9; + { + \if_int_compare:w #1#2 > \c_zero + \if_int_compare:w #1#2 = \c_one + \if_int_compare:w #3#4 = \c_zero + \if_int_compare:w #5#6 = \c_zero + \if_int_compare:w #7#8 = \c_zero + \@@_sqrt_auxxiii_o:w + \fi: + \fi: + \fi: + \fi: + \exp_after:wN \@@_sqrt_auxxiv_o:wnnnnnnnN + \__int_value:w 9998 + \else: + \exp_after:wN \@@_sqrt_auxxiv_o:wnnnnnnnN + \__int_value:w 10000 + \fi: + ; + } +\cs_new:Npn \@@_sqrt_auxxiii_o:w \fi: \fi: \fi: \fi: #1 \fi: ; + { + \fi: \fi: \fi: \fi: \fi: + \@@_sqrt_auxxiv_o:wnnnnnnnN 9999 ; + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, rEXP]{\@@_sqrt_auxxiv_o:wnnnnnnnN} +% This receives $9998$, $9999$ or $10000$ as~|#1| when $m$~is an +% underestimate, exact, or an overestimate, respectively. Then +% comes~$m$ as five blocks of~$4$ digits, but where the last +% block~|#6| may be $0$, $5000$, or~$10000$. In the latter case, we +% need to add a carry, unless $m$~is an overestimate (|#1|~is then +% $10000$). Then comes~$a$ as three arguments. Rounding is done by +% \cs{@@_round:NNN}, whose first argument is the final sign~$0$ +% (square roots are positive). We fake its second argument. It +% should be the last digit kept, but this is only used when ties are +% \enquote{rounded to even}, and only when the result is exactly +% half-way between two representable numbers rational square roots of +% numbers with $16$~significant digits have: this situation never +% arises for the square root, as any exact square root of a $16$~digit +% number has at most $8$~significant digits. Finally, the last +% argument is the next digit, possibly shifted by~$1$ when there are +% further nonzero digits. This is achieved by \cs{@@_round_digit:Nw}, +% which receives (after removal of the $10000$'s digit) one of $0000$, +% $0001$, $4999$, $5000$, $5001$, or~$9999$, which it converts to $0$, +% $1$, $4$, $5$, $6$, and~$9$, respectively. +% \begin{macrocode} +\cs_new:Npn \@@_sqrt_auxxiv_o:wnnnnnnnN #1; #2#3#4#5#6 #7#8#9 + { + \exp_after:wN \@@_basics_pack_high:NNNNNw + \int_use:N \__int_eval:w 1 0000 0000 + #2#3 + \exp_after:wN \@@_basics_pack_low:NNNNNw + \int_use:N \__int_eval:w 1 0000 0000 + + #4#5 + \if_int_compare:w #6 > #1 \exp_stop_f: + \c_one \fi: + + \exp_after:wN \@@_round:NNN + \exp_after:wN 0 + \exp_after:wN 0 + \__int_value:w + \exp_after:wN \use_i:nn + \exp_after:wN \@@_round_digit:Nw + \int_use:N \__int_eval:w #6 + 19999 - #1 ; + \exp_after:wN ; + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting the sign} % % \begin{macro}[int, EXP]{\@@_set_sign_o:w} % This function is used for the unary minus and for \texttt{abs}. It diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 47dfff937ad..75a68d95846 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-expo.dtx 4601 2013-11-18 23:13:28Z bruno $ +\GetIdInfo$Id: l3fp-expo.dtx 4617 2013-12-14 12:37:59Z bruno $ {L3 Floating-point exponential-related functions} \documentclass[full]{l3doc} \begin{document} @@ -1070,34 +1070,34 @@ \cs_new:Npn \@@_pow_exponent:wnN #1; #2 { \if_int_compare:w #2 > \c_zero - \exp_after:wN \@@_pow_exponent:Nwnnnnnwn % n\ln(10) - (-\ln(x)) + \exp_after:wN \@@_pow_exponent:Nwnnnnnw % n\ln(10) - (-\ln(x)) \exp_after:wN + \else: - \exp_after:wN \@@_pow_exponent:Nwnnnnnwn % -( |n|\ln(10) + (-\ln(x)) ) + \exp_after:wN \@@_pow_exponent:Nwnnnnnw % -( |n|\ln(10) + (-\ln(x)) ) \exp_after:wN - \fi: #2; #1; } -\cs_new:Npn \@@_pow_exponent:Nwnnnnnwn #1#2; #3#4#5#6#7#8; #9 +\cs_new:Npn \@@_pow_exponent:Nwnnnnnw #1#2; #3#4#5#6#7#8; { %^^A todo: use that in ln. - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_leading_shift_int - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int #1#2*23025 - #1 #3 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int #1 #2*8509 - #1 #4 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int #1 #2*2994 - #1 #5 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int #1 #2*0456 - #1 #6 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_trailing_shift_int #1 #2*8401 - #1 #7 - #1 ( #2*7991 - #8 ) / 1 0000 ; {#9} ; + #1 ( #2*7991 - #8 ) / 1 0000 ; ; } \cs_new:Npn \@@_pow_B:wwN #1#2#3#4#5#6; #7; { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 9bb7145d635..fabc72e0392 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-extended.dtx 4601 2013-11-18 23:13:28Z bruno $ +\GetIdInfo$Id: l3fp-extended.dtx 4617 2013-12-14 12:37:59Z bruno $ {L3 Floating-points with extended precision} \documentclass[full]{l3doc} \begin{document} @@ -168,28 +168,25 @@ % exactly $4$~digits. The choice of shifts allows~|#1| to be in the % range $[0, 5\cdot 10^{8}-1]$. % \begin{macrocode} -\cs_new:Npn \@@_fixed_div_myriad:wn #1#2#3#4#5#6; #7 +\cs_new:Npn \@@_fixed_div_myriad:wn #1#2#3#4#5#6; { - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_leading_shift_int - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_trailing_shift_int - + #1 ; {#7} {#2}{#3}{#4}{#5}; + + #1 ; {#2}{#3}{#4}{#5}; } % \end{macrocode} % \end{macro} % -% ^^A todo:\cs_new:Npn \@@_fixed_mul_after:wn #1; #2; #3 { #3 {#1} #2; } -% ^^A and do not bring the continuation up while packing. -% ^^A possibly delete use_braced_s function afterwards. -% \begin{macro}[aux, EXP]{\@@_fixed_mul_after:wn} +% \begin{macro}[aux, EXP]{\@@_fixed_mul_after:wwn} % The fixed point operations which involve multiplication end by % calling this auxiliary. It braces the last block of digits, and % places the \meta{continuation} |#2| in front. The % \meta{continuation} was brought up through the expansions by % the packing functions. % \begin{macrocode} -\cs_new:Npn \@@_fixed_mul_after:wn #1; #2 { #2 {#1} } +\cs_new:Npn \@@_fixed_mul_after:wwn #1; #2; #3 { #3 {#1} #2; } % \end{macrocode} % \end{macro} % @@ -213,27 +210,26 @@ % \begin{macrocode} \cs_new:Npn \@@_fixed_mul_short:wwn #1#2#3#4#5#6; #7#8#9; { - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_leading_shift_int + #1*#7 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #1*#8 + #2*#7 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #1*#9 + #2*#8 + #3*#7 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #2*#9 + #3*#8 + #4*#7 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #3*#9 + #4*#8 + #5*#7 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_trailing_shift_int + #4*#9 + #5*#8 + #6*#7 + ( #5*#9 + #6*#8 + #6*#9 / \c_ten_thousand ) - / \c_ten_thousand - \exp_after:wN ; \@@_use_braced_s:n + / \c_ten_thousand ; ; } % \end{macrocode} % \end{macro} @@ -382,7 +378,7 @@ % % ^^A todo: may a_1 or b_1 be = 10000? Used in ediv_epsi later. % \begin{macro}[int, EXP]{\@@_fixed_mul:wwn} -% \begin{macro}[aux, EXP]{\@@_fixed_mul:nnnnnnnwn} +% \begin{macro}[aux, EXP]{\@@_fixed_mul:nnnnnnnw} % \begin{syntax} % \cs{@@_fixed_mul:wwn} \meta{a} |;| \meta{b} |;| \Arg{continuation} % \end{syntax} @@ -419,38 +415,36 @@ % $a_{5}$, $a_{6}$, $b_{1}$, $b_{2}$, $a_{1}$, $a_{2}$, $b_{5}$, % $b_{6}$ and finally the \meta{continuation} as arguments. It writes % the end of the expression, including the right parenthesis and the -% denominator of the fraction. The packing auxiliaries bring the -% \meta{continuation} up through the expansion chain, as |#7|, and it +% denominator of the fraction. The \meta{continuation} % is finally placed in front of the $6$ brace groups by -% \cs{@@_fixed_mul_after:wn}. +% \cs{@@_fixed_mul_after:wwn}. % \begin{macrocode} \cs_new:Npn \@@_fixed_mul:wwn #1#2#3#4 #5; #6#7#8#9 { - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_leading_shift_int - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #1*#6 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #1*#7 + #2*#6 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #1*#8 + #2*#7 + #3*#6 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_middle_shift_int + #1*#9 + #2*#8 + #3*#7 + #4*#6 - \exp_after:wN \@@_pack:NNNNNwn + \exp_after:wN \@@_pack:NNNNNw \int_use:N \__int_eval:w \c_@@_trailing_shift_int + #2*#9 + #3*#8 + #4*#7 + ( #3*#9 + #4*#8 - + \@@_fixed_mul:nnnnnnnwn #5 {#6}{#7} {#1}{#2} + + \@@_fixed_mul:nnnnnnnw #5 {#6}{#7} {#1}{#2} } -\cs_new:Npn \@@_fixed_mul:nnnnnnnwn #1#2 #3#4 #5#6 #7#8 ; #9 +\cs_new:Npn \@@_fixed_mul:nnnnnnnw #1#2 #3#4 #5#6 #7#8 ; { #1*#4 + #2*#3 + #5*#8 + #6*#7 ) / \c_ten_thousand - + #1*#3 + #5*#7 ; - {#9} ; + + #1*#3 + #5*#7 ; ; } % \end{macrocode} % \end{macro} @@ -505,39 +499,37 @@ % later, and adds a trailing ${} + c_{5}c_{6}$ |;| % \Arg{continuation}~|;|. The ${} + c_{5}c_{6}$ piece, which is % omitted for \cs{@@_fixed_one_minus_mul:wwn}, will be taken in the -% integer expression for the $10^{-24}$ level. The -% \meta{continuation} is placed correctly to be taken upstream by -% packing auxiliaries. +% integer expression for the $10^{-24}$ level. % \begin{macrocode} -\cs_new:Npn \@@_fixed_mul_add:wwwn #1; #2; #3#4#5#6#7#8; #9 +\cs_new:Npn \@@_fixed_mul_add:wwwn #1; #2; #3#4#5#6#7#8; { - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_big_leading_shift_int - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + #3 #4 \@@_fixed_mul_add:Nwnnnwnnn + + #5 #6 ; #2 ; #1 ; #2 ; + - + #7 #8 ; {#9} ; + + #7 #8 ; ; } -\cs_new:Npn \@@_fixed_mul_sub_back:wwwn #1; #2; #3#4#5#6#7#8; #9 +\cs_new:Npn \@@_fixed_mul_sub_back:wwwn #1; #2; #3#4#5#6#7#8; { - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_big_leading_shift_int - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + #3 #4 \@@_fixed_mul_add:Nwnnnwnnn - + #5 #6 ; #2 ; #1 ; #2 ; - - + #7 #8 ; {#9} ; + + #7 #8 ; ; } -\cs_new:Npn \@@_fixed_one_minus_mul:wwn #1; #2; #3 +\cs_new:Npn \@@_fixed_one_minus_mul:wwn #1; #2; { - \exp_after:wN \@@_fixed_mul_after:wn + \exp_after:wN \@@_fixed_mul_after:wwn \int_use:N \__int_eval:w \c_@@_big_leading_shift_int - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_middle_shift_int + 1 0000 0000 \@@_fixed_mul_add:Nwnnnwnnn - ; #2 ; #1 ; #2 ; - - ; {#3} ; + ; ; } % \end{macrocode} % \end{macro} @@ -563,13 +555,13 @@ \cs_new:Npn \@@_fixed_mul_add:Nwnnnwnnn #1 #2; #3#4#5#6; #7#8#9 { #1 #7*#3 - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_middle_shift_int #1 #7*#4 #1 #8*#3 - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_middle_shift_int #1 #7*#5 #1 #8*#4 #1 #9*#3 #2 - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_middle_shift_int #1 \@@_fixed_mul_add:nnnnwnnnn {#7}{#8}{#9} } @@ -601,7 +593,7 @@ \cs_new:Npn \@@_fixed_mul_add:nnnnwnnnn #1#2#3#4#5; #6#7#8#9 { ( #1*#9 + #2*#8 + #3*#7 + #4*#6 ) - \exp_after:wN \@@_pack_big:NNNNNNwn + \exp_after:wN \@@_pack_big:NNNNNNw \int_use:N \__int_eval:w \c_@@_big_trailing_shift_int \@@_fixed_mul_add:nnnnwnnwN { #6 + #4*#7 + #3*#8 + #2*#9 + #1 } @@ -676,7 +668,6 @@ % \end{macro} % % ^^A todo: make it work when the arg is zero. -% ^^A todo: remove the unused(?) 'n' arg. % \begin{macro}[aux, EXP]{\@@_ep_to_ep:wwN} % \begin{macro}[aux, rEXP]{\@@_ep_to_ep_loop:N, \@@_ep_to_ep_end:www} % \begin{macro}[aux, EXP]{\@@_ep_to_ep_zero:ww} @@ -1221,7 +1212,7 @@ % before), and we assume that it is less than $10^8$.\footnote{Bruno: % I must double check this assumption.} % -%^^A todo: round properly when rounding to infinity: I need to know the sign. +%^^A todo: round properly when rounding to infinity: I need the sign. % \begin{macrocode} \cs_new:Npn \@@_fixed_to_float:Nw #1#2; { \@@_fixed_to_float:wN #2; #1 } \cs_new:Npn \@@_fixed_to_float:wN #1#2#3#4#5#6; #7 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 3923238e387..7f8d4c4a194 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-parse.dtx 4604 2013-11-19 03:03:47Z bruno $ +\GetIdInfo$Id: l3fp-parse.dtx 4622 2013-12-14 13:05:45Z bruno $ {L3 Floating-point expression parsing} \documentclass[full]{l3doc} \begin{document} @@ -1721,7 +1721,7 @@ \exp_after:wN \@@_parse_apply_unary:NNNwN \exp_after:wN ##1 \exp_after:wN #4 - \cs:w @@_#3_o:w \exp_after:wN \cs_end: + \exp_after:wN #3 \tex_romannumeral:D \if_int_compare:w #2 < ##1 \@@_parse_operand:Nw ##1 @@ -1731,8 +1731,8 @@ \@@_parse_expand:w } } -\@@_tmp:w - \c_twelve { set_sign } 2 -\@@_tmp:w ! \c_twelve { not } ? +\@@_tmp:w - \c_twelve \@@_set_sign_o:w 2 +\@@_tmp:w ! \c_twelve \@@_not_o:w ? % \end{macrocode} % \end{macro} % @@ -1939,6 +1939,7 @@ % \@@_parse_word_abs:N , % \@@_parse_word_exp:N , % \@@_parse_word_ln:N , +% \@@_parse_word_sqrt:N , % } % Unary functions. % \begin{macrocode} @@ -1948,6 +1949,8 @@ { \@@_parse_unary_function:nNN {exp} ? } \cs_new_nopar:Npn \@@_parse_word_ln:N { \@@_parse_unary_function:nNN {ln} ? } +\cs_new_nopar:Npn \@@_parse_word_sqrt:N + { \@@_parse_unary_function:nNN {sqrt} ? } % \end{macrocode} % \end{macro} % @@ -1990,8 +1993,23 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[aux, EXP]{\@@_parse_word_round:N} -% This function expects one or two arguments. +% \begin{macro}[aux, EXP] +% { +% \@@_parse_word_trunc:N, +% \@@_parse_word_floor:N, +% \@@_parse_word_ceil:N +% } +% \begin{macrocode} +\cs_new_nopar:Npn \@@_parse_word_trunc:N + { \@@_parse_function:NNN \@@_round_o:Nw \@@_round_to_zero:NNN } +\cs_new_nopar:Npn \@@_parse_word_floor:N + { \@@_parse_function:NNN \@@_round_o:Nw \@@_round_to_ninf:NNN } +\cs_new_nopar:Npn \@@_parse_word_ceil:N + { \@@_parse_function:NNN \@@_round_o:Nw \@@_round_to_pinf:NNN } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, EXP]{\@@_parse_word_round:N, \@@_parse_round:Nw} % \begin{macrocode} \cs_new:Npn \@@_parse_word_round:N #1#2 { @@ -2006,27 +2024,12 @@ \fi: \fi: \fi: - \exp_after:wN \@@_parse_apply_round:NNwN - \exp_after:wN #1 - \exp_after:wN \@@_round_to_nearest:NNN - \tex_romannumeral:D - \@@_parse_operand:Nw \c_sixteen \@@_parse_expand:w #2 + \@@_parse_function:NNN + \@@_round_o:Nw \@@_round_to_nearest:NNN #1 + #2 } \cs_new:Npn \@@_parse_round:Nw - #1 #2 \@@_round_to_nearest:NNN #3 \@@_parse_expand:w #4 - { #2 #1 #3 \@@_parse_expand:w } -\cs_new:Npn \@@_parse_apply_round:NNwN #1#2#3@#4 - { - \if_case:w \__int_eval:w \@@_array_count:n {#3} - \c_one \__int_eval_end: - \@@_round:Nwn #2 #3 {0} \tex_romannumeral:D - \or: \@@_round:Nww #2 #3 \tex_romannumeral:D - \else: - \__msg_kernel_expandable_error:nnnnn - { kernel } { fp-num-args } { round() } { 1 } { 2 } - \exp_after:wN \c_nan_fp \tex_romannumeral:D - \fi: - -`0 #4 #1 - } + #1 #2 \@@_round_to_nearest:NNN #3#4 { #2 #1 #3 } % \end{macrocode} % \end{macro} % @@ -2428,74 +2431,73 @@ % } % \begin{macro}[aux, EXP] % { -% \@@_parse_infix_excl_aux:NN, -% \@@_parse_infix_excl_error:, -% \@@_infix_compare:N, -% \@@_parse_compare:NNNNNNw, -% \@@_parse_compare_expand:NNNNNw, -% \@@_parse_compare_end:NNNN, +% \@@_parse_excl_error:, +% \@@_parse_compare:NNNNNNN, +% \@@_parse_compare_auxi:NNNNNNN, +% \@@_parse_compare_auxii:NNNNN, +% \@@_parse_compare_end:NNNNw, % \@@_compare:wNNNNw, % } % \begin{macrocode} \cs_new:cpn { @@_parse_infix_<:N } #1 { - \@@_infix_compare:N #1 \c_one_fp - \c_zero_fp \c_zero_fp \c_zero_fp \c_zero_fp < + \@@_parse_compare:NNNNNNN #1 \c_one + \c_zero \c_zero \c_zero \c_zero < } \cs_new:cpn { @@_parse_infix_=:N } #1 { - \@@_infix_compare:N #1 \c_one_fp - \c_zero_fp \c_zero_fp \c_zero_fp \c_zero_fp = + \@@_parse_compare:NNNNNNN #1 \c_one + \c_zero \c_zero \c_zero \c_zero = } \cs_new:cpn { @@_parse_infix_>:N } #1 { - \@@_infix_compare:N #1 \c_one_fp - \c_zero_fp \c_zero_fp \c_zero_fp \c_zero_fp > + \@@_parse_compare:NNNNNNN #1 \c_one + \c_zero \c_zero \c_zero \c_zero > } \cs_new:cpn { @@_parse_infix_!:N } #1 { - \exp_after:wN \@@_parse_infix_excl_aux:NN - \exp_after:wN #1 \tex_romannumeral:D \@@_parse_expand:w - } -\cs_new:Npn \@@_parse_infix_excl_aux:NN #1#2 - { - \@@_infix_compare:N #1 \c_zero_fp - \c_one_fp \c_one_fp \c_one_fp \c_one_fp #2 + \exp_after:wN \@@_parse_compare:NNNNNNN + \exp_after:wN #1 + \exp_after:wN \c_zero + \exp_after:wN \c_one + \exp_after:wN \c_one + \exp_after:wN \c_one + \exp_after:wN \c_one } -\cs_new:Npn \@@_parse_infix_excl_error: +\cs_new:Npn \@@_parse_excl_error: { \__msg_kernel_expandable_error:nnnn { kernel } { fp-missing } { = } { ~after~!. } } -\cs_new:Npn \@@_infix_compare:N #1 +\cs_new:Npn \@@_parse_compare:NNNNNNN #1 { \if_int_compare:w #1 < \c_seven - \exp_after:wN \@@_parse_compare:NNNNNNw - \exp_after:wN \@@_parse_infix_excl_error: + \exp_after:wN \@@_parse_compare_auxi:NNNNNNN + \exp_after:wN \@@_parse_excl_error: \else: \exp_after:wN @ \exp_after:wN \use_none:n - \exp_after:wN \@@_infix_compare:N + \exp_after:wN \@@_parse_compare:NNNNNNN \fi: } -\cs_new:Npn \@@_parse_compare:NNNNNNw #1#2#3#4#5#6#7 +\cs_new:Npn \@@_parse_compare_auxi:NNNNNNN #1#2#3#4#5#6#7 { \if_case:w - \if_catcode:w \scan_stop: #7 + \if_catcode:w \scan_stop: \exp_not:N #7 \c_minus_one \else: \__int_eval:w `#7 - `< \__int_eval_end: \fi: - \@@_parse_compare_expand:NNNNNw #2#2#4#5#6 - \or: \@@_parse_compare_expand:NNNNNw #2#3#2#5#6 - \or: \@@_parse_compare_expand:NNNNNw #2#3#4#2#6 - \or: \@@_parse_compare_expand:NNNNNw #2#3#4#5#2 - \else: #1 \@@_parse_compare_end:NNNN #3#4#5#6#7 + \@@_parse_compare_auxii:NNNNN #2#2#4#5#6 + \or: \@@_parse_compare_auxii:NNNNN #2#3#2#5#6 + \or: \@@_parse_compare_auxii:NNNNN #2#3#4#2#6 + \or: \@@_parse_compare_auxii:NNNNN #2#3#4#5#2 + \else: #1 \@@_parse_compare_end:NNNNw #3#4#5#6#7 \fi: } -\cs_new:Npn \@@_parse_compare_expand:NNNNNw #1#2#3#4#5 +\cs_new:Npn \@@_parse_compare_auxii:NNNNN #1#2#3#4#5 { - \exp_after:wN \@@_parse_compare:NNNNNNw + \exp_after:wN \@@_parse_compare_auxi:NNNNNNN \exp_after:wN \prg_do_nothing: \exp_after:wN #1 \exp_after:wN #2 @@ -2504,11 +2506,12 @@ \exp_after:wN #5 \tex_romannumeral:D \exp_after:wN \@@_parse_expand:w } -\cs_new:Npn \@@_parse_compare_end:NNNN #1#2#3#4#5 \fi: +\cs_new:Npn \@@_parse_compare_end:NNNNw #1#2#3#4#5 \fi: { \fi: \exp_after:wN @ - \exp_after:wN \@@_parse_apply_compare:NwNNNNwN + \exp_after:wN \@@_parse_apply_compare:NwNNNNNwN + \exp_after:wN \c_one_fp \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 @@ -2516,26 +2519,146 @@ \tex_romannumeral:D \@@_parse_operand:Nw \c_seven \@@_parse_expand:w #5 } -\cs_new:Npn \@@_parse_apply_compare:NwNNNNwN #1 #2@ #3#4#5#6 #7@ #8 +\cs_new:Npn \@@_parse_apply_compare:NwNNNNNwN + #1 #2@ #3 #4#5#6#7 #8@ #9 { - \exp_after:wN \@@_parse_continue:NwN - \exp_after:wN #1 - \tex_romannumeral:D -`0 - \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN - \if_case:w \@@_compare_back:ww #7 #2 \exp_stop_f: - #4 - \or: #5 - \or: #6 - \else: #3 - \fi: - \tex_romannumeral:D -`0 #8 #1 + \if_int_odd:w + \if_meaning:w \c_zero_fp #3 + \c_zero + \else: + \if_case:w \@@_compare_back:ww #8 #2 \exp_stop_f: + #5 \or: #6 \or: #7 \else: #4 + \fi: + \fi: + \exp_after:wN \@@_parse_apply_compare_aux:NNwN + \exp_after:wN \c_one_fp + \else: + \exp_after:wN \@@_parse_apply_compare_aux:NNwN + \exp_after:wN \c_zero_fp + \fi: + #1 #8 #9 + } +\cs_new:Npn \@@_parse_apply_compare_aux:NNwN #1 #2 #3; #4 + { + \if_meaning:w \@@_parse_compare:NNNNNNN #4 + \exp_after:wN \@@_parse_continue_compare:NNwNN + \exp_after:wN #1 + \exp_after:wN #2 + \tex_romannumeral:D -`0 + \@@_exp_after_o:w #3; + \tex_romannumeral:D -`0 + \else: + \exp_after:wN \@@_parse_continue:NwN + \exp_after:wN #2 + \tex_romannumeral:D -`0 + \exp_after:wN #1 + \tex_romannumeral:D -`0 + \fi: + #4 #2 + } +\cs_new:Npn \@@_parse_continue_compare:NNwNN #1#2 #3@ #4#5 + { #4 #2 #3@ #1 } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Candidate: defining new \pkg{l3fp} functions} +% +% \begin{macro}[EXP]{\fp_function:Nw} +% This relies on the definition of the null character as a prefix +% operator with very specific semantics. +% \begin{macrocode} +\group_begin: + \char_set_catcode_other:N \^^@ + \cs_new:Npn \fp_function:Nw #1 { ^^@ ; { \exp_after:wN #1 } } +\group_end: +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fp_new_function:Npn} +% \begin{macro}[aux]{\@@_function_args:Nwn} +% This relies on the definition of the null character as a prefix +% operator with very specific semantics. +% \begin{macrocode} +\group_begin: + \char_set_catcode_other:N \^^@ + \cs_new_protected:Npn \fp_new_function:Npn #1#2# + { + \cs_new:Npx #1 + { + ^^@ ; + { + \exp_not:N \exp_after:wN + \exp_not:N \@@_function_args:Nwn + \exp_not:N \exp_after:wN + \exp_not:c { @@_user_ \cs_to_str:N #1 } + \exp_not:N \__int_value:w + \int_eval:n { \tl_count:n {#2} / \c_two } + \exp_not:N \exp_after:wN ; + } + } + \cs_new:cpn { @@_user_ \cs_to_str:N #1 } #2 + } +\group_end: +\cs_new:Npn \@@_function_args:Nwn #1#2; #3 + { + \int_compare:nNnTF { \tl_count:n {#3} } = {#2} + { #1 #3 } + { + \__msg_kernel_expandable_error:nnnnn + { kernel } { fp-num-args } { #1() } {#2} {#2} + \c_nan_fp + } } % \end{macrocode} % \end{macro} % \end{macro} % +% \begingroup\catcode`^^@=12\relax % ^^A hack +% \begin{macro}[EXP, aux]{\@@_parse_prefix_^^@:Nw} +% \begin{macrocode} +\group_begin: + \char_set_catcode_other:N \^^@ + \cs_new:cpn { @@_parse_prefix_ ^^@ :Nw } #1 ; #2 + { + \exp_after:wN \@@_function_apply:NnwN + \exp_after:wN #1 + \exp_after:wN { #2 \exp_after:wN } + \tex_romannumeral:D + \@@_parse_operand:Nw \c_sixteen \@@_parse_expand:w + } +\group_end: +% \end{macrocode} +% \end{macro} +% \endgroup +% +% \begin{macro}[aux, EXP] +% { +% \@@_function_apply:NnwN, +% \@@_function_store:wwNwnn, +% \@@_function_store_end:wnnn +% } +% \begin{macrocode} +\cs_new:Npn \@@_function_apply:NnwN #1#2#3@#4 + { + \exp_after:wN \@@_exp_after_array_f:w + \tex_romannumeral:D -`0 + \@@_function_store:wwNwnn #3 + \s_@@_mark \@@_function_store:wwNwnn ; + \s_@@_mark \@@_function_store_end:wnnn + \s_@@_stop { } { } {#2} + \s_@@_stop + #4 #1 + } +\cs_new:Npn \@@_function_store:wwNwnn + #1; #2 \s_@@_mark #3#4 \s_@@_stop #5#6 + { #3 #2 \s_@@_mark #3#4 \s_@@_stop { #5 #6 } { { #1; } } } +\cs_new:Npn \@@_function_store_end:wnnn + #1 \s_@@_stop #2#3#4 + { \@@_parse:n { #4 {#2} } } +% \end{macrocode} +% \end{macro} +% % ^^A end[todo] % % \subsection{Messages} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 72a176191ad..556b1960fdd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -314,6 +314,41 @@ % % ^^A todo: This macro is intermingled with l3fp-parse. % ^^A todo: Add explanations. +% \begin{macro}[aux,EXP]{\@@_round_o:Nw} +% This function expects one or two arguments. +% \begin{macrocode} +\cs_new:Npn \@@_round_o:Nw #1#2 @ + { + \if_case:w + \__int_eval:w \@@_array_count:n {#2} - \c_one \__int_eval_end: + \@@_round:Nwn #1 #2 {0} \tex_romannumeral:D + \or: \@@_round:Nww #1 #2 \tex_romannumeral:D + \else: + \@@_error:nffn { num-args } + { \@@_round_name_from_cs:N #1 () } { 1 } { 2 } + \exp_after:wN \c_nan_fp \tex_romannumeral:D + \fi: + -`0 + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux, EXP]{\@@_round_name_from_cs:N} +% \begin{macrocode} +\cs_new:Npn \@@_round_name_from_cs:N #1 + { + \cs_if_eq:NNTF #1 \@@_round_to_zero:NNN { trunc } + { + \cs_if_eq:NNTF #1 \@@_round_to_ninf:NNN { floor } + { + \cs_if_eq:NNTF #1 \@@_round_to_pinf:NNN { ceil } + { round } + } + } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[int, EXP]{\@@_round:Nww, \@@_round:Nwn} % \begin{macro}[aux, EXP] % { @@ -330,8 +365,9 @@ { \@@_small_int:wTF #3; { \@@_round:Nwn #1#2; } { - \@@_invalid_operation_tl_o:nf - { round } { \@@_array_to_clist:n { #2; #3; } } + \@@_invalid_operation_tl_o:ff + { \@@_round_name_from_cs:N #1 } + { \@@_array_to_clist:n { #2; #3; } } } } \cs_new:Npn \@@_round:Nwn #1 \s_@@ \@@_chk:w #2#3#4; #5 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 2a989ffcdf8..3394561ccdf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-traps.dtx 4598 2013-11-02 14:26:32Z bruno $ +\GetIdInfo$Id: l3fp-traps.dtx 4622 2013-12-14 13:05:45Z bruno $ {L3 Floating-point exception trapping} \documentclass[full]{l3doc} \begin{document} @@ -152,7 +152,7 @@ % \begin{itemize} % \item \cs{@@_invalid_operation:nnw}, % \item \cs{@@_invalid_operation_o:Nww}, -% \item \cs{@@_invalid_operation_tl_o:nf}, +% \item \cs{@@_invalid_operation_tl_o:ff}, % \item \cs{@@_division_by_zero_o:Nnw}, % \item \cs{@@_division_by_zero_o:NNww}, % \item \cs{@@_overflow:w}, @@ -224,10 +224,10 @@ \exp_after:wN \c_nan_fp } \exp_args:Nno \use:n - { \cs_set:Npn \@@_invalid_operation_tl_o:nf ##1##2 } + { \cs_set:Npn \@@_invalid_operation_tl_o:ff ##1##2 } { #1 - \@@_error:nnfn { invalid } {##1} {##2} { } + \@@_error:nffn { invalid } {##1} {##2} { } \fp_flag_on:n { invalid_operation } \exp_after:wN \c_nan_fp } @@ -345,7 +345,7 @@ % \begin{macro}[int, EXP] % { % \@@_invalid_operation:nnw, \@@_invalid_operation_o:Nww, -% \@@_invalid_operation_tl_o:nf, +% \@@_invalid_operation_tl_o:ff, % \@@_division_by_zero_o:Nnw, \@@_division_by_zero_o:NNww, % \@@_overflow:w , \@@_underflow:w % } @@ -356,7 +356,7 @@ % \begin{macrocode} \cs_new:Npn \@@_invalid_operation:nnw #1#2#3; { } \cs_new:Npn \@@_invalid_operation_o:Nww #1#2; #3; { } -\cs_new:Npn \@@_invalid_operation_tl_o:nf #1 #2 { } +\cs_new:Npn \@@_invalid_operation_tl_o:ff #1 #2 { } \cs_new:Npn \@@_division_by_zero_o:Nnw #1#2#3; { } \cs_new:Npn \@@_division_by_zero_o:NNww #1#2#3; #4; { } \cs_new:Npn \@@_overflow:w { } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 0fea2b00541..11a058130d1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -36,7 +36,7 @@ % %<*driver> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp-trig.dtx 4607 2013-11-19 08:35:08Z joseph $ +\GetIdInfo$Id: l3fp-trig.dtx 4617 2013-12-14 12:37:59Z bruno $ {L3 Floating-point trigonometric functions} \documentclass[full]{l3doc} \begin{document} @@ -642,7 +642,7 @@ \cs_end: } % \end{macrocode} -% \end{macro} +% \end{variable} % % \begin{macro}[aux, rEXP] % { @@ -978,8 +978,6 @@ % % \subsection{Inverse trigonometric functions} % -% \providecommand*{\atan}{\operatorname{atan}} -% % All inverse trigonometric functions (arcsine, arccosine, arctangent, % arccotangent, arccosecant, and arcsecant) are based on a function % often denoted \texttt{atan2}. This function is accessed directly by diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index dc000923765..fea05abbb12 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -36,7 +36,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3fp.dtx 4601 2013-11-18 23:13:28Z bruno $ +\GetIdInfo$Id: l3fp.dtx 4633 2013-12-31 17:28:46Z joseph $ {L3 Floating points} %</driver|package> %<*driver> @@ -82,7 +82,8 @@ % precedence. % \begin{itemize} % \item Basic arithmetic: addition $x+y$, subtraction $x-y$, -% multiplication $x*y$, division $x/y$, and parentheses. +% multiplication $x*y$, division $x/y$, square root~$\sqrt{x}$, +% and parentheses. % \item Comparison operators: $x\mathop{\mathtt{<}}y$, % $x\mathop{\mathtt{<=}}y$, $x\mathop{\mathtt{>?}}y$, % $x\mathop{\mathtt{!=}}y$ \emph{etc.} @@ -112,13 +113,14 @@ % $\operatorname{asech} x$, $\operatorname{acsch} x$. % \item Extrema: $\max(x,y,\ldots)$, $\min(x,y,\ldots)$, % $\operatorname{abs}(x)$. -% \item Rounding functions: $\operatorname{round}(x,n)$ round to -% closest, $\operatorname{round0}(x,n)$ round towards zero, -% $\operatorname{round\pm}(x,n)$ round towards $\pm\infty$. And +% \item Rounding functions: $\operatorname{round}(x,n)$ rounds to +% closest, $\operatorname{trunc}(x,n)$ rounds towards zero, +% $\operatorname{floor}(x,n)$ rounds towards~$-\infty$, +% $\operatorname{ceil}(x,n)$ rounds towards~$+\infty$. And % \emph{(not yet)} modulo, and \enquote{quantize}. % \item Constants: \texttt{pi}, \texttt{deg} (one degree in radians). % \item Dimensions, automatically expressed in points, \emph{e.g.}, -% \texttt{pc} is $12$. +% \texttt{pc} is~$12$. % \item Automatic conversion (no need for \cs{\meta{type}_use:N}) of % integer, dimension, and skip variables to floating points, % expressing dimensions in points and ignoring the stretch and @@ -159,7 +161,7 @@ % \end{syntax} % Creates a new \meta{fp~var} or raises an error if the name is % already taken. The declaration is global. The \meta{fp~var} will -% initially be $+0$. +% initially be~$+0$. % \end{function} % % \begin{function}[updated = 2012-05-08, tested = m3fp001] @@ -187,7 +189,7 @@ % \end{syntax} % Ensures that the \meta{fp~var} exists globally % by applying \cs{fp_new:N} if necessary, then applies -% \cs{fp_(g)zero:N} to leave the \meta{fp~var} set to zero. +% \cs{fp_(g)zero:N} to leave the \meta{fp~var} set to~$+0$. % \end{function} % % \section{Setting floating point variables} @@ -239,7 +241,7 @@ % \cs{fp_eval:n} \Arg{floating point expression} % \end{syntax} % Evaluates the \meta{floating point expression} and expresses the -% result as a decimal number with~$16$ significant figures and no +% result as a decimal number with no % exponent. Leading or trailing zeros may be inserted to compensate % for the exponent. Non-significant trailing zeros are trimmed, and % integers are expressed without a decimal separator. The values @@ -255,11 +257,11 @@ % \cs{fp_to_decimal:n} \Arg{floating point expression} % \end{syntax} % Evaluates the \meta{floating point expression} and expresses the -% result as a decimal number with $16$ significant figures and no +% result as a decimal number with no % exponent. Leading or trailing zeros may be inserted to compensate % for the exponent. Non-significant trailing zeros are trimmed, and % integers are expressed without a decimal separator. The values -% $\pm\infty$ and \nan{} trigger an \enquote{invalid operation} +% $\pm\infty$ and~\nan{} trigger an \enquote{invalid operation} % exception. % \end{function} % @@ -270,12 +272,12 @@ % \cs{fp_to_dim:n} \Arg{floating point expression} % \end{syntax} % Evaluates the \meta{floating point expression} and expresses the -% result as a dimension (in \texttt{pt}) suitable for use in dimension +% result as a dimension (in~\texttt{pt}) suitable for use in dimension % expressions. The output is identical to \cs{fp_to_decimal:n}, with -% an additional trailing \texttt{pt}. In particular, the result may +% an additional trailing~\texttt{pt}. In particular, the result may % be outside the range $[- 2^{14} + 2^{-17}, 2^{14} - 2^{-17}]$ of % valid \TeX{} dimensions, leading to overflow errors if used as a -% dimension. The values $\pm\infty$ and \nan{} trigger an +% dimension. The values $\pm\infty$ and~\nan{} trigger an % \enquote{invalid operation} exception. % \end{function} % @@ -286,10 +288,11 @@ % \cs{fp_to_int:n} \Arg{floating point expression} % \end{syntax} % Evaluates the \meta{floating point expression}, and rounds the -% result to the closest integer, with ties rounded to an even integer. +% result to the closest integer, rounding exact ties to an even +% integer. % The result may be outside the range $[- 2^{31} + 1, 2^{31} - 1]$ of -% valid \TeX{} integers, triggering \TeX{} errors if used in an -% integer expression. The values $\pm\infty$ and \nan{} trigger +% valid \TeX{}~integers, leading to overflow errors if used in an +% integer expression. The values $\pm\infty$ and~\nan{} trigger % an \enquote{invalid operation} exception. % \end{function} % @@ -301,12 +304,12 @@ % \cs{fp_to_scientific:n} \Arg{floating point expression} % \end{syntax} % Evaluates the \meta{floating point expression} and expresses the -% result in scientific notation with $16$ significant figures: +% result in scientific notation: % \begin{quote} % \meta{optional \texttt{-}}\meta{digit}\texttt{.}\meta{15 digits}\texttt{e}\meta{optional sign}\meta{exponent} % \end{quote} % The leading \meta{digit} is non-zero except in the case of $\pm 0$. -% The values $\pm\infty$ and \nan{} trigger an \enquote{invalid +% The values $\pm\infty$ and~\nan{} trigger an \enquote{invalid % operation} exception. % \end{function} % @@ -319,13 +322,14 @@ % Evaluates the \meta{floating point expression} and expresses the % result in (almost) the shortest possible form. Numbers in the % ranges $(0,10^{-3})$ and $[10^{16},\infty)$ are expressed in -% scientific notation with trailing zeros trimmed (see +% scientific notation with trailing zeros trimmed and no decimal +% separator when there is a single significant digit (see % \cs{fp_to_scientific:n}). Numbers in the range $[10^{-3},10^{16})$ % are expressed in a decimal notation without exponent, with trailing % zeros trimmed, and no decimal separator for integer values (see -% \cs{fp_to_decimal:n}. Negative numbers start with |-|. The -% special values $\pm 0$, $\pm \inf$ and \nan{} are rendered as -% |0|, |-0|, \texttt{inf}, \texttt{-inf}, and \texttt{nan} +% \cs{fp_to_decimal:n}. Negative numbers start with~|-|. The +% special values $\pm 0$, $\pm\infty$ and~\nan{} are rendered as +% |0|, |-0|, \texttt{inf}, \texttt{-inf}, and~\texttt{nan} % respectively. % \end{function} % @@ -335,11 +339,11 @@ % \cs{fp_use:N} \meta{fp~var} % \end{syntax} % Inserts the value of the \meta{fp~var} into the input stream as a -% decimal number with $16$ significant figures and no exponent. +% decimal number with no exponent. % Leading or trailing zeros may be inserted to compensate for the % exponent. Non-significant trailing zeros are trimmed. Integers are -% expressed without a decimal separator. The values $\pm\infty$ and -% \nan{} trigger an \enquote{invalid operation} exception. This +% expressed without a decimal separator. The values $\pm\infty$ +% and~\nan{} trigger an \enquote{invalid operation} exception. This % function is identical to \cs{fp_to_decimal:N}. % \end{function} % @@ -356,30 +360,20 @@ % \end{function} % % \begin{function}[EXP, pTF, updated = 2012-05-08, -% tested = m3fp-logic001]{\fp_compare:nNn, \fp_compare:n} +% tested = m3fp-logic001]{\fp_compare:nNn} % \begin{syntax} % \cs{fp_compare_p:nNn} \Arg{fpexpr_1} \meta{relation} \Arg{fpexpr_2} % \cs{fp_compare:nNnTF} \Arg{fpexpr_1} \meta{relation} \Arg{fpexpr_2} \Arg{true code} \Arg{false code} -% \cs{fp_compare_p:n} \{ \meta{fpexpr_1} \meta{relation} \meta{fpexpr_2} \} -% \cs{fp_compare:nTF} \{ \meta{fpexpr_1} \meta{relation} \meta{fpexpr_2} \} \Arg{true code} \Arg{false code} % \end{syntax} % Compares the \meta{fpexpr_1} and the \meta{fpexpr_2}, and returns % \texttt{true} if the \meta{relation} is obeyed. Two floating point -% numbers $x$ and $y$ may obey four mutually exclusive relations: -% $x<y$, $x=y$, $x>y$, or $x$ and $y$ are not ordered. The latter -% case occurs exactly when one of the operands is \nan{}, and -% this relations is denoted by the symbol |?|. The \texttt{nNn} -% functions support the \meta{relations} |<|, |=|, |>|, and |?|. The -% \texttt{n} functions support as a \meta{relation} any non-empty string of -% those four symbols, plus optional leading |!| (which negate the -% \meta{relation}), with the restriction that the \meta{relation} may -% not start with |?|. Common choices of \meta{relation} include |>=| -% (greater or equal), |!=| (not equal), |!?| (comparable). Note that -% a \nan{} is distinct from any value, even another -% \nan{}, hence $x=x$ is not true for a \nan{}. -% Since a \nan{} is not comparable to any floating point, to test if a -% value is \nan{}, one can use the following, where~$0$ is an -% arbitrary floating point. +% numbers $x$ and~$y$ may obey four mutually exclusive relations: +% $x<y$, $x=y$, $x>y$, or $x$ and~$y$ are not ordered. The latter +% case occurs exactly when either operand is~\nan{}, and this relation +% is denoted by the symbol~|?|. Note that a~\nan{} is distinct from +% any value, even another~\nan{}, hence $x=x$ is not true for +% a~\nan{}. To test if a value is~\nan{}, compare it to an arbitrary +% number with the \enquote{not ordered} relation. % \begin{verbatim} % \fp_compare:nNnTF { <value> } ? { 0 } % { } % <value> is nan @@ -387,6 +381,54 @@ % \end{verbatim} % \end{function} % +% \begin{function}[EXP, pTF, updated = 2012-12-14, +% tested = m3fp-logic001]{\fp_compare:n} +% \begin{syntax} +% \cs{fp_compare_p:n} \\ +% ~~\{ \\ +% ~~~~\meta{fpexpr_1} \meta{relation_1} \\ +% ~~~~\ldots{} \\ +% ~~~~\meta{fpexpr_N} \meta{relation_N} \\ +% ~~~~\meta{fpexpr_{N+1}} \\ +% ~~\} \\ +% \cs{fp_compare:nTF} +% ~~\{ \\ +% ~~~~\meta{fpexpr_1} \meta{relation_1} \\ +% ~~~~\ldots{} \\ +% ~~~~\meta{fpexpr_N} \meta{relation_N} \\ +% ~~~~\meta{fpexpr_{N+1}} \\ +% ~~\} \\ +% ~~\Arg{true code} \Arg{false code} +% \end{syntax} +% Evaluates the \meta{floating point expressions} as described for +% \cs{fp_eval:n} and compares consecutive result using the +% corresponding \meta{relation}, namely it compares \meta{intexpr_1} +% and \meta{intexpr_2} using the \meta{relation_1}, then +% \meta{intexpr_2} and \meta{intexpr_3} using the \meta{relation_2}, +% until finally comparing \meta{intexpr_N} and \meta{intexpr_{N+1}} +% using the \meta{relation_N}. The test yields \texttt{true} if all +% comparisons are \texttt{true}. Each \meta{floating point +% expression} is evaluated only once. Contrarily to +% \cs{int_compare:nTF}, all \meta{floating point expressions} are +% computed, even if one comparison is \texttt{false}. Two floating +% point numbers $x$ and~$y$ may obey four mutually exclusive +% relations: $x<y$, $x=y$, $x>y$, or $x$ and~$y$ are not ordered. The +% latter case occurs exactly when one of the operands is~\nan{}, and +% this relation is denoted by the symbol~|?|. Each \meta{relation} +% can be any (non-empty) combination of |<|, |=|, |>|, and~|?|, plus +% 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$ +% 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 +% \meta{relation} starts with~|!| and the relation between $x$ and~$y$ +% does not appear within the \meta{relation}. Common choices of +% \meta{relation} include |>=|~(greater or equal), |!=|~(not equal), +% |!?|~or~|<=>| (comparable). +% \end{function} +% % \section{Floating point expression loops} % % \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003] @@ -513,8 +555,8 @@ % \end{variable} % % \begin{variable}[updated = 2012-05-08, updated = 2013-11-17]{\c_pi_fp} -% The value of $\pi$. This can be input directly in a floating point -% expression as \texttt{pi}. +% The value of~$\pi$. This can be input directly in a floating point +% expression as~\texttt{pi}. % \end{variable} % % \begin{variable}[added = 2012-05-08, updated = 2013-11-17] @@ -787,20 +829,29 @@ % \begin{syntax} % \cs{fp_eval:n} \{ \meta{operand_1} \texttt{&&} \meta{operand_2} \} % \end{syntax} -% If \meta{operand_1} is false (equal to $\pm 0$), use that value, +% If \meta{operand_1} is false (equal to~$\pm 0$), use that value, % otherwise the value of \meta{operand_2}. Both \meta{operands} are % evaluated in all cases. % \end{function} % \endgroup % -% \begin{function}[tested = m3fp-logic001]{\<, =, >, ?} +% \begin{function}[tested = m3fp-logic001, updated = 2013-12-14] +% {\<, =, >, ?} % \begin{syntax} -% \cs{fp_eval:n} \{ \meta{operand_1} \meta{comparison} \meta{operand_2} \} +% \cs{fp_eval:n} \\ +% ~~\{ \\ +% ~~~~\meta{operand_1} \meta{relation_1} \\ +% ~~~~\ldots{} \\ +% ~~~~\meta{operand_N} \meta{relation_N} \\ +% ~~~~\meta{operand_{N+1}} \\ +% ~~\} % \end{syntax} -% The \meta{comparison} consists of a non-empty string of |<|, |=|, -% |>|, and |?|, optionally preceded by |!|. It may not start with -% |?|. This evaluates to $+1$ if the \meta{comparison} between the -% \meta{operand_1} and \meta{operand_2} is true, and $+0$ otherwise. +% 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 +% $+0$ otherwise. All \meta{operands} are evaluated in all cases. +% See \cs{fp_compare:nTF} for details. % \end{function} % % \begin{function}[tested = m3fp-basics001]{+, -} @@ -893,27 +944,38 @@ % \nan{}. Those operations do not raise exceptions. % \end{function} % -% \begin{function}[tested = {m3fp-round001, m3fp-round002}] -% {round, round0, round+, round-} +% \begin{function} +% [tested = {m3fp-round001, m3fp-round002}, added = 2013-12-14] +% {round, trunc, ceil, floor} % \begin{syntax} -% \cs{fp_eval:n} \{ |round| \meta{option} |(| \meta{fpexpr} |)| \} -% \cs{fp_eval:n} \{ |round| \meta{option} |(| \meta{fpexpr_1} , \meta{fpexpr_2} |)| \} +% \cs{fp_eval:n} \{ |round| |(| \meta{fpexpr} |)| \} +% \cs{fp_eval:n} \{ |round| |(| \meta{fpexpr_1} , \meta{fpexpr_2} |)| \} % \end{syntax} -% Rounds \meta{fpexpr_1} to \meta{fpexpr_2} places. When -% \meta{fpexpr_2} is omitted, it is assumed to be $0$, \emph{i.e.}, -% \meta{fpexpr_1} is rounded to an integer. The \meta{option} -% controls the rounding direction: +% Evaluates $\meta{fpexpr_1}=x$ and $\meta{fpexpr_2}=n$, then rounds +% $x$~to $n$~places. If $n$~is an integer, this rounds~$x$ to a +% multiple of~$10^{-n}$; if $n=+\infty$, this always yields~$x$; if +% $n=-\infty$, this yields one of $\pm 0$, $\pm\infty$, or~\nan{}; if +% $n$~is neither $\pm\infty$ nor an integer, then an \enquote{invalid +% operation} exception is raised. When \meta{fpexpr_2} is omitted, +% $n=0$, \emph{i.e.}, \meta{fpexpr_1} is rounded to an integer. The +% rounding direction depends on the function: % \begin{itemize} -% \item by default, the operation rounds to the closest allowed number -% (rounding ties to even); -% \item with |0|, the operation rounds towards $0$, \emph{i.e.}, truncates; -% \item with |+|, the operation rounds towards $+\infty$; -% \item with |-|, the operation rounds towards $-\infty$. +% \item |round| yields the multiple of~$10^{-n}$ closest to~$x$, and +% if $x$~is half-way between two such multiples, the even multiple +% is chosen (\enquote{ties to even}); +% \item |floor|, or the deprecated |round-|, yields the largest +% multiple of~$10^{-n}$ smaller or equal to~$x$ (\enquote{round +% towards negative infinity}); +% \item |ceil|, or the deprecated |round+|, yields the smallest +% multiple of~$10^{-n}$ greater or equal to~$x$ (\enquote{round +% towards positive infinity}); +% \item |trunc|, or the deprecated |round0|, yields a multiple +% of~$10^{-n}$ with the same sign as~$x$ and with the largest +% absolute value less that that of~$x$ (\enquote{round towards +% zero}). % \end{itemize} -% If \meta{fpexpr_2} does not yield an integer less than $10^{8}$ in -% absolute value, then an \enquote{invalid operation} exception is -% raised. \enquote{Overflow} may occur if the result is infinite -% (this cannot happen unless $\meta{fpexpr_2}\string<-9984$). +% \enquote{Overflow} occurs if $x$~is finite and the result is +% infinite (this can only happen if $\meta{fpexpr_2}\string<-9984$). % \end{function} % % \begin{function}[updated = 2013-11-17, tested = m3fp-trig001] @@ -1058,6 +1120,17 @@ % exception can occur. % \end{function} % +% \begin{function}[added = 2013-12-14, tested = m3fp-basics005]{sqrt} +% \begin{syntax} +% \cs{fp_eval:n} \{ |sqrt(| \meta{fpexpr} |)| \} +% \end{syntax} +% Computes the square root of the \meta{fpexpr}. The \enquote{invalid +% operation} is raised when the \meta{fpexpr} is negative; no other +% exception can occur. Special values yield $\sqrt{-0} = -0$, +% $\sqrt{+0} = +0$, $\sqrt{+\infty} = +\infty$ and +% $\sqrt{\text{\nan{}}}=\text{\nan{}}$. +% \end{function} +% % \begin{variable}[tested = m3fp-parse001]{inf, nan} % The special values $+\infty$, $-\infty$, and \nan{} are represented % as \texttt{inf}, \texttt{-inf} and \texttt{nan} (see \cs{c_inf_fp}, @@ -1143,10 +1216,8 @@ % % The following need to be done. I'll try to time-order the items. % \begin{itemize} -% \item Rename |round0| to |trunc|, |round+| to |ceil|, and |round-| -% to |floor|. % \item Decide what exponent range to consider. -% \item Improve the treatment of signalling versus quiet \texttt{nan}. +% \item Support signalling \texttt{nan}. % \item Modulo and remainder, and rounding functions |quantize|, % |quantize0|, |quantize+|, |quantize-|, |quantize=|, |round=|. % Should the modulo also be provided as (catcode 12) |%|? @@ -1178,15 +1249,13 @@ % % Bugs. (Exclamation points mark important bugs.) % \begin{itemize} -% \item[!] $-3<-2<-1$ is wrongly parsed as $(-3<-2)<-1$. % \item Check that functions are monotonic when they should. % \item Add exceptions to |?:|, |!<=>?|, |&&|, \verb"||", and |!|. -% \item |round| should accept any integer as its second argument. % \item Logarithms of numbers very close to $1$ are inaccurate. % \item When rounding towards $-\infty$, |\dim_to_fp:n {0pt}| should % return $-0$, not $+0$. -% \item The result of $(\pm0)+(\pm0)$ should depend on the rounding -% mode. +% \item The result of $(\pm0)+(\pm0)$, of $x+(-x)$, and of $(-x)+x$ +% should depend on the rounding mode. % \item \texttt{0e9999999999} gives a \TeX{} \enquote{number too % large} error. % \item Subnormals are not implemented. @@ -1226,12 +1295,6 @@ % \item Add bibliography. Some of Kahan's articles, some previous % \TeX{} fp packages, the international standards,\ldots{} % \item Also take into account the \enquote{inexact} exception? -% \item (Likely not.) -% Change the internal representation of fp, by replacing braced -% groups of $4$ digits by delimited arguments. Also consider -% changing the fp structure a bit to allow using -% \cs{pdftex_strcmp:D} to compare (not in \LuaTeX{}: it is too -% slow)? % \item Support multi-character prefix operators (\emph{e.g.}, |@/| or % whatever)? Perhaps for including comments inside the computation % itself?? diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index e5c80030f7e..a825c0cad3b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -35,7 +35,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3keys.dtx 4581 2013-07-28 08:38:50Z joseph $ +\GetIdInfo$Id: l3keys.dtx 4614 2013-12-08 17:07:31Z joseph $ {L3 Experimental key-value interfaces} %</driver|package> %<*driver> @@ -209,7 +209,7 @@ % \begin{function}[added = 2011-08-21, updated = 2013-07-10] % {.choices:nn, .choices:Vn, .choices:on, .choices:xn} % \begin{syntax} -% \meta{key} .choices:nn \meta{choices} \meta{code} +% \meta{key} .choices:nn = \Arg{choices} \Arg{code} % \end{syntax} % Sets \meta{key} to act as a choice key, and defines a series \meta{choices} % which are implemented using the \meta{code}. Inside \meta{code}, @@ -232,7 +232,7 @@ % % \begin{function}[updated = 2013-07-10]{.code:n} % \begin{syntax} -% \meta{key} .code:n = \meta{code} +% \meta{key} .code:n = \Arg{code} % \end{syntax} % Stores the \meta{code} for execution when \meta{key} is used. The % The \meta{code} can include one parameter (|#1|), which will be the @@ -244,7 +244,7 @@ % \begin{function}[updated = 2013-07-09] % {.default:n, .default:V, .default:o, .default:x} % \begin{syntax} -% \meta{key} .default:n = \meta{default} +% \meta{key} .default:n = \Arg{default} % \end{syntax} % Creates a \meta{default} value for \meta{key}, which is used if no % value is given. This will be used if only the key name is given, @@ -285,7 +285,7 @@ % \begin{function}[added = 2013-07-14] % {.groups:n} % \begin{syntax} -% \meta{key} .groups:n = \meta{groups} +% \meta{key} .groups:n = \Arg{groups} % \end{syntax} % Defines \meta{key} as belonging to the \meta{groups} declared. Groups % provide a \enquote{secondary axis} for selectively setting keys, and are @@ -295,7 +295,7 @@ % \begin{function}[updated = 2013-07-09] % {.initial:n, .initial:V, .initial:o, .initial:x} % \begin{syntax} -% \meta{key} .initial:n = \meta{value} +% \meta{key} .initial:n = \Arg{value} % \end{syntax} % Initialises the \meta{key} with the \meta{value}, equivalent to % \begin{quote} @@ -345,7 +345,7 @@ % \begin{function}[added = 2011-08-21, updated = 2013-07-10] % {.multichoices:nn, .multichoices:Vn, .multichoices:on, .multichoices:xn} % \begin{syntax} -% \meta{key} .multichoices:nn \meta{choices} \meta{code} +% \meta{key} .multichoices:nn \Arg{choices} \Arg{code} % \end{syntax} % Sets \meta{key} to act as a multiple choice key, and defines a series % \meta{choices} @@ -717,8 +717,8 @@ % % \begin{function}[EXP,pTF]{\keys_if_exist:nn} % \begin{syntax} -% \cs{keys_if_exist_p:nn} \meta{module} \meta{key} \\ -% \cs{keys_if_exist:nnTF} \meta{module} \meta{key} \Arg{true code} \Arg{false code} +% \cs{keys_if_exist_p:nn} \Arg{module} \Arg{key} \\ +% \cs{keys_if_exist:nnTF} \Arg{module} \Arg{key} \Arg{true code} \Arg{false code} % \end{syntax} % Tests if the \meta{key} exists for \meta{module}, \emph{i.e.}~if any code % has been defined for \meta{key}. @@ -726,8 +726,8 @@ % % \begin{function}[added = 2011-08-21,EXP,pTF]{\keys_if_choice_exist:nnn} % \begin{syntax} -% \cs{keys_if_choice_exist_p:nnn} \meta{module} \meta{key} \meta{choice} \\ -% \cs{keys_if_choice_exist:nnnTF} \meta{module} \meta{key} \meta{choice} \Arg{true code} \Arg{false code} +% \cs{keys_if_choice_exist_p:nnn} \Arg{module} \Arg{key} \Arg{choice} \\ +% \cs{keys_if_choice_exist:nnnTF} \Arg{module} \Arg{key} \Arg{choice} \Arg{true code} \Arg{false code} % \end{syntax} % Tests if the \meta{choice} is defined for the \meta{key} within the % \meta{module}, \emph{i.e.}~if any code has been defined for diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 1a405873659..edabde36f6a 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-2012 The LaTeX3 project +%% File: l3names.dtx Copyright (C) 1990-2013 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 @@ -35,7 +35,7 @@ % %<*package> \RequirePackage{l3bootstrap}[2012/07/15] -\GetIdInfo$Id: l3names.dtx 4346 2012-12-07 13:46:13Z joseph $ +\GetIdInfo$Id: l3names.dtx 4630 2013-12-29 21:04:05Z joseph $ {L3 Namespace for primitives} %</package> %<*driver> @@ -128,16 +128,16 @@ % \end{macrocode} % % Everything is inside a (rather long) group, which keeps -% \cs{__expl_primitive:NN} trapped. +% \cs{__kernel_primitive:NN} trapped. % \begin{macrocode} \begingroup % \end{macrocode} % -% \begin{macro}[aux]{\__expl_primitive:NN} +% \begin{macro}[aux]{\__kernel_primitive:NN} % A temporary function to actually do the renaming. This also allows the % original names to be removed in format mode. % \begin{macrocode} - \long \def \__expl_primitive:NN #1#2 + \long \def \__kernel_primitive:NN #1#2 { \tex_global:D \tex_let:D #2 #1 %<*initex> @@ -153,406 +153,406 @@ % These are given modified new names, so that they may be entered % without catcode tricks. % \begin{macrocode} - \__expl_primitive:NN \ \tex_space:D - \__expl_primitive:NN \/ \tex_italiccorrection:D - \__expl_primitive:NN \- \tex_hyphen:D + \__kernel_primitive:NN \ \tex_space:D + \__kernel_primitive:NN \/ \tex_italiccorrection:D + \__kernel_primitive:NN \- \tex_hyphen:D % \end{macrocode} % % Now all the other primitives. % \begin{macrocode} - \__expl_primitive:NN \let \tex_let:D - \__expl_primitive:NN \def \tex_def:D - \__expl_primitive:NN \edef \tex_edef:D - \__expl_primitive:NN \gdef \tex_gdef:D - \__expl_primitive:NN \xdef \tex_xdef:D - \__expl_primitive:NN \chardef \tex_chardef:D - \__expl_primitive:NN \countdef \tex_countdef:D - \__expl_primitive:NN \dimendef \tex_dimendef:D - \__expl_primitive:NN \skipdef \tex_skipdef:D - \__expl_primitive:NN \muskipdef \tex_muskipdef:D - \__expl_primitive:NN \mathchardef \tex_mathchardef:D - \__expl_primitive:NN \toksdef \tex_toksdef:D - \__expl_primitive:NN \futurelet \tex_futurelet:D - \__expl_primitive:NN \advance \tex_advance:D - \__expl_primitive:NN \divide \tex_divide:D - \__expl_primitive:NN \multiply \tex_multiply:D - \__expl_primitive:NN \font \tex_font:D - \__expl_primitive:NN \fam \tex_fam:D - \__expl_primitive:NN \global \tex_global:D - \__expl_primitive:NN \long \tex_long:D - \__expl_primitive:NN \outer \tex_outer:D - \__expl_primitive:NN \setlanguage \tex_setlanguage:D - \__expl_primitive:NN \globaldefs \tex_globaldefs:D - \__expl_primitive:NN \afterassignment \tex_afterassignment:D - \__expl_primitive:NN \aftergroup \tex_aftergroup:D - \__expl_primitive:NN \expandafter \tex_expandafter:D - \__expl_primitive:NN \noexpand \tex_noexpand:D - \__expl_primitive:NN \begingroup \tex_begingroup:D - \__expl_primitive:NN \endgroup \tex_endgroup:D - \__expl_primitive:NN \halign \tex_halign:D - \__expl_primitive:NN \valign \tex_valign:D - \__expl_primitive:NN \cr \tex_cr:D - \__expl_primitive:NN \crcr \tex_crcr:D - \__expl_primitive:NN \noalign \tex_noalign:D - \__expl_primitive:NN \omit \tex_omit:D - \__expl_primitive:NN \span \tex_span:D - \__expl_primitive:NN \tabskip \tex_tabskip:D - \__expl_primitive:NN \everycr \tex_everycr:D - \__expl_primitive:NN \if \tex_if:D - \__expl_primitive:NN \ifcase \tex_ifcase:D - \__expl_primitive:NN \ifcat \tex_ifcat:D - \__expl_primitive:NN \ifnum \tex_ifnum:D - \__expl_primitive:NN \ifodd \tex_ifodd:D - \__expl_primitive:NN \ifdim \tex_ifdim:D - \__expl_primitive:NN \ifeof \tex_ifeof:D - \__expl_primitive:NN \ifhbox \tex_ifhbox:D - \__expl_primitive:NN \ifvbox \tex_ifvbox:D - \__expl_primitive:NN \ifvoid \tex_ifvoid:D - \__expl_primitive:NN \ifx \tex_ifx:D - \__expl_primitive:NN \iffalse \tex_iffalse:D - \__expl_primitive:NN \iftrue \tex_iftrue:D - \__expl_primitive:NN \ifhmode \tex_ifhmode:D - \__expl_primitive:NN \ifmmode \tex_ifmmode:D - \__expl_primitive:NN \ifvmode \tex_ifvmode:D - \__expl_primitive:NN \ifinner \tex_ifinner:D - \__expl_primitive:NN \else \tex_else:D - \__expl_primitive:NN \fi \tex_fi:D - \__expl_primitive:NN \or \tex_or:D - \__expl_primitive:NN \immediate \tex_immediate:D - \__expl_primitive:NN \closeout \tex_closeout:D - \__expl_primitive:NN \openin \tex_openin:D - \__expl_primitive:NN \openout \tex_openout:D - \__expl_primitive:NN \read \tex_read:D - \__expl_primitive:NN \write \tex_write:D - \__expl_primitive:NN \closein \tex_closein:D - \__expl_primitive:NN \newlinechar \tex_newlinechar:D - \__expl_primitive:NN \input \tex_input:D - \__expl_primitive:NN \endinput \tex_endinput:D - \__expl_primitive:NN \inputlineno \tex_inputlineno:D - \__expl_primitive:NN \errmessage \tex_errmessage:D - \__expl_primitive:NN \message \tex_message:D - \__expl_primitive:NN \show \tex_show:D - \__expl_primitive:NN \showthe \tex_showthe:D - \__expl_primitive:NN \showbox \tex_showbox:D - \__expl_primitive:NN \showlists \tex_showlists:D - \__expl_primitive:NN \errhelp \tex_errhelp:D - \__expl_primitive:NN \errorcontextlines \tex_errorcontextlines:D - \__expl_primitive:NN \tracingcommands \tex_tracingcommands:D - \__expl_primitive:NN \tracinglostchars \tex_tracinglostchars:D - \__expl_primitive:NN \tracingmacros \tex_tracingmacros:D - \__expl_primitive:NN \tracingonline \tex_tracingonline:D - \__expl_primitive:NN \tracingoutput \tex_tracingoutput:D - \__expl_primitive:NN \tracingpages \tex_tracingpages:D - \__expl_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D - \__expl_primitive:NN \tracingrestores \tex_tracingrestores:D - \__expl_primitive:NN \tracingstats \tex_tracingstats:D - \__expl_primitive:NN \pausing \tex_pausing:D - \__expl_primitive:NN \showboxbreadth \tex_showboxbreadth:D - \__expl_primitive:NN \showboxdepth \tex_showboxdepth:D - \__expl_primitive:NN \batchmode \tex_batchmode:D - \__expl_primitive:NN \errorstopmode \tex_errorstopmode:D - \__expl_primitive:NN \nonstopmode \tex_nonstopmode:D - \__expl_primitive:NN \scrollmode \tex_scrollmode:D - \__expl_primitive:NN \end \tex_end:D - \__expl_primitive:NN \csname \tex_csname:D - \__expl_primitive:NN \endcsname \tex_endcsname:D - \__expl_primitive:NN \ignorespaces \tex_ignorespaces:D - \__expl_primitive:NN \relax \tex_relax:D - \__expl_primitive:NN \the \tex_the:D - \__expl_primitive:NN \mag \tex_mag:D - \__expl_primitive:NN \language \tex_language:D - \__expl_primitive:NN \mark \tex_mark:D - \__expl_primitive:NN \topmark \tex_topmark:D - \__expl_primitive:NN \firstmark \tex_firstmark:D - \__expl_primitive:NN \botmark \tex_botmark:D - \__expl_primitive:NN \splitfirstmark \tex_splitfirstmark:D - \__expl_primitive:NN \splitbotmark \tex_splitbotmark:D - \__expl_primitive:NN \fontname \tex_fontname:D - \__expl_primitive:NN \escapechar \tex_escapechar:D - \__expl_primitive:NN \endlinechar \tex_endlinechar:D - \__expl_primitive:NN \mathchoice \tex_mathchoice:D - \__expl_primitive:NN \delimiter \tex_delimiter:D - \__expl_primitive:NN \mathaccent \tex_mathaccent:D - \__expl_primitive:NN \mathchar \tex_mathchar:D - \__expl_primitive:NN \mskip \tex_mskip:D - \__expl_primitive:NN \radical \tex_radical:D - \__expl_primitive:NN \vcenter \tex_vcenter:D - \__expl_primitive:NN \mkern \tex_mkern:D - \__expl_primitive:NN \above \tex_above:D - \__expl_primitive:NN \abovewithdelims \tex_abovewithdelims:D - \__expl_primitive:NN \atop \tex_atop:D - \__expl_primitive:NN \atopwithdelims \tex_atopwithdelims:D - \__expl_primitive:NN \over \tex_over:D - \__expl_primitive:NN \overwithdelims \tex_overwithdelims:D - \__expl_primitive:NN \displaystyle \tex_displaystyle:D - \__expl_primitive:NN \textstyle \tex_textstyle:D - \__expl_primitive:NN \scriptstyle \tex_scriptstyle:D - \__expl_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D - \__expl_primitive:NN \nonscript \tex_nonscript:D - \__expl_primitive:NN \eqno \tex_eqno:D - \__expl_primitive:NN \leqno \tex_leqno:D - \__expl_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D - \__expl_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D - \__expl_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D - \__expl_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D - \__expl_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D - \__expl_primitive:NN \displayindent \tex_displayindent:D - \__expl_primitive:NN \displaywidth \tex_displaywidth:D - \__expl_primitive:NN \everydisplay \tex_everydisplay:D - \__expl_primitive:NN \predisplaysize \tex_predisplaysize:D - \__expl_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D - \__expl_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D - \__expl_primitive:NN \mathbin \tex_mathbin:D - \__expl_primitive:NN \mathclose \tex_mathclose:D - \__expl_primitive:NN \mathinner \tex_mathinner:D - \__expl_primitive:NN \mathop \tex_mathop:D - \__expl_primitive:NN \displaylimits \tex_displaylimits:D - \__expl_primitive:NN \limits \tex_limits:D - \__expl_primitive:NN \nolimits \tex_nolimits:D - \__expl_primitive:NN \mathopen \tex_mathopen:D - \__expl_primitive:NN \mathord \tex_mathord:D - \__expl_primitive:NN \mathpunct \tex_mathpunct:D - \__expl_primitive:NN \mathrel \tex_mathrel:D - \__expl_primitive:NN \overline \tex_overline:D - \__expl_primitive:NN \underline \tex_underline:D - \__expl_primitive:NN \left \tex_left:D - \__expl_primitive:NN \right \tex_right:D - \__expl_primitive:NN \binoppenalty \tex_binoppenalty:D - \__expl_primitive:NN \relpenalty \tex_relpenalty:D - \__expl_primitive:NN \delimitershortfall \tex_delimitershortfall:D - \__expl_primitive:NN \delimiterfactor \tex_delimiterfactor:D - \__expl_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D - \__expl_primitive:NN \everymath \tex_everymath:D - \__expl_primitive:NN \mathsurround \tex_mathsurround:D - \__expl_primitive:NN \medmuskip \tex_medmuskip:D - \__expl_primitive:NN \thinmuskip \tex_thinmuskip:D - \__expl_primitive:NN \thickmuskip \tex_thickmuskip:D - \__expl_primitive:NN \scriptspace \tex_scriptspace:D - \__expl_primitive:NN \noboundary \tex_noboundary:D - \__expl_primitive:NN \accent \tex_accent:D - \__expl_primitive:NN \char \tex_char:D - \__expl_primitive:NN \discretionary \tex_discretionary:D - \__expl_primitive:NN \hfil \tex_hfil:D - \__expl_primitive:NN \hfilneg \tex_hfilneg:D - \__expl_primitive:NN \hfill \tex_hfill:D - \__expl_primitive:NN \hskip \tex_hskip:D - \__expl_primitive:NN \hss \tex_hss:D - \__expl_primitive:NN \vfil \tex_vfil:D - \__expl_primitive:NN \vfilneg \tex_vfilneg:D - \__expl_primitive:NN \vfill \tex_vfill:D - \__expl_primitive:NN \vskip \tex_vskip:D - \__expl_primitive:NN \vss \tex_vss:D - \__expl_primitive:NN \unskip \tex_unskip:D - \__expl_primitive:NN \kern \tex_kern:D - \__expl_primitive:NN \unkern \tex_unkern:D - \__expl_primitive:NN \hrule \tex_hrule:D - \__expl_primitive:NN \vrule \tex_vrule:D - \__expl_primitive:NN \leaders \tex_leaders:D - \__expl_primitive:NN \cleaders \tex_cleaders:D - \__expl_primitive:NN \xleaders \tex_xleaders:D - \__expl_primitive:NN \lastkern \tex_lastkern:D - \__expl_primitive:NN \lastskip \tex_lastskip:D - \__expl_primitive:NN \indent \tex_indent:D - \__expl_primitive:NN \par \tex_par:D - \__expl_primitive:NN \noindent \tex_noindent:D - \__expl_primitive:NN \vadjust \tex_vadjust:D - \__expl_primitive:NN \baselineskip \tex_baselineskip:D - \__expl_primitive:NN \lineskip \tex_lineskip:D - \__expl_primitive:NN \lineskiplimit \tex_lineskiplimit:D - \__expl_primitive:NN \clubpenalty \tex_clubpenalty:D - \__expl_primitive:NN \widowpenalty \tex_widowpenalty:D - \__expl_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D - \__expl_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D - \__expl_primitive:NN \linepenalty \tex_linepenalty:D - \__expl_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D - \__expl_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D - \__expl_primitive:NN \adjdemerits \tex_adjdemerits:D - \__expl_primitive:NN \hangafter \tex_hangafter:D - \__expl_primitive:NN \hangindent \tex_hangindent:D - \__expl_primitive:NN \parshape \tex_parshape:D - \__expl_primitive:NN \hsize \tex_hsize:D - \__expl_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D - \__expl_primitive:NN \righthyphenmin \tex_righthyphenmin:D - \__expl_primitive:NN \leftskip \tex_leftskip:D - \__expl_primitive:NN \rightskip \tex_rightskip:D - \__expl_primitive:NN \looseness \tex_looseness:D - \__expl_primitive:NN \parskip \tex_parskip:D - \__expl_primitive:NN \parindent \tex_parindent:D - \__expl_primitive:NN \uchyph \tex_uchyph:D - \__expl_primitive:NN \emergencystretch \tex_emergencystretch:D - \__expl_primitive:NN \pretolerance \tex_pretolerance:D - \__expl_primitive:NN \tolerance \tex_tolerance:D - \__expl_primitive:NN \spaceskip \tex_spaceskip:D - \__expl_primitive:NN \xspaceskip \tex_xspaceskip:D - \__expl_primitive:NN \parfillskip \tex_parfillskip:D - \__expl_primitive:NN \everypar \tex_everypar:D - \__expl_primitive:NN \prevgraf \tex_prevgraf:D - \__expl_primitive:NN \spacefactor \tex_spacefactor:D - \__expl_primitive:NN \shipout \tex_shipout:D - \__expl_primitive:NN \vsize \tex_vsize:D - \__expl_primitive:NN \interlinepenalty \tex_interlinepenalty:D - \__expl_primitive:NN \brokenpenalty \tex_brokenpenalty:D - \__expl_primitive:NN \topskip \tex_topskip:D - \__expl_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D - \__expl_primitive:NN \maxdepth \tex_maxdepth:D - \__expl_primitive:NN \output \tex_output:D - \__expl_primitive:NN \deadcycles \tex_deadcycles:D - \__expl_primitive:NN \pagedepth \tex_pagedepth:D - \__expl_primitive:NN \pagestretch \tex_pagestretch:D - \__expl_primitive:NN \pagefilstretch \tex_pagefilstretch:D - \__expl_primitive:NN \pagefillstretch \tex_pagefillstretch:D - \__expl_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D - \__expl_primitive:NN \pageshrink \tex_pageshrink:D - \__expl_primitive:NN \pagegoal \tex_pagegoal:D - \__expl_primitive:NN \pagetotal \tex_pagetotal:D - \__expl_primitive:NN \outputpenalty \tex_outputpenalty:D - \__expl_primitive:NN \hoffset \tex_hoffset:D - \__expl_primitive:NN \voffset \tex_voffset:D - \__expl_primitive:NN \insert \tex_insert:D - \__expl_primitive:NN \holdinginserts \tex_holdinginserts:D - \__expl_primitive:NN \floatingpenalty \tex_floatingpenalty:D - \__expl_primitive:NN \insertpenalties \tex_insertpenalties:D - \__expl_primitive:NN \lower \tex_lower:D - \__expl_primitive:NN \moveleft \tex_moveleft:D - \__expl_primitive:NN \moveright \tex_moveright:D - \__expl_primitive:NN \raise \tex_raise:D - \__expl_primitive:NN \copy \tex_copy:D - \__expl_primitive:NN \lastbox \tex_lastbox:D - \__expl_primitive:NN \vsplit \tex_vsplit:D - \__expl_primitive:NN \unhbox \tex_unhbox:D - \__expl_primitive:NN \unhcopy \tex_unhcopy:D - \__expl_primitive:NN \unvbox \tex_unvbox:D - \__expl_primitive:NN \unvcopy \tex_unvcopy:D - \__expl_primitive:NN \setbox \tex_setbox:D - \__expl_primitive:NN \hbox \tex_hbox:D - \__expl_primitive:NN \vbox \tex_vbox:D - \__expl_primitive:NN \vtop \tex_vtop:D - \__expl_primitive:NN \prevdepth \tex_prevdepth:D - \__expl_primitive:NN \badness \tex_badness:D - \__expl_primitive:NN \hbadness \tex_hbadness:D - \__expl_primitive:NN \vbadness \tex_vbadness:D - \__expl_primitive:NN \hfuzz \tex_hfuzz:D - \__expl_primitive:NN \vfuzz \tex_vfuzz:D - \__expl_primitive:NN \overfullrule \tex_overfullrule:D - \__expl_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D - \__expl_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D - \__expl_primitive:NN \splittopskip \tex_splittopskip:D - \__expl_primitive:NN \everyhbox \tex_everyhbox:D - \__expl_primitive:NN \everyvbox \tex_everyvbox:D - \__expl_primitive:NN \nullfont \tex_nullfont:D - \__expl_primitive:NN \textfont \tex_textfont:D - \__expl_primitive:NN \scriptfont \tex_scriptfont:D - \__expl_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D - \__expl_primitive:NN \fontdimen \tex_fontdimen:D - \__expl_primitive:NN \hyphenchar \tex_hyphenchar:D - \__expl_primitive:NN \skewchar \tex_skewchar:D - \__expl_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D - \__expl_primitive:NN \defaultskewchar \tex_defaultskewchar:D - \__expl_primitive:NN \number \tex_number:D - \__expl_primitive:NN \romannumeral \tex_romannumeral:D - \__expl_primitive:NN \string \tex_string:D - \__expl_primitive:NN \lowercase \tex_lowercase:D - \__expl_primitive:NN \uppercase \tex_uppercase:D - \__expl_primitive:NN \meaning \tex_meaning:D - \__expl_primitive:NN \penalty \tex_penalty:D - \__expl_primitive:NN \unpenalty \tex_unpenalty:D - \__expl_primitive:NN \lastpenalty \tex_lastpenalty:D - \__expl_primitive:NN \special \tex_special:D - \__expl_primitive:NN \dump \tex_dump:D - \__expl_primitive:NN \patterns \tex_patterns:D - \__expl_primitive:NN \hyphenation \tex_hyphenation:D - \__expl_primitive:NN \time \tex_time:D - \__expl_primitive:NN \day \tex_day:D - \__expl_primitive:NN \month \tex_month:D - \__expl_primitive:NN \year \tex_year:D - \__expl_primitive:NN \jobname \tex_jobname:D - \__expl_primitive:NN \everyjob \tex_everyjob:D - \__expl_primitive:NN \count \tex_count:D - \__expl_primitive:NN \dimen \tex_dimen:D - \__expl_primitive:NN \skip \tex_skip:D - \__expl_primitive:NN \toks \tex_toks:D - \__expl_primitive:NN \muskip \tex_muskip:D - \__expl_primitive:NN \box \tex_box:D - \__expl_primitive:NN \wd \tex_wd:D - \__expl_primitive:NN \ht \tex_ht:D - \__expl_primitive:NN \dp \tex_dp:D - \__expl_primitive:NN \catcode \tex_catcode:D - \__expl_primitive:NN \delcode \tex_delcode:D - \__expl_primitive:NN \sfcode \tex_sfcode:D - \__expl_primitive:NN \lccode \tex_lccode:D - \__expl_primitive:NN \uccode \tex_uccode:D - \__expl_primitive:NN \mathcode \tex_mathcode:D + \__kernel_primitive:NN \let \tex_let:D + \__kernel_primitive:NN \def \tex_def:D + \__kernel_primitive:NN \edef \tex_edef:D + \__kernel_primitive:NN \gdef \tex_gdef:D + \__kernel_primitive:NN \xdef \tex_xdef:D + \__kernel_primitive:NN \chardef \tex_chardef:D + \__kernel_primitive:NN \countdef \tex_countdef:D + \__kernel_primitive:NN \dimendef \tex_dimendef:D + \__kernel_primitive:NN \skipdef \tex_skipdef:D + \__kernel_primitive:NN \muskipdef \tex_muskipdef:D + \__kernel_primitive:NN \mathchardef \tex_mathchardef:D + \__kernel_primitive:NN \toksdef \tex_toksdef:D + \__kernel_primitive:NN \futurelet \tex_futurelet:D + \__kernel_primitive:NN \advance \tex_advance:D + \__kernel_primitive:NN \divide \tex_divide:D + \__kernel_primitive:NN \multiply \tex_multiply:D + \__kernel_primitive:NN \font \tex_font:D + \__kernel_primitive:NN \fam \tex_fam:D + \__kernel_primitive:NN \global \tex_global:D + \__kernel_primitive:NN \long \tex_long:D + \__kernel_primitive:NN \outer \tex_outer:D + \__kernel_primitive:NN \setlanguage \tex_setlanguage:D + \__kernel_primitive:NN \globaldefs \tex_globaldefs:D + \__kernel_primitive:NN \afterassignment \tex_afterassignment:D + \__kernel_primitive:NN \aftergroup \tex_aftergroup:D + \__kernel_primitive:NN \expandafter \tex_expandafter:D + \__kernel_primitive:NN \noexpand \tex_noexpand:D + \__kernel_primitive:NN \begingroup \tex_begingroup:D + \__kernel_primitive:NN \endgroup \tex_endgroup:D + \__kernel_primitive:NN \halign \tex_halign:D + \__kernel_primitive:NN \valign \tex_valign:D + \__kernel_primitive:NN \cr \tex_cr:D + \__kernel_primitive:NN \crcr \tex_crcr:D + \__kernel_primitive:NN \noalign \tex_noalign:D + \__kernel_primitive:NN \omit \tex_omit:D + \__kernel_primitive:NN \span \tex_span:D + \__kernel_primitive:NN \tabskip \tex_tabskip:D + \__kernel_primitive:NN \everycr \tex_everycr:D + \__kernel_primitive:NN \if \tex_if:D + \__kernel_primitive:NN \ifcase \tex_ifcase:D + \__kernel_primitive:NN \ifcat \tex_ifcat:D + \__kernel_primitive:NN \ifnum \tex_ifnum:D + \__kernel_primitive:NN \ifodd \tex_ifodd:D + \__kernel_primitive:NN \ifdim \tex_ifdim:D + \__kernel_primitive:NN \ifeof \tex_ifeof:D + \__kernel_primitive:NN \ifhbox \tex_ifhbox:D + \__kernel_primitive:NN \ifvbox \tex_ifvbox:D + \__kernel_primitive:NN \ifvoid \tex_ifvoid:D + \__kernel_primitive:NN \ifx \tex_ifx:D + \__kernel_primitive:NN \iffalse \tex_iffalse:D + \__kernel_primitive:NN \iftrue \tex_iftrue:D + \__kernel_primitive:NN \ifhmode \tex_ifhmode:D + \__kernel_primitive:NN \ifmmode \tex_ifmmode:D + \__kernel_primitive:NN \ifvmode \tex_ifvmode:D + \__kernel_primitive:NN \ifinner \tex_ifinner:D + \__kernel_primitive:NN \else \tex_else:D + \__kernel_primitive:NN \fi \tex_fi:D + \__kernel_primitive:NN \or \tex_or:D + \__kernel_primitive:NN \immediate \tex_immediate:D + \__kernel_primitive:NN \closeout \tex_closeout:D + \__kernel_primitive:NN \openin \tex_openin:D + \__kernel_primitive:NN \openout \tex_openout:D + \__kernel_primitive:NN \read \tex_read:D + \__kernel_primitive:NN \write \tex_write:D + \__kernel_primitive:NN \closein \tex_closein:D + \__kernel_primitive:NN \newlinechar \tex_newlinechar:D + \__kernel_primitive:NN \input \tex_input:D + \__kernel_primitive:NN \endinput \tex_endinput:D + \__kernel_primitive:NN \inputlineno \tex_inputlineno:D + \__kernel_primitive:NN \errmessage \tex_errmessage:D + \__kernel_primitive:NN \message \tex_message:D + \__kernel_primitive:NN \show \tex_show:D + \__kernel_primitive:NN \showthe \tex_showthe:D + \__kernel_primitive:NN \showbox \tex_showbox:D + \__kernel_primitive:NN \showlists \tex_showlists:D + \__kernel_primitive:NN \errhelp \tex_errhelp:D + \__kernel_primitive:NN \errorcontextlines \tex_errorcontextlines:D + \__kernel_primitive:NN \tracingcommands \tex_tracingcommands:D + \__kernel_primitive:NN \tracinglostchars \tex_tracinglostchars:D + \__kernel_primitive:NN \tracingmacros \tex_tracingmacros:D + \__kernel_primitive:NN \tracingonline \tex_tracingonline:D + \__kernel_primitive:NN \tracingoutput \tex_tracingoutput:D + \__kernel_primitive:NN \tracingpages \tex_tracingpages:D + \__kernel_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D + \__kernel_primitive:NN \tracingrestores \tex_tracingrestores:D + \__kernel_primitive:NN \tracingstats \tex_tracingstats:D + \__kernel_primitive:NN \pausing \tex_pausing:D + \__kernel_primitive:NN \showboxbreadth \tex_showboxbreadth:D + \__kernel_primitive:NN \showboxdepth \tex_showboxdepth:D + \__kernel_primitive:NN \batchmode \tex_batchmode:D + \__kernel_primitive:NN \errorstopmode \tex_errorstopmode:D + \__kernel_primitive:NN \nonstopmode \tex_nonstopmode:D + \__kernel_primitive:NN \scrollmode \tex_scrollmode:D + \__kernel_primitive:NN \end \tex_end:D + \__kernel_primitive:NN \csname \tex_csname:D + \__kernel_primitive:NN \endcsname \tex_endcsname:D + \__kernel_primitive:NN \ignorespaces \tex_ignorespaces:D + \__kernel_primitive:NN \relax \tex_relax:D + \__kernel_primitive:NN \the \tex_the:D + \__kernel_primitive:NN \mag \tex_mag:D + \__kernel_primitive:NN \language \tex_language:D + \__kernel_primitive:NN \mark \tex_mark:D + \__kernel_primitive:NN \topmark \tex_topmark:D + \__kernel_primitive:NN \firstmark \tex_firstmark:D + \__kernel_primitive:NN \botmark \tex_botmark:D + \__kernel_primitive:NN \splitfirstmark \tex_splitfirstmark:D + \__kernel_primitive:NN \splitbotmark \tex_splitbotmark:D + \__kernel_primitive:NN \fontname \tex_fontname:D + \__kernel_primitive:NN \escapechar \tex_escapechar:D + \__kernel_primitive:NN \endlinechar \tex_endlinechar:D + \__kernel_primitive:NN \mathchoice \tex_mathchoice:D + \__kernel_primitive:NN \delimiter \tex_delimiter:D + \__kernel_primitive:NN \mathaccent \tex_mathaccent:D + \__kernel_primitive:NN \mathchar \tex_mathchar:D + \__kernel_primitive:NN \mskip \tex_mskip:D + \__kernel_primitive:NN \radical \tex_radical:D + \__kernel_primitive:NN \vcenter \tex_vcenter:D + \__kernel_primitive:NN \mkern \tex_mkern:D + \__kernel_primitive:NN \above \tex_above:D + \__kernel_primitive:NN \abovewithdelims \tex_abovewithdelims:D + \__kernel_primitive:NN \atop \tex_atop:D + \__kernel_primitive:NN \atopwithdelims \tex_atopwithdelims:D + \__kernel_primitive:NN \over \tex_over:D + \__kernel_primitive:NN \overwithdelims \tex_overwithdelims:D + \__kernel_primitive:NN \displaystyle \tex_displaystyle:D + \__kernel_primitive:NN \textstyle \tex_textstyle:D + \__kernel_primitive:NN \scriptstyle \tex_scriptstyle:D + \__kernel_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D + \__kernel_primitive:NN \nonscript \tex_nonscript:D + \__kernel_primitive:NN \eqno \tex_eqno:D + \__kernel_primitive:NN \leqno \tex_leqno:D + \__kernel_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D + \__kernel_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D + \__kernel_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D + \__kernel_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D + \__kernel_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D + \__kernel_primitive:NN \displayindent \tex_displayindent:D + \__kernel_primitive:NN \displaywidth \tex_displaywidth:D + \__kernel_primitive:NN \everydisplay \tex_everydisplay:D + \__kernel_primitive:NN \predisplaysize \tex_predisplaysize:D + \__kernel_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D + \__kernel_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D + \__kernel_primitive:NN \mathbin \tex_mathbin:D + \__kernel_primitive:NN \mathclose \tex_mathclose:D + \__kernel_primitive:NN \mathinner \tex_mathinner:D + \__kernel_primitive:NN \mathop \tex_mathop:D + \__kernel_primitive:NN \displaylimits \tex_displaylimits:D + \__kernel_primitive:NN \limits \tex_limits:D + \__kernel_primitive:NN \nolimits \tex_nolimits:D + \__kernel_primitive:NN \mathopen \tex_mathopen:D + \__kernel_primitive:NN \mathord \tex_mathord:D + \__kernel_primitive:NN \mathpunct \tex_mathpunct:D + \__kernel_primitive:NN \mathrel \tex_mathrel:D + \__kernel_primitive:NN \overline \tex_overline:D + \__kernel_primitive:NN \underline \tex_underline:D + \__kernel_primitive:NN \left \tex_left:D + \__kernel_primitive:NN \right \tex_right:D + \__kernel_primitive:NN \binoppenalty \tex_binoppenalty:D + \__kernel_primitive:NN \relpenalty \tex_relpenalty:D + \__kernel_primitive:NN \delimitershortfall \tex_delimitershortfall:D + \__kernel_primitive:NN \delimiterfactor \tex_delimiterfactor:D + \__kernel_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D + \__kernel_primitive:NN \everymath \tex_everymath:D + \__kernel_primitive:NN \mathsurround \tex_mathsurround:D + \__kernel_primitive:NN \medmuskip \tex_medmuskip:D + \__kernel_primitive:NN \thinmuskip \tex_thinmuskip:D + \__kernel_primitive:NN \thickmuskip \tex_thickmuskip:D + \__kernel_primitive:NN \scriptspace \tex_scriptspace:D + \__kernel_primitive:NN \noboundary \tex_noboundary:D + \__kernel_primitive:NN \accent \tex_accent:D + \__kernel_primitive:NN \char \tex_char:D + \__kernel_primitive:NN \discretionary \tex_discretionary:D + \__kernel_primitive:NN \hfil \tex_hfil:D + \__kernel_primitive:NN \hfilneg \tex_hfilneg:D + \__kernel_primitive:NN \hfill \tex_hfill:D + \__kernel_primitive:NN \hskip \tex_hskip:D + \__kernel_primitive:NN \hss \tex_hss:D + \__kernel_primitive:NN \vfil \tex_vfil:D + \__kernel_primitive:NN \vfilneg \tex_vfilneg:D + \__kernel_primitive:NN \vfill \tex_vfill:D + \__kernel_primitive:NN \vskip \tex_vskip:D + \__kernel_primitive:NN \vss \tex_vss:D + \__kernel_primitive:NN \unskip \tex_unskip:D + \__kernel_primitive:NN \kern \tex_kern:D + \__kernel_primitive:NN \unkern \tex_unkern:D + \__kernel_primitive:NN \hrule \tex_hrule:D + \__kernel_primitive:NN \vrule \tex_vrule:D + \__kernel_primitive:NN \leaders \tex_leaders:D + \__kernel_primitive:NN \cleaders \tex_cleaders:D + \__kernel_primitive:NN \xleaders \tex_xleaders:D + \__kernel_primitive:NN \lastkern \tex_lastkern:D + \__kernel_primitive:NN \lastskip \tex_lastskip:D + \__kernel_primitive:NN \indent \tex_indent:D + \__kernel_primitive:NN \par \tex_par:D + \__kernel_primitive:NN \noindent \tex_noindent:D + \__kernel_primitive:NN \vadjust \tex_vadjust:D + \__kernel_primitive:NN \baselineskip \tex_baselineskip:D + \__kernel_primitive:NN \lineskip \tex_lineskip:D + \__kernel_primitive:NN \lineskiplimit \tex_lineskiplimit:D + \__kernel_primitive:NN \clubpenalty \tex_clubpenalty:D + \__kernel_primitive:NN \widowpenalty \tex_widowpenalty:D + \__kernel_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D + \__kernel_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D + \__kernel_primitive:NN \linepenalty \tex_linepenalty:D + \__kernel_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D + \__kernel_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D + \__kernel_primitive:NN \adjdemerits \tex_adjdemerits:D + \__kernel_primitive:NN \hangafter \tex_hangafter:D + \__kernel_primitive:NN \hangindent \tex_hangindent:D + \__kernel_primitive:NN \parshape \tex_parshape:D + \__kernel_primitive:NN \hsize \tex_hsize:D + \__kernel_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D + \__kernel_primitive:NN \righthyphenmin \tex_righthyphenmin:D + \__kernel_primitive:NN \leftskip \tex_leftskip:D + \__kernel_primitive:NN \rightskip \tex_rightskip:D + \__kernel_primitive:NN \looseness \tex_looseness:D + \__kernel_primitive:NN \parskip \tex_parskip:D + \__kernel_primitive:NN \parindent \tex_parindent:D + \__kernel_primitive:NN \uchyph \tex_uchyph:D + \__kernel_primitive:NN \emergencystretch \tex_emergencystretch:D + \__kernel_primitive:NN \pretolerance \tex_pretolerance:D + \__kernel_primitive:NN \tolerance \tex_tolerance:D + \__kernel_primitive:NN \spaceskip \tex_spaceskip:D + \__kernel_primitive:NN \xspaceskip \tex_xspaceskip:D + \__kernel_primitive:NN \parfillskip \tex_parfillskip:D + \__kernel_primitive:NN \everypar \tex_everypar:D + \__kernel_primitive:NN \prevgraf \tex_prevgraf:D + \__kernel_primitive:NN \spacefactor \tex_spacefactor:D + \__kernel_primitive:NN \shipout \tex_shipout:D + \__kernel_primitive:NN \vsize \tex_vsize:D + \__kernel_primitive:NN \interlinepenalty \tex_interlinepenalty:D + \__kernel_primitive:NN \brokenpenalty \tex_brokenpenalty:D + \__kernel_primitive:NN \topskip \tex_topskip:D + \__kernel_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D + \__kernel_primitive:NN \maxdepth \tex_maxdepth:D + \__kernel_primitive:NN \output \tex_output:D + \__kernel_primitive:NN \deadcycles \tex_deadcycles:D + \__kernel_primitive:NN \pagedepth \tex_pagedepth:D + \__kernel_primitive:NN \pagestretch \tex_pagestretch:D + \__kernel_primitive:NN \pagefilstretch \tex_pagefilstretch:D + \__kernel_primitive:NN \pagefillstretch \tex_pagefillstretch:D + \__kernel_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D + \__kernel_primitive:NN \pageshrink \tex_pageshrink:D + \__kernel_primitive:NN \pagegoal \tex_pagegoal:D + \__kernel_primitive:NN \pagetotal \tex_pagetotal:D + \__kernel_primitive:NN \outputpenalty \tex_outputpenalty:D + \__kernel_primitive:NN \hoffset \tex_hoffset:D + \__kernel_primitive:NN \voffset \tex_voffset:D + \__kernel_primitive:NN \insert \tex_insert:D + \__kernel_primitive:NN \holdinginserts \tex_holdinginserts:D + \__kernel_primitive:NN \floatingpenalty \tex_floatingpenalty:D + \__kernel_primitive:NN \insertpenalties \tex_insertpenalties:D + \__kernel_primitive:NN \lower \tex_lower:D + \__kernel_primitive:NN \moveleft \tex_moveleft:D + \__kernel_primitive:NN \moveright \tex_moveright:D + \__kernel_primitive:NN \raise \tex_raise:D + \__kernel_primitive:NN \copy \tex_copy:D + \__kernel_primitive:NN \lastbox \tex_lastbox:D + \__kernel_primitive:NN \vsplit \tex_vsplit:D + \__kernel_primitive:NN \unhbox \tex_unhbox:D + \__kernel_primitive:NN \unhcopy \tex_unhcopy:D + \__kernel_primitive:NN \unvbox \tex_unvbox:D + \__kernel_primitive:NN \unvcopy \tex_unvcopy:D + \__kernel_primitive:NN \setbox \tex_setbox:D + \__kernel_primitive:NN \hbox \tex_hbox:D + \__kernel_primitive:NN \vbox \tex_vbox:D + \__kernel_primitive:NN \vtop \tex_vtop:D + \__kernel_primitive:NN \prevdepth \tex_prevdepth:D + \__kernel_primitive:NN \badness \tex_badness:D + \__kernel_primitive:NN \hbadness \tex_hbadness:D + \__kernel_primitive:NN \vbadness \tex_vbadness:D + \__kernel_primitive:NN \hfuzz \tex_hfuzz:D + \__kernel_primitive:NN \vfuzz \tex_vfuzz:D + \__kernel_primitive:NN \overfullrule \tex_overfullrule:D + \__kernel_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D + \__kernel_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D + \__kernel_primitive:NN \splittopskip \tex_splittopskip:D + \__kernel_primitive:NN \everyhbox \tex_everyhbox:D + \__kernel_primitive:NN \everyvbox \tex_everyvbox:D + \__kernel_primitive:NN \nullfont \tex_nullfont:D + \__kernel_primitive:NN \textfont \tex_textfont:D + \__kernel_primitive:NN \scriptfont \tex_scriptfont:D + \__kernel_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D + \__kernel_primitive:NN \fontdimen \tex_fontdimen:D + \__kernel_primitive:NN \hyphenchar \tex_hyphenchar:D + \__kernel_primitive:NN \skewchar \tex_skewchar:D + \__kernel_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D + \__kernel_primitive:NN \defaultskewchar \tex_defaultskewchar:D + \__kernel_primitive:NN \number \tex_number:D + \__kernel_primitive:NN \romannumeral \tex_romannumeral:D + \__kernel_primitive:NN \string \tex_string:D + \__kernel_primitive:NN \lowercase \tex_lowercase:D + \__kernel_primitive:NN \uppercase \tex_uppercase:D + \__kernel_primitive:NN \meaning \tex_meaning:D + \__kernel_primitive:NN \penalty \tex_penalty:D + \__kernel_primitive:NN \unpenalty \tex_unpenalty:D + \__kernel_primitive:NN \lastpenalty \tex_lastpenalty:D + \__kernel_primitive:NN \special \tex_special:D + \__kernel_primitive:NN \dump \tex_dump:D + \__kernel_primitive:NN \patterns \tex_patterns:D + \__kernel_primitive:NN \hyphenation \tex_hyphenation:D + \__kernel_primitive:NN \time \tex_time:D + \__kernel_primitive:NN \day \tex_day:D + \__kernel_primitive:NN \month \tex_month:D + \__kernel_primitive:NN \year \tex_year:D + \__kernel_primitive:NN \jobname \tex_jobname:D + \__kernel_primitive:NN \everyjob \tex_everyjob:D + \__kernel_primitive:NN \count \tex_count:D + \__kernel_primitive:NN \dimen \tex_dimen:D + \__kernel_primitive:NN \skip \tex_skip:D + \__kernel_primitive:NN \toks \tex_toks:D + \__kernel_primitive:NN \muskip \tex_muskip:D + \__kernel_primitive:NN \box \tex_box:D + \__kernel_primitive:NN \wd \tex_wd:D + \__kernel_primitive:NN \ht \tex_ht:D + \__kernel_primitive:NN \dp \tex_dp:D + \__kernel_primitive:NN \catcode \tex_catcode:D + \__kernel_primitive:NN \delcode \tex_delcode:D + \__kernel_primitive:NN \sfcode \tex_sfcode:D + \__kernel_primitive:NN \lccode \tex_lccode:D + \__kernel_primitive:NN \uccode \tex_uccode:D + \__kernel_primitive:NN \mathcode \tex_mathcode:D % \end{macrocode} % Since \LaTeX3 requires at least the \eTeX{} extensions, % we also rename the additional primitives. These are all % given the prefix |\etex_|. % \begin{macrocode} - \__expl_primitive:NN \ifdefined \etex_ifdefined:D - \__expl_primitive:NN \ifcsname \etex_ifcsname:D - \__expl_primitive:NN \unless \etex_unless:D - \__expl_primitive:NN \eTeXversion \etex_eTeXversion:D - \__expl_primitive:NN \eTeXrevision \etex_eTeXrevision:D - \__expl_primitive:NN \marks \etex_marks:D - \__expl_primitive:NN \topmarks \etex_topmarks:D - \__expl_primitive:NN \firstmarks \etex_firstmarks:D - \__expl_primitive:NN \botmarks \etex_botmarks:D - \__expl_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D - \__expl_primitive:NN \splitbotmarks \etex_splitbotmarks:D - \__expl_primitive:NN \unexpanded \etex_unexpanded:D - \__expl_primitive:NN \detokenize \etex_detokenize:D - \__expl_primitive:NN \scantokens \etex_scantokens:D - \__expl_primitive:NN \showtokens \etex_showtokens:D - \__expl_primitive:NN \readline \etex_readline:D - \__expl_primitive:NN \tracingassigns \etex_tracingassigns:D - \__expl_primitive:NN \tracingscantokens \etex_tracingscantokens:D - \__expl_primitive:NN \tracingnesting \etex_tracingnesting:D - \__expl_primitive:NN \tracingifs \etex_tracingifs:D - \__expl_primitive:NN \currentiflevel \etex_currentiflevel:D - \__expl_primitive:NN \currentifbranch \etex_currentifbranch:D - \__expl_primitive:NN \currentiftype \etex_currentiftype:D - \__expl_primitive:NN \tracinggroups \etex_tracinggroups:D - \__expl_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D - \__expl_primitive:NN \currentgrouptype \etex_currentgrouptype:D - \__expl_primitive:NN \showgroups \etex_showgroups:D - \__expl_primitive:NN \showifs \etex_showifs:D - \__expl_primitive:NN \interactionmode \etex_interactionmode:D - \__expl_primitive:NN \lastnodetype \etex_lastnodetype:D - \__expl_primitive:NN \iffontchar \etex_iffontchar:D - \__expl_primitive:NN \fontcharht \etex_fontcharht:D - \__expl_primitive:NN \fontchardp \etex_fontchardp:D - \__expl_primitive:NN \fontcharwd \etex_fontcharwd:D - \__expl_primitive:NN \fontcharic \etex_fontcharic:D - \__expl_primitive:NN \parshapeindent \etex_parshapeindent:D - \__expl_primitive:NN \parshapelength \etex_parshapelength:D - \__expl_primitive:NN \parshapedimen \etex_parshapedimen:D - \__expl_primitive:NN \numexpr \etex_numexpr:D - \__expl_primitive:NN \dimexpr \etex_dimexpr:D - \__expl_primitive:NN \glueexpr \etex_glueexpr:D - \__expl_primitive:NN \muexpr \etex_muexpr:D - \__expl_primitive:NN \gluestretch \etex_gluestretch:D - \__expl_primitive:NN \glueshrink \etex_glueshrink:D - \__expl_primitive:NN \gluestretchorder \etex_gluestretchorder:D - \__expl_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D - \__expl_primitive:NN \gluetomu \etex_gluetomu:D - \__expl_primitive:NN \mutoglue \etex_mutoglue:D - \__expl_primitive:NN \lastlinefit \etex_lastlinefit:D - \__expl_primitive:NN \interlinepenalties \etex_interlinepenalties:D - \__expl_primitive:NN \clubpenalties \etex_clubpenalties:D - \__expl_primitive:NN \widowpenalties \etex_widowpenalties:D - \__expl_primitive:NN \displaywidowpenalties \etex_displaywidowpenalties:D - \__expl_primitive:NN \middle \etex_middle:D - \__expl_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D - \__expl_primitive:NN \savingvdiscards \etex_savingvdiscards:D - \__expl_primitive:NN \pagediscards \etex_pagediscards:D - \__expl_primitive:NN \splitdiscards \etex_splitdiscards:D - \__expl_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D - \__expl_primitive:NN \beginL \etex_beginL:D - \__expl_primitive:NN \endL \etex_endL:D - \__expl_primitive:NN \beginR \etex_beginR:D - \__expl_primitive:NN \endR \etex_endR:D - \__expl_primitive:NN \predisplaydirection \etex_predisplaydirection:D - \__expl_primitive:NN \everyeof \etex_everyeof:D - \__expl_primitive:NN \protected \etex_protected:D + \__kernel_primitive:NN \ifdefined \etex_ifdefined:D + \__kernel_primitive:NN \ifcsname \etex_ifcsname:D + \__kernel_primitive:NN \unless \etex_unless:D + \__kernel_primitive:NN \eTeXversion \etex_eTeXversion:D + \__kernel_primitive:NN \eTeXrevision \etex_eTeXrevision:D + \__kernel_primitive:NN \marks \etex_marks:D + \__kernel_primitive:NN \topmarks \etex_topmarks:D + \__kernel_primitive:NN \firstmarks \etex_firstmarks:D + \__kernel_primitive:NN \botmarks \etex_botmarks:D + \__kernel_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D + \__kernel_primitive:NN \splitbotmarks \etex_splitbotmarks:D + \__kernel_primitive:NN \unexpanded \etex_unexpanded:D + \__kernel_primitive:NN \detokenize \etex_detokenize:D + \__kernel_primitive:NN \scantokens \etex_scantokens:D + \__kernel_primitive:NN \showtokens \etex_showtokens:D + \__kernel_primitive:NN \readline \etex_readline:D + \__kernel_primitive:NN \tracingassigns \etex_tracingassigns:D + \__kernel_primitive:NN \tracingscantokens \etex_tracingscantokens:D + \__kernel_primitive:NN \tracingnesting \etex_tracingnesting:D + \__kernel_primitive:NN \tracingifs \etex_tracingifs:D + \__kernel_primitive:NN \currentiflevel \etex_currentiflevel:D + \__kernel_primitive:NN \currentifbranch \etex_currentifbranch:D + \__kernel_primitive:NN \currentiftype \etex_currentiftype:D + \__kernel_primitive:NN \tracinggroups \etex_tracinggroups:D + \__kernel_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D + \__kernel_primitive:NN \currentgrouptype \etex_currentgrouptype:D + \__kernel_primitive:NN \showgroups \etex_showgroups:D + \__kernel_primitive:NN \showifs \etex_showifs:D + \__kernel_primitive:NN \interactionmode \etex_interactionmode:D + \__kernel_primitive:NN \lastnodetype \etex_lastnodetype:D + \__kernel_primitive:NN \iffontchar \etex_iffontchar:D + \__kernel_primitive:NN \fontcharht \etex_fontcharht:D + \__kernel_primitive:NN \fontchardp \etex_fontchardp:D + \__kernel_primitive:NN \fontcharwd \etex_fontcharwd:D + \__kernel_primitive:NN \fontcharic \etex_fontcharic:D + \__kernel_primitive:NN \parshapeindent \etex_parshapeindent:D + \__kernel_primitive:NN \parshapelength \etex_parshapelength:D + \__kernel_primitive:NN \parshapedimen \etex_parshapedimen:D + \__kernel_primitive:NN \numexpr \etex_numexpr:D + \__kernel_primitive:NN \dimexpr \etex_dimexpr:D + \__kernel_primitive:NN \glueexpr \etex_glueexpr:D + \__kernel_primitive:NN \muexpr \etex_muexpr:D + \__kernel_primitive:NN \gluestretch \etex_gluestretch:D + \__kernel_primitive:NN \glueshrink \etex_glueshrink:D + \__kernel_primitive:NN \gluestretchorder \etex_gluestretchorder:D + \__kernel_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D + \__kernel_primitive:NN \gluetomu \etex_gluetomu:D + \__kernel_primitive:NN \mutoglue \etex_mutoglue:D + \__kernel_primitive:NN \lastlinefit \etex_lastlinefit:D + \__kernel_primitive:NN \interlinepenalties \etex_interlinepenalties:D + \__kernel_primitive:NN \clubpenalties \etex_clubpenalties:D + \__kernel_primitive:NN \widowpenalties \etex_widowpenalties:D + \__kernel_primitive:NN \displaywidowpenalties \etex_displaywidowpenalties:D + \__kernel_primitive:NN \middle \etex_middle:D + \__kernel_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D + \__kernel_primitive:NN \savingvdiscards \etex_savingvdiscards:D + \__kernel_primitive:NN \pagediscards \etex_pagediscards:D + \__kernel_primitive:NN \splitdiscards \etex_splitdiscards:D + \__kernel_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D + \__kernel_primitive:NN \beginL \etex_beginL:D + \__kernel_primitive:NN \endL \etex_endL:D + \__kernel_primitive:NN \beginR \etex_beginR:D + \__kernel_primitive:NN \endR \etex_endR:D + \__kernel_primitive:NN \predisplaydirection \etex_predisplaydirection:D + \__kernel_primitive:NN \everyeof \etex_everyeof:D + \__kernel_primitive:NN \protected \etex_protected:D % \end{macrocode} % The newer primitives are more complex: there are an awful lot of them, % and we don't use them all at the moment. So the following is selective. @@ -561,54 +561,54 @@ % there are a lot of \pdfTeX{} primitives that start \cs{pdf\ldots} but % are not related to PDF output. These ones related to PDF output. % \begin{macrocode} - \__expl_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D - \__expl_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D - \__expl_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D - \__expl_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D - \__expl_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D - \__expl_primitive:NN \pdfinfo \pdftex_pdfinfo:D - \__expl_primitive:NN \pdflastxform \pdftex_pdflastxform:D - \__expl_primitive:NN \pdfliteral \pdftex_pdfliteral:D - \__expl_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D - \__expl_primitive:NN \pdfobjcompresslevel \pdftex_pdfobjcompresslevel:D - \__expl_primitive:NN \pdfoutput \pdftex_pdfoutput:D - \__expl_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D - \__expl_primitive:NN \pdfrestore \pdftex_pdfrestore:D - \__expl_primitive:NN \pdfsave \pdftex_pdfsave:D - \__expl_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D - \__expl_primitive:NN \pdfpkresolution \pdftex_pdfpkresolution:D - \__expl_primitive:NN \pdftexrevision \pdftex_pdftextrevision:D - \__expl_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D - \__expl_primitive:NN \pdfxform \pdftex_pdfxform:D + \__kernel_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D + \__kernel_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D + \__kernel_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D + \__kernel_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D + \__kernel_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D + \__kernel_primitive:NN \pdfinfo \pdftex_pdfinfo:D + \__kernel_primitive:NN \pdflastxform \pdftex_pdflastxform:D + \__kernel_primitive:NN \pdfliteral \pdftex_pdfliteral:D + \__kernel_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D + \__kernel_primitive:NN \pdfobjcompresslevel \pdftex_pdfobjcompresslevel:D + \__kernel_primitive:NN \pdfoutput \pdftex_pdfoutput:D + \__kernel_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D + \__kernel_primitive:NN \pdfrestore \pdftex_pdfrestore:D + \__kernel_primitive:NN \pdfsave \pdftex_pdfsave:D + \__kernel_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D + \__kernel_primitive:NN \pdfpkresolution \pdftex_pdfpkresolution:D + \__kernel_primitive:NN \pdftexrevision \pdftex_pdftextrevision:D + \__kernel_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D + \__kernel_primitive:NN \pdfxform \pdftex_pdfxform:D % \end{macrocode} % While these are not. % \begin{macrocode} - \__expl_primitive:NN \pdfstrcmp \pdftex_strcmp:D + \__kernel_primitive:NN \pdfstrcmp \pdftex_strcmp:D % \end{macrocode} % \XeTeX{}-specific primitives. Note that \XeTeX{}'s \tn{strcmp} is % handled earlier and is \enquote{rolled up} into \tn{pdfstrcmp}. % \begin{macrocode} - \__expl_primitive:NN \XeTeXversion \xetex_XeTeXversion:D + \__kernel_primitive:NN \XeTeXversion \xetex_XeTeXversion:D % \end{macrocode} % Primitives from \LuaTeX{}. % \begin{macrocode} - \__expl_primitive:NN \catcodetable \luatex_catcodetable:D - \__expl_primitive:NN \directlua \luatex_directlua:D - \__expl_primitive:NN \initcatcodetable \luatex_initcatcodetable:D - \__expl_primitive:NN \latelua \luatex_latelua:D - \__expl_primitive:NN \luatexversion \luatex_luatexversion:D - \__expl_primitive:NN \savecatcodetable \luatex_savecatcodetable:D + \__kernel_primitive:NN \catcodetable \luatex_catcodetable:D + \__kernel_primitive:NN \directlua \luatex_directlua:D + \__kernel_primitive:NN \initcatcodetable \luatex_initcatcodetable:D + \__kernel_primitive:NN \latelua \luatex_latelua:D + \__kernel_primitive:NN \luatexversion \luatex_luatexversion:D + \__kernel_primitive:NN \savecatcodetable \luatex_savecatcodetable:D % \end{macrocode} % Slightly more awkward are the directional primitives in \LuaTeX{}. These % come from Omega \emph{via} Aleph, but we do not support those engines and % so it seems most sensible to treat them as \LuaTeX{} primitives for prefix % purposes. % \begin{macrocode} - \__expl_primitive:NN \bodydir \luatex_bodydir:D - \__expl_primitive:NN \mathdir \luatex_mathdir:D - \__expl_primitive:NN \pagedir \luatex_pagedir:D - \__expl_primitive:NN \pardir \luatex_pardir:D - \__expl_primitive:NN \textdir \luatex_textdir:D + \__kernel_primitive:NN \bodydir \luatex_bodydir:D + \__kernel_primitive:NN \mathdir \luatex_mathdir:D + \__kernel_primitive:NN \pagedir \luatex_pagedir:D + \__kernel_primitive:NN \pardir \luatex_pardir:D + \__kernel_primitive:NN \textdir \luatex_textdir:D % \end{macrocode} % The job is done: close the group (using the primitive renamed!). % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 50472ab8754..bce67a2fb30 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -35,7 +35,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3prop.dtx 4581 2013-07-28 08:38:50Z joseph $ +\GetIdInfo$Id: l3prop.dtx 4623 2013-12-14 13:53:40Z bruno $ {L3 Property lists} %</driver|package> %<*driver> @@ -508,9 +508,8 @@ % \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\ % \ldots{} \\ % \cs{@@_pair:wn} \meta{key_n} \cs{s_@@} \Arg{value_n} \\ -% \cs{s_obj_end} % \end{quote} -% where the separators \cs{s_@@} and \cs{s_obj_end} are scan marks +% where \cs{s_@@} is a scan mark % (equal to \cs{scan_stop:}), and \cs{@@_pair:wn} can be used to map % through the property list. % @@ -542,7 +541,7 @@ % \begin{variable}[tested = m3prop004]{\c_empty_prop} % An empty prop. % \begin{macrocode} -\tl_const:Nn \c_empty_prop { \s_@@ \s_obj_end } +\tl_const:Nn \c_empty_prop { \s_@@ } % \end{macrocode} % \end{variable} % @@ -620,14 +619,6 @@ % % \subsection{Accessing data in property lists} % -% \begin{macro}[EXP]{\@@_strip_end:w} -% Strip the \cs{s_obj_end} marker from an expanded property list -% variable. -% \begin{macrocode} -\cs_new:Npn \@@_strip_end:w #1 \s_obj_end { \exp_not:n {#1} } -% \end{macrocode} -% \end{macro} -% % \begin{macro}[int]{\@@_split:NnTF} % \begin{macro}[aux]{\@@_split_aux:NnTF} % \begin{macro}[aux, EXP]{\@@_split_aux:w} @@ -816,8 +807,8 @@ % storing in \cs{l_@@_internal_tl} tokens which (after % \texttt{x}-expansion) encode the key--value pair. This variable can % safely be used in \cs{@@_split:NnTF}. If the \meta{key} was absent, -% append the new key--value to the list (\cs{@@_strip_end:w} moves the -% \cs{s_obj_end} marker). Otherwise concatenate the extracts |##1| +% append the new key--value to the list. +% Otherwise concatenate the extracts |##1| % and |##3| with the new key--value pair \cs{l_@@_internal_tl}. The % updated entry is placed at the same spot as the original \meta{key} % in the property list, preserving the order of entries. @@ -833,13 +824,7 @@ } \@@_split:NnTF #2 {#3} { #1 #2 { \exp_not:n {##1} \l_@@_internal_tl \exp_not:n {##3} } } - { - #1 #2 - { - \exp_after:wN \@@_strip_end:w #2 - \l_@@_internal_tl \s_obj_end - } - } + { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } } } \cs_generate_variant:Nn \prop_put:Nnn { NnV , Nno , Nnx , NV , NVV , No , Noo } @@ -877,13 +862,7 @@ } \@@_split:NnTF #2 {#3} { } - { - #1 #2 - { - \exp_after:wN \@@_strip_end:w #2 - \l_@@_internal_tl \s_obj_end - } - } + { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } } } \cs_generate_variant:Nn \prop_put_if_new:Nnn { c } \cs_generate_variant:Nn \prop_gput_if_new:Nnn { c } @@ -944,7 +923,7 @@ % mechanism choke, because the arbitrary token list material is % enclosed in braces. The second argument of \cs{@@_if_in:nwwn} is % most often empty. When the \meta{key} is found in the list, -% \cs{@@_if_in:N} receives \cs{s_@@} or \cs{s_obj_end}, and if it is +% \cs{@@_if_in:N} receives \cs{@@_pair:wn}, and if it is % found as the extra item, the function receives % \cs{q_recursion_tail}, easily recognizable. % @@ -1026,9 +1005,9 @@ % The fastest way to do a recursion here is to use an % \cs{if_meaning:w} test: the keys are strings, and thus cannot match % the marker \cs{q_recursion_tail}. A special case to note is when -% the key |#3| is empty: then \cs{q_recursion_tail} is compared to -% \cs{exp_after:wN}, also different. Note that |#2| can only consist -% of \cs{s_@@} and/or \cs{s_obj_end}. +% the key~|#3| is empty: then \cs{q_recursion_tail} is compared to +% \cs{exp_after:wN}, also different. Note that |#2|~is empty, except +% at the first iteration, where it is \cs{s_@@}. % \begin{macrocode} \cs_new:Npn \prop_map_function:NN #1#2 { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 26d3c4d78f7..d38da212ecb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -35,7 +35,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3quark.dtx 4564 2013-07-21 02:12:33Z bruno $ +\GetIdInfo$Id: l3quark.dtx 4623 2013-12-14 13:53:40Z bruno $ {L3 Quarks} %</driver|package> %<*driver> @@ -671,15 +671,6 @@ % \end{macrocode} % \end{variable} % -% \begin{variable}{\s_obj_end} -% This scan mark is used both in \pkg{l3seq} and \pkg{l3prop}. This -% token ought to be defined in a \pkg{l3obj} module if we decide to go -% in that direction. In the mean-time, we need it to be set. -% \begin{macrocode} -\__scan_new:N \s_obj_end -% \end{macrocode} -% \end{variable} -% % \subsection{Deprecated quark functions} % % \begin{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index a697739d8da..ef713afaa31 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -35,7 +35,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3seq.dtx 4581 2013-07-28 08:38:50Z joseph $ +\GetIdInfo$Id: l3seq.dtx 4623 2013-12-14 13:53:40Z bruno $ {L3 Sequences and stacks} %</driver|package> %<*driver> @@ -777,8 +777,8 @@ % % A sequence is a control sequence whose top-level expansion is of the % form \enquote{\cs{s_@@} \cs{@@_item:n} \marg{item_1} \ldots -% \cs{@@_item:n} \marg{item_n} \cs{s_obj_end}}, with a leading scan -% mark, $n$~items of the same form, and a trailing scan mark. An +% \cs{@@_item:n} \marg{item_n}}, with a leading scan +% mark followed by $n$~items of the same form. An % earlier implementation used the structure \enquote{\cs{seq_elt:w} % \meta{item_1} \cs{seq_elt_end:} \ldots \cs{seq_elt:w} \meta{item_n} % \cs{seq_elt_end:}}. This allowed rapid searching using a delimited @@ -810,10 +810,17 @@ % \end{macrocode} % \end{variable} % +% \begin{macro}[aux]{\@@_tmp:w} +% Scratch function for internal use. +% \begin{macrocode} +\cs_new_eq:NN \@@_tmp:w ? +% \end{macrocode} +% \end{macro} +% % \begin{variable}{\c_empty_seq} % A sequence with no item, following the structure mentioned above. % \begin{macrocode} -\tl_const:Nn \c_empty_seq { \s_@@ \s_obj_end } +\tl_const:Nn \c_empty_seq { \s_@@ } % \end{macrocode} % \end{variable} % @@ -940,7 +947,7 @@ } \tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl } } - #1 #2 { \s_@@ \l_@@_internal_a_tl \s_obj_end } + #1 #2 { \s_@@ \l_@@_internal_a_tl } } \cs_new:Npn \@@_set_split_auxi:w #1 \@@_set_split_end: { @@ -961,25 +968,19 @@ % \UnitTested % \begin{macro}{\seq_gconcat:NNN, \seq_gconcat:ccc} % \UnitTested -% \begin{macro}[aux,EXP]{\@@_concat:NN, \@@_concat:w} -% When concatenating sequences, one must take care of the trailing -% \cs{s_obj_end} and leading \cs{s_@@}. The second argument of -% \cs{@@_concat:NN} is \cs{s_@@}, and \cs{@@_concat:w} removes -% \cs{s_obj_end} by a delimited approach. The result starts with -% \cs{s_@@} (of the first sequence), which stops \texttt{f}-expansion. +% When concatenating sequences, one must remove the leading \cs{s_@@} +% of the second sequence. The result starts with \cs{s_@@} (of the +% first sequence), which stops \texttt{f}-expansion. % \begin{macrocode} \cs_new_protected:Npn \seq_concat:NNN #1#2#3 - { \tl_set:Nf #1 { \exp_last_unbraced:NNo \@@_concat:NN #2 #3 } } + { \tl_set:Nf #1 { \exp_after:wN \use_i:nn \exp_after:wN #2 #3 } } \cs_new_protected:Npn \seq_gconcat:NNN #1#2#3 - { \tl_gset:Nf #1 { \exp_last_unbraced:NNo \@@_concat:NN #2 #3 } } -\cs_new:Npn \@@_concat:NN #1#2 { \exp_after:wN \@@_concat:w #1 } -\cs_new:Npn \@@_concat:w #1 \s_obj_end {#1} + { \tl_gset:Nf #1 { \exp_after:wN \use_i:nn \exp_after:wN #2 #3 } } \cs_generate_variant:Nn \seq_concat:NNN { ccc } \cs_generate_variant:Nn \seq_gconcat:NNN { ccc } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}[pTF]{\seq_if_exist:N, \seq_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. @@ -1035,41 +1036,28 @@ % \end{macro} % \end{macro} % -% \begin{macro}{ -% \seq_put_right:Nn, \seq_put_right:NV, \seq_put_right:Nv, -% \seq_put_right:No, \seq_put_right:Nx, -% \seq_put_right:cn, \seq_put_right:cV, \seq_put_right:cv, -% \seq_put_right:co, \seq_put_right:cx -% } +% \begin{macro} +% { +% \seq_put_right:Nn, \seq_put_right:NV, \seq_put_right:Nv, +% \seq_put_right:No, \seq_put_right:Nx, +% \seq_put_right:cn, \seq_put_right:cV, \seq_put_right:cv, +% \seq_put_right:co, \seq_put_right:cx +% } % \UnitTested -% \begin{macro}{ -% \seq_gput_right:Nn, \seq_gput_right:NV, \seq_gput_right:Nv, -% \seq_gput_right:No, \seq_gput_right:Nx, -% \seq_gput_right:cn, \seq_gput_right:cV,\seq_gput_right:cv, -% \seq_gput_right:co, \seq_gput_right:cx -% } -% \begin{macro}[aux,EXP]{\@@_put_right_aux:w} -% When adding to the right of a sequence, remove \cs{s_obj_end}. This -% is done by \cs{@@_put_right_aux:w}, which takes its result through -% \cs{exp_not:n}. +% \begin{macro} +% { +% \seq_gput_right:Nn, \seq_gput_right:NV, \seq_gput_right:Nv, +% \seq_gput_right:No, \seq_gput_right:Nx, +% \seq_gput_right:cn, \seq_gput_right:cV, \seq_gput_right:cv, +% \seq_gput_right:co, \seq_gput_right:cx +% } +% Since there is no trailing marker, adding an item to the right of a +% sequence simply means wrapping it in \cs{@@_item:n}. % \begin{macrocode} \cs_new_protected:Npn \seq_put_right:Nn #1#2 - { - \tl_set:Nx #1 - { - \exp_after:wN \@@_put_right_aux:w #1 - \exp_not:n { \@@_item:n {#2} \s_obj_end } - } - } + { \tl_put_right:Nn #1 { \@@_item:n {#2} } } \cs_new_protected:Npn \seq_gput_right:Nn #1#2 - { - \tl_gset:Nx #1 - { - \exp_after:wN \@@_put_right_aux:w #1 - \exp_not:n { \@@_item:n {#2} \s_obj_end } - } - } -\cs_new:Npn \@@_put_right_aux:w #1 \s_obj_end { \exp_not:n {#1} } + { \tl_gput_right:Nn #1 { \@@_item:n {#2} } } \cs_generate_variant:Nn \seq_gput_right:Nn { NV , Nv , No , Nx } \cs_generate_variant:Nn \seq_gput_right:Nn { c , cV , cv , co , cx } \cs_generate_variant:Nn \seq_put_right:Nn { NV , Nv , No , Nx } @@ -1077,7 +1065,6 @@ % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} % % \subsection{Modifying sequences} % @@ -1132,7 +1119,7 @@ % The idea of the code here is to avoid a relatively expensive addition of % items one at a time to an intermediate sequence. % The approach taken is therefore similar to -% that in \cs{@@_pop_right_aux:NNN}, using a \enquote{flexible} +% that in \cs{@@_pop_right:NNN}, using a \enquote{flexible} % \texttt{x}-type expansion to do most of the work. As \cs{tl_if_eq:nnT} % is not expandable, a two-part strategy is needed. First, the % \texttt{x}-type expansion uses \cs{str_if_eq:nnT} to find potential @@ -1322,27 +1309,24 @@ % % \begin{macro}{\seq_get_right:NN, \seq_get_right:cN} % \UnitTested -% \begin{macro}[aux]{\@@_get_right_setup:wN, \@@_get_right_loop:nn} -% First prepend \cs{q_no_value}, then take two arguments at a time. -% Apart from the right-hand end of the sequence, this be a brace group -% followed by \cs{@@_item:n}. The \cs{use_none:nn} removes both of -% those. At the end of the sequence, the two question marks are taken -% by \cs{use_none:nn}, and the assignment is placed before the -% right-most item. The \tn{afterassignment} primitive places -% \cs{use_none:n} to get rid of a trailing \cs{@@_get_right_loop:nn}. +% \begin{macro}[aux]{\@@_get_right_loop:nn} +% First remove \cs{s_@@} and prepend \cs{q_no_value}, then take two +% arguments at a time. Before the right-hand end of the sequence, +% this is a brace group followed by \cs{@@_item:n}, both removed by +% \cs{use_none:nn}. At the end of the sequence, the two question +% marks are taken by \cs{use_none:nn}, and the assignment is placed +% before the right-most item. In the next iteration, +% \cs{@@_get_right_loop:nn} receives two empty arguments, and +% \cs{use_none:nn} stops the loop. % \begin{macrocode} \cs_new_protected:Npn \seq_get_right:NN #1#2 - { \exp_after:wN \@@_get_right_setup:wN #1 #2 } -\cs_new_protected:Npn \@@_get_right_setup:wN \s_@@ #1 \s_obj_end #2 { - \@@_get_right_loop:nn - \q_no_value + \exp_after:wN \use_i_ii:nnn + \exp_after:wN \@@_get_right_loop:nn + \exp_after:wN \q_no_value #1 - { - ?? - \tex_afterassignment:D \use_none:n - \tl_set:Nn #2 - } + { ?? \tl_set:Nn #2 } + { } { } } \cs_new_protected:Npn \@@_get_right_loop:nn #1#2 { @@ -1358,8 +1342,7 @@ % \UnitTested % \begin{macro}{\seq_gpop_right:NN, \seq_gpop_right:cN} % \UnitTested -% \begin{macro}[aux]{\@@_pop_right_aux:NNN, \@@_pop_right_loop:nn} -% \begin{macro}[aux, EXP]{\@@_pop_right_setup:w} +% \begin{macro}[aux]{\@@_pop_right:NNN, \@@_pop_right_loop:nn} % The approach to popping from the right is a bit more involved, but does % use some of the same ideas as getting from the right. What is needed is a % \enquote{flexible length} way to set a token list variable. This is @@ -1368,34 +1351,33 @@ % expansion and a \enquote{non-expanding} definition for \cs{@@_item:n}, % the left-most $n - 1$ entries in a sequence of $n$ items will be stored % back in the sequence. That needs a loop of unknown length, hence using the -% strange \cs{if_false:} way of including brackets. When the last item -% of the sequence is reached, the closing bracket for the assignment is +% strange \cs{if_false:} way of including braces. When the last item +% of the sequence is reached, the closing brace for the assignment is % inserted, and |\tl_set:Nn #3| is inserted in front of the final -% entry. This therefore does the pop assignment. The trailing -% looping macro is removed by placing a \cs{use_none:n} using the -% \tn{afterassignment} primitive. +% entry. This therefore does the pop assignment. One more iteration +% is performed, with an empty argument and \cs{use_none:nn}, which +% finally stops the loop. % \begin{macrocode} \cs_new_protected_nopar:Npn \seq_pop_right:NN - { \@@_pop:NNNN \@@_pop_right_aux:NNN \tl_set:Nx } + { \@@_pop:NNNN \@@_pop_right:NNN \tl_set:Nx } \cs_new_protected_nopar:Npn \seq_gpop_right:NN - { \@@_pop:NNNN \@@_pop_right_aux:NNN \tl_gset:Nx } -\cs_new_protected:Npn \@@_pop_right_aux:NNN #1#2#3 + { \@@_pop:NNNN \@@_pop_right:NNN \tl_gset:Nx } +\cs_new_protected:Npn \@@_pop_right:NNN #1#2#3 { - \cs_set_eq:NN \seq_tmp:w \@@_item:n + \cs_set_eq:NN \@@_tmp:w \@@_item:n \cs_set_eq:NN \@@_item:n \scan_stop: #1 #2 { \if_false: } \fi: \s_@@ - \exp_after:wN \@@_pop_right_setup:w + \exp_after:wN \use_i:nnn + \exp_after:wN \@@_pop_right_loop:nn #2 { - \s_obj_end \if_false: { \fi: } - \tex_afterassignment:D \use_none:n + \if_false: { \fi: } \tl_set:Nx #3 } - \cs_set_eq:NN \@@_item:n \seq_tmp:w + { } \use_none:nn + \cs_set_eq:NN \@@_item:n \@@_tmp:w } -\cs_new:Npn \@@_pop_right_setup:w \s_@@ #1 \s_obj_end - { \exp_after:wN \@@_pop_right_loop:nn \use_none:n #1 } \cs_new:Npn \@@_pop_right_loop:nn #1#2 { #2 { \exp_not:n {#1} } @@ -1407,7 +1389,6 @@ % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}[TF]{\seq_get_left:NN, \seq_get_left:cN} % \begin{macro}[TF]{\seq_get_right:NN, \seq_get_right:cN} @@ -1439,9 +1420,9 @@ \prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2 { T , F , TF } { \@@_pop_TF:NNNN \@@_pop_left:NNN \tl_gset:Nn #1 #2 } \prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2 { T , F , TF } - { \@@_pop_TF:NNNN \@@_pop_right_aux:NNN \tl_set:Nx #1 #2 } + { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_set:Nx #1 #2 } \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF } - { \@@_pop_TF:NNNN \@@_pop_right_aux:NNN \tl_gset:Nx #1 #2 } + { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_gset:Nx #1 #2 } \cs_generate_variant:Nn \seq_pop_left:NNT { c } \cs_generate_variant:Nn \seq_pop_left:NNF { c } \cs_generate_variant:Nn \seq_pop_left:NNTF { c } @@ -1480,7 +1461,7 @@ % % \begin{macro}{\seq_map_function:NN, \seq_map_function:cN} % \UnitTested -% \begin{macro}[aux,rEXP]{\@@_map_function:wN,\@@_map_function:NNn} +% \begin{macro}[aux,rEXP]{\@@_map_function:NNn} % The idea here is to apply the code of |#2| to each item in the % sequence without altering the definition of \cs{@@_item:n}. This % is done as by noting that every odd token in the sequence must be @@ -1489,10 +1470,12 @@ % loop without needing to do a (relatively-expensive) quark test. % \begin{macrocode} \cs_new:Npn \seq_map_function:NN #1#2 - { \exp_after:wN \@@_map_function:wN #1 #2 } -\cs_new:Npn \@@_map_function:wN \s_@@ #1 \s_obj_end #2 { - \@@_map_function:NNn #2 #1 { ? \seq_map_break: } { } + \exp_after:wN \use_i_ii:nnn + \exp_after:wN \@@_map_function:NNn + \exp_after:wN #2 + #1 + { ? \seq_map_break: } { } \__prg_break_point:Nn \seq_map_break: { } } \cs_new:Npn \@@_map_function:NNn #1#2#3 @@ -1605,12 +1588,12 @@ % % \begin{macro}[EXP]{\seq_use:Nnnn, \seq_use:cnnn} % \begin{macro}[EXP, aux] -% {\@@_use:wnwnn, \@@_use_setup:w, \@@_use:nwwwwnwn, \@@_use:nwwn} +% {\@@_use:NNnNnn, \@@_use_setup:w, \@@_use:nwwwwnwn, \@@_use:nwwn} % \begin{macro}[EXP]{\seq_use:Nn, \seq_use:cn} % See \cs{clist_use:Nnnn} for a general explanation. The main % difference is that we use \cs{@@_item:n} as a delimiter rather than % commas. We also need to add \cs{@@_item:n} at various places, and -% \cs{s_@@} and \cs{s_obj_end}. +% \cs{s_@@}. % \begin{macrocode} \cs_new:Npn \seq_use:Nnnn #1#2#3#4 { @@ -1619,12 +1602,8 @@ \int_case:nnF { \seq_count:N #1 } { { 0 } { } - { 1 } - { - \exp_after:wN \@@_use:wnwnn #1 - \@@_item:n { } \s_obj_end { } - } - { 2 } { \exp_after:wN \@@_use:wnwnn #1 {#2} } + { 1 } { \exp_after:wN \@@_use:NNnNnn #1 ? { } { } } + { 2 } { \exp_after:wN \@@_use:NNnNnn #1 {#2} } } { \exp_after:wN \@@_use_setup:w #1 \@@_item:n @@ -1636,11 +1615,8 @@ { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } } \cs_generate_variant:Nn \seq_use:Nnnn { c } -\cs_new:Npn \@@_use:wnwnn - #1 \@@_item:n #2#3 \@@_item:n #4#5 \s_obj_end #6 - { \exp_not:n { #2 #6 #4 } } -\cs_new:Npn \@@_use_setup:w \s_@@ #1 \s_obj_end - { \@@_use:nwwwwnwn { } #1 } +\cs_new:Npn \@@_use:NNnNnn #1#2#3#4#5#6 { \exp_not:n { #3 #6 #5 } } +\cs_new:Npn \@@_use_setup:w \s_@@ { \@@_use:nwwwwnwn { } } \cs_new:Npn \@@_use:nwwwwnwn #1 \@@_item:n #2 \@@_item:n #3 \@@_item:n #4#5 \q_mark #6#7 \q_stop #8 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index d7bfa2428e7..f5164b6f093 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -35,7 +35,7 @@ % %<*driver|package> \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3tl.dtx 4592 2013-09-16 21:11:41Z joseph $ +\GetIdInfo$Id: l3tl.dtx 4625 2013-12-27 15:55:36Z joseph $ {L3 Token lists} %</driver|package> %<*driver> @@ -776,7 +776,8 @@ % \end{syntax} % Removes any leading and trailing explicit space characters % (explicit tokens with character code~$32$ and category code~$10$) -% from the content of the \meta{tl~var}. +% from the content of the \meta{tl~var}. Note that this therefore +% \emph{resets} the content of the variable. % \end{function} % % \section{The first token from a token list} |