[latex3-commits] [l3svn] branch master updated: Add \fp_step_... (closes #319)

noreply at latex-project.org noreply at latex-project.org
Mon Nov 21 18:04:49 CET 2016


This is an automated email from the git hooks/post-receive script.

joseph pushed a commit to branch master
in repository l3svn.

The following commit(s) were added to refs/heads/master by this push:
       new  9125b99   Add \fp_step_... (closes #319)
9125b99 is described below

commit 9125b99074c5c359cd3a5925e1cc61d0c36e1e17
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Mon Nov 21 17:04:08 2016 +0000

    Add \fp_step_... (closes #319)
    
    This might not be the most efficient approach: Bruno knows more
    about fp internals than me!
---
 l3kernel/l3fp-logic.dtx                 |   68 +++++++++++++++++++++++++++++++
 l3kernel/l3fp.dtx                       |   44 ++++++++++++++++++++
 l3kernel/testfiles/m3expl001.luatex.tlg |    7 ++++
 l3kernel/testfiles/m3expl001.ptex.tlg   |    7 ++++
 l3kernel/testfiles/m3expl001.tlg        |    7 ++++
 l3kernel/testfiles/m3expl001.uptex.tlg  |    7 ++++
 l3kernel/testfiles/m3expl001.xetex.tlg  |    7 ++++
 l3kernel/testfiles/m3expl003.luatex.tlg |    7 ++++
 l3kernel/testfiles/m3expl003.ptex.tlg   |    7 ++++
 l3kernel/testfiles/m3expl003.tlg        |    7 ++++
 l3kernel/testfiles/m3expl003.uptex.tlg  |    7 ++++
 l3kernel/testfiles/m3expl003.xetex.tlg  |    7 ++++
 l3kernel/testfiles/m3fp-logic004.lvt    |   36 ++++++++++++++++
 l3kernel/testfiles/m3fp-logic004.tlg    |   35 ++++++++++++++++
 14 files changed, 253 insertions(+)

diff --git a/l3kernel/l3fp-logic.dtx b/l3kernel/l3fp-logic.dtx
index 0e0a6ac..aa0702e 100644
--- a/l3kernel/l3fp-logic.dtx
+++ b/l3kernel/l3fp-logic.dtx
@@ -316,6 +316,74 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\fp_step_function:nnnN, \fp_step_function:nnnc}
+% \begin{macro}[EXP, aux]{\@@_step:wwwN}
+% \begin{macro}[EXP, aux]{\@@_step:NnnnN, \@@_step:NfnnN}
+%   The approach here is much the same as \cs{int_step_function:nnnN} except we
+%   do not have a convenient low-level way to evaluation each argument to give
+%   a pure number. Instead, the internal parser is used to leave values in the
+%   internal format (and avoid a more expensive \texttt{f}-type expansion of
+%   multiple uses of \texttt{fp_eval:n}).
+%    \begin{macrocode}
+\cs_new:Npn \fp_step_function:nnnN #1#2#3
+  {
+    \exp_after:wN \@@_step:wwwN
+      \exp:w \exp_end_continue_f:w \@@_parse_o:n {#1} :
+      \exp:w \exp_end_continue_f:w \@@_parse_o:n {#2} :
+      \exp:w \exp_end_continue_f:w \@@_parse:n {#3} :
+  }
+\cs_generate_variant:Nn \fp_step_function:nnnN { nnnc }
+%    \end{macrocode}
+%   Here, |#1| will be passed to the output on the first pass of the loop.
+%   To avoid this being in internal form, an \texttt{f}-type expansion is used
+%   here on that value only. The second and third arguments will be converted
+%   during the loop itself.
+%    \begin{macrocode}
+\cs_new:Npn \@@_step:wwwN #1 : #2 : #3 : #4
+  {
+    \fp_compare:nNnTF {#2} > 0
+      { \@@_step:NfnnN > }
+      {
+        \fp_compare:nNnTF {#2} = 0
+          {
+            \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4}
+            \use_none:nnnn
+          }
+          { \@@_step:NfnnN < }
+      }
+      { \fp_eval:n {#1} } {#2} {#3} #4
+  }
+
+\cs_new:Npn \@@_step:NnnnN #1#2#3#4#5
+  {
+    \fp_compare:nNnF {#2} #1 {#4}
+      {
+        #5 {#2}
+        \@@_step:NfnnN
+          #1 { \fp_eval:n { #2 + #3 } } {#3} {#4} #5
+      }
+  }
+\cs_generate_variant:Nn \@@_step:NnnnN { Nf }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\fp_step_inline:nnnn}
+%   As for \cs{int_step_inline:nnnn}, create a global function and apply it,
+%   following up with a break point.
+%    \begin{macrocode}
+\cs_new_protected:Npn \fp_step_inline:nnnn #1#2#3#4
+  {
+    \int_gincr:N \g__prg_map_int
+    \cs_gset_protected:cpn { __prg_map_ \int_use:N \g__prg_map_int :w }
+      ##1 {#4}
+    \fp_step_function:nnnc {#1} {#2} {#3}
+      { __prg_map_ \int_use:N \g__prg_map_int :w }
+    \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Extrema}
 %
 % \begin{macro}[int, EXP]{\@@_minmax_o:Nw}
diff --git a/l3kernel/l3fp.dtx b/l3kernel/l3fp.dtx
index 996e4f5..a9c7385 100644
--- a/l3kernel/l3fp.dtx
+++ b/l3kernel/l3fp.dtx
@@ -541,6 +541,50 @@
 %   \texttt{false}.
 % \end{function}
 %
+% \begin{function}[added = 2016-11-21, rEXP]
+%   {\fp_step_function:nnnN}
+%   \begin{syntax}
+%     \cs{fp_step_function:nnnN} \Arg{initial value} \Arg{step} \Arg{final value} \meta{function}
+%   \end{syntax}
+%   This function first evaluates the \meta{initial value}, \meta{step}
+%   and \meta{final value}, all of which should be floating point expressions.
+%   The \meta{function} is then placed in front of each \meta{value}
+%   from the \meta{initial value} to the \meta{final value} in turn
+%   (using \meta{step} between each \meta{value}).  The \meta{step} must
+%   be non-zero.  If the \meta{step} is positive, the loop stops when
+%   the \meta{value} becomes larger than the \meta{final value}.  If the
+%   \meta{step} is negative, the loop stops when the \meta{value}
+%   becomes smaller than the \meta{final value}.  The \meta{function}
+%   should absorb one numerical argument. For example
+%   \begin{verbatim}
+%     \cs_set:Npn \my_func:n #1 { [I~saw~#1] \quad }
+%     \fp_step_function:nnnN { 1.0 } { 0.1 } { 1.5 } \my_func:n
+%   \end{verbatim}
+%   would print
+%   \begin{quote}
+%     [I saw 1.0] \quad
+%     [I saw 1.1] \quad
+%     [I saw 1.2] \quad
+%     [I saw 1.3] \quad
+%     [I saw 1.4] \quad
+%     [I saw 1.5] \quad
+%   \end{quote}
+% \end{function}
+%
+% \begin{function}[added = 2016-11-21]
+%   {\fp_step_inline:nnnn}
+%   \begin{syntax}
+%     \cs{\fp_step_inline:nnnn} \Arg{initial value} \Arg{step} \Arg{final value} \Arg{code}
+%   \end{syntax}
+%   This function first evaluates the \meta{initial value}, \meta{step}
+%   and \meta{final value}, all of which should be floating point expressions.
+%   Then for each \meta{value} from the \meta{initial value} to the
+%   \meta{final value} in turn (using \meta{step} between each
+%   \meta{value}), the \meta{code} is inserted into the input stream
+%   with |#1| replaced by the current \meta{value}.  Thus the
+%   \meta{code} should define a function of one argument~(|#1|).
+% \end{function}
+%
 % \section{Some useful constants, and scratch variables}
 %
 % \begin{variable}[added = 2012-05-08]{\c_zero_fp, \c_minus_zero_fp}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index 9c97cf7..496a6e1 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -3731,6 +3731,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 4a0c2bf..b9f7c52 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -3722,6 +3722,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index faee6dc..92b7758 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -3722,6 +3722,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 6d1132a..49c2635 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -3722,6 +3722,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 8c0422d..891c5a4 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -3729,6 +3729,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 3ef272b..42bd013 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -3732,6 +3732,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index c3c92bf..b130bde 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -3723,6 +3723,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index 94c79ad..19fdc27 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -3723,6 +3723,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index d25c26e..89fc56f 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -3723,6 +3723,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index 5dea49b..7523b71 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -3730,6 +3730,13 @@ Defining \fp_do_until:nNnn on line ...
 Defining \fp_do_while:nNnn on line ...
 Defining \fp_until_do:nNnn on line ...
 Defining \fp_while_do:nNnn on line ...
+Defining \fp_step_function:nnnN on line ...
+Defining \exp_args:Nnnnc on line ...
+Defining \fp_step_function:nnnc on line ...
+Defining \__fp_step:wwwN on line ...
+Defining \__fp_step:NnnnN on line ...
+Defining \__fp_step:NfnnN on line ...
+Defining \fp_step_inline:nnnn on line ...
 Defining \__fp_minmax_o:Nw on line ...
 Defining \__fp_minmax_loop:Nww on line ...
 Defining \__fp_minmax_auxi:ww on line ...
diff --git a/l3kernel/testfiles/m3fp-logic004.lvt b/l3kernel/testfiles/m3fp-logic004.lvt
new file mode 100644
index 0000000..b2be436
--- /dev/null
+++ b/l3kernel/testfiles/m3fp-logic004.lvt
@@ -0,0 +1,36 @@
+%
+% Copyright (C) 2016 LaTeX3 Project
+%
+
+\documentclass{minimal}
+\input{regression-test}
+
+\RequirePackage[check-declarations,log-functions]{expl3}
+
+\begin{document}
+\START
+\AUTHOR{Joseph Wright}
+\ExplSyntaxOn
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\TESTEXP { fp_step_function }
+  {
+    \fp_step_function:nnnN { 0 } { 0.1 }  { 1 } \TYPE
+    \NEWLINE
+    \fp_step_function:nnnN { 0 } { -0.1 } { 1 } \TYPE
+    \NEWLINE
+    \fp_step_function:nnnN { 1 } { -0.1 } { 0 } \TYPE
+    \NEWLINE
+    \fp_step_function:nnnN { 1 } { 0.1 }  { 0 } \TYPE
+  }
+
+\TEST { fp_step_inline }
+  {
+    \fp_step_inline:nnnn { 0 } { 0.1 }  { 1 } { \TYPE {#1} }
+    \fp_step_inline:nnnn { 0 } { -0.1 } { 1 } { \TYPE {#1} }
+    \fp_step_inline:nnnn { 1 } { -0.1 } { 0 } { \TYPE {#1} }
+    \fp_step_inline:nnnn { 1 } { 0.1 }  { 0 } { \TYPE {#1} }
+  }
+
+\END
diff --git a/l3kernel/testfiles/m3fp-logic004.tlg b/l3kernel/testfiles/m3fp-logic004.tlg
new file mode 100644
index 0000000..22c44c9
--- /dev/null
+++ b/l3kernel/testfiles/m3fp-logic004.tlg
@@ -0,0 +1,35 @@
+This is a generated file for the LaTeX (2e + expl3) validation system.
+Don't change this file in any respect.
+Author: Joseph Wright
+============================================================
+TEST 1: fp_step_function
+============================================================
+00.10.20.30.40.50.60.70.80.91
+10.90.80.70.60.50.40.30.20.10
+============================================================
+============================================================
+TEST 2: fp_step_inline
+============================================================
+0
+0.1
+0.2
+0.3
+0.4
+0.5
+0.6
+0.7
+0.8
+0.9
+1
+1
+0.9
+0.8
+0.7
+0.6
+0.5
+0.4
+0.3
+0.2
+0.1
+0
+============================================================

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the latex3-commits mailing list