diff options
author | Norbert Preining <norbert@preining.info> | 2024-05-01 03:00:54 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-05-01 03:00:54 +0000 |
commit | 6ac3dbed4b71022bd6bb0cc25e8fc3df81198498 (patch) | |
tree | 74689e5368262d351f68fb5d1f0fbea88a3af701 /macros/latex/contrib/l3kernel/l3fp-convert.dtx | |
parent | 3bb814fe836cd59db56f2f5d07f69cb531ed25e0 (diff) |
CTAN sync 202405010300
Diffstat (limited to 'macros/latex/contrib/l3kernel/l3fp-convert.dtx')
-rw-r--r-- | macros/latex/contrib/l3kernel/l3fp-convert.dtx | 630 |
1 files changed, 0 insertions, 630 deletions
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx deleted file mode 100644 index 0459331326..0000000000 --- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx +++ /dev/null @@ -1,630 +0,0 @@ -% \iffalse meta-comment -% -%% File: l3fp-convert.dtx -% -% Copyright (C) 2011-2024 The LaTeX Project -% -% It may be distributed and/or modified under the conditions of the -% LaTeX Project Public License (LPPL), either version 1.3c of this -% license or (at your option) any later version. The latest version -% of this license is in the file -% -% https://www.latex-project.org/lppl.txt -% -% This file is part of the "l3kernel bundle" (The Work in LPPL) -% and all files in that bundle must be distributed together. -% -% ----------------------------------------------------------------------- -% -% The development version of the bundle can be found at -% -% https://github.com/latex3/latex3 -% -% for those people who are interested. -% -%<*driver> -\documentclass[full,kernel]{l3doc} -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -%</driver> -% \fi -% -% \title{^^A -% The \pkg{l3fp-convert} module\\ Floating point conversion^^A -% } -% -% \author{^^A -% The \LaTeX{} Project\thanks -% {^^A -% E-mail: -% \href{mailto:latex-team@latex-project.org} -% {latex-team@latex-project.org}^^A -% }^^A -% } -% -% \date{Released 2024-03-14} -% -% \maketitle -% -% \begin{documentation} -% -% \end{documentation} -% -% \begin{implementation} -% -% \section{\texttt{l3fp-convert} implementation} -% -% \begin{macrocode} -%<*package> -% \end{macrocode} -% -% \begin{macrocode} -%<@@=fp> -% \end{macrocode} -% -% \subsection{Dealing with tuples} -% -% \begin{macro}[EXP] -% {\@@_tuple_convert:Nw, \@@_tuple_convert_loop:nNw, \@@_tuple_convert_end:w} -% The first argument is for instance \cs{@@_to_tl_dispatch:w}, which -% converts any floating point object to the appropriate -% representation. We loop through all items, putting |,~| between all -% of them and making sure to remove the leading |,~|. -% \begin{macrocode} -\cs_new:Npn \@@_tuple_convert:Nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ; - { - \int_case:nnF { \@@_array_count:n {#2} } - { - { 0 } { ( ) } - { 1 } { \@@_tuple_convert_end:w @ { #1 #2 , } } - } - { - \@@_tuple_convert_loop:nNw { } #1 - #2 { ? \@@_tuple_convert_end:w } ; - @ { \use_none:nn } - } - } -\cs_new:Npn \@@_tuple_convert_loop:nNw #1#2#3#4; #5 @ #6 - { - \use_none:n #3 - \exp_args:Nf \@@_tuple_convert_loop:nNw { #2 #3#4 ; } #2 #5 - @ { #6 , ~ #1 } - } -\cs_new:Npn \@@_tuple_convert_end:w #1 @ #2 - { \exp_after:wN ( \exp:w \exp_end_continue_f:w #2 ) } -% \end{macrocode} -% \end{macro} -% -% \subsection{Trimming trailing zeros} -% -% \begin{macro}[EXP]{\@@_trim_zeros:w} -% \begin{macro}[EXP] -% {\@@_trim_zeros_loop:w, \@@_trim_zeros_dot:w, \@@_trim_zeros_end:w} -% If |#1| ends with a $0$, the \texttt{loop} auxiliary takes that zero -% as an end-delimiter for its first argument, and the second argument -% is the same \texttt{loop} auxiliary. Once the last trailing zero is -% reached, the second argument is the \texttt{dot} auxiliary, -% which removes a trailing dot if any. We then clean-up with the -% \texttt{end} auxiliary, keeping only the number. -% \begin{macrocode} -\cs_new:Npn \@@_trim_zeros:w #1 ; - { - \@@_trim_zeros_loop:w #1 - ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s_@@_stop - } -\cs_new:Npn \@@_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 } -\cs_new:Npn \@@_trim_zeros_dot:w #1 .; { \@@_trim_zeros_end:w #1 ; } -\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s_@@_stop { #1 } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Scientific notation} -% -% \begin{macro}[EXP] -% {\fp_to_scientific:N, \fp_to_scientific:c, \fp_to_scientific:n} -% The three public functions evaluate their argument, then pass it to -% \cs{@@_to_scientific_dispatch:w}. -% \begin{macrocode} -\cs_new:Npn \fp_to_scientific:N #1 - { \exp_after:wN \@@_to_scientific_dispatch:w #1 } -\cs_generate_variant:Nn \fp_to_scientific:N { c } -\cs_new:Npn \fp_to_scientific:n - { - \exp_after:wN \@@_to_scientific_dispatch:w - \exp:w \exp_end_continue_f:w \@@_parse:n - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP] -% {\@@_to_scientific_dispatch:w, \@@_to_scientific_recover:w, \@@_tuple_to_scientific:w} -% We allow tuples. -% \begin{macrocode} -\cs_new:Npn \@@_to_scientific_dispatch:w #1 - { - \@@_change_func_type:NNN - #1 \@@_to_scientific:w \@@_to_scientific_recover:w - #1 - } -\cs_new:Npn \@@_to_scientific_recover:w #1 #2 ; - { - \@@_error:nffn { unknown-type } { \tl_to_str:n { #2 ; } } { } { } - nan - } -\cs_new:Npn \@@_tuple_to_scientific:w - { \@@_tuple_convert:Nw \@@_to_scientific_dispatch:w } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP] -% { -% \@@_to_scientific:w, -% \@@_to_scientific_normal:wnnnnn, -% \@@_to_scientific_normal:wNw -% } -% Expressing an internal floating point number in scientific notation -% is quite easy: no rounding, and the format is very well defined. -% First cater for the sign: negative numbers ($|#2|=2$) start -% with~|-|; we then only need to care about positive numbers and -% \texttt{nan}. Then filter the special cases: $\pm0$~are represented -% as~|0|; infinities are converted to a number slightly larger than -% the largest after an \enquote{invalid_operation} exception; -% \texttt{nan} is represented as~|0| after an -% \enquote{invalid_operation} exception. In the normal case, -% decrement the exponent and unbrace the $4$ brace groups, then in a -% second step grab the first digit (previously hidden in braces) to -% order the various parts correctly. -% \begin{macrocode} -\cs_new:Npn \@@_to_scientific:w \s_@@ \@@_chk:w #1#2 - { - \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: - \if_case:w #1 \exp_stop_f: - \@@_case_return:nw { 0.000000000000000e0 } - \or: \exp_after:wN \@@_to_scientific_normal:wnnnnn - \or: - \@@_case_use:nw - { - \@@_invalid_operation:nnw - { \fp_to_scientific:N \c_@@_overflowing_fp } - { fp_to_scientific } - } - \or: - \@@_case_use:nw - { - \@@_invalid_operation:nnw - { \fp_to_scientific:N \c_zero_fp } - { fp_to_scientific } - } - \fi: - \s_@@ \@@_chk:w #1 #2 - } -\cs_new:Npn \@@_to_scientific_normal:wnnnnn - \s_@@ \@@_chk:w 1 #1 #2 #3#4#5#6 ; - { - \exp_after:wN \@@_to_scientific_normal:wNw - \exp_after:wN e - \int_value:w \@@_int_eval:w #2 - 1 - ; #3 #4 #5 #6 ; - } -\cs_new:Npn \@@_to_scientific_normal:wNw #1 ; #2#3; - { #2.#3 #1 } -% \end{macrocode} -% \end{macro} -% -% \subsection{Decimal representation} -% -% \begin{macro}[EXP] -% {\fp_to_decimal:N, \fp_to_decimal:c, \fp_to_decimal:n} -% All three public variants are based on the same -% \cs{@@_to_decimal_dispatch:w} -% after evaluating their argument to an internal floating point. -% \begin{macrocode} -\cs_new:Npn \fp_to_decimal:N #1 - { \exp_after:wN \@@_to_decimal_dispatch:w #1 } -\cs_generate_variant:Nn \fp_to_decimal:N { c } -\cs_new:Npn \fp_to_decimal:n - { - \exp_after:wN \@@_to_decimal_dispatch:w - \exp:w \exp_end_continue_f:w \@@_parse:n - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP] -% {\@@_to_decimal_dispatch:w, \@@_to_decimal_recover:w, \@@_tuple_to_decimal:w} -% We allow tuples. -% \begin{macrocode} -\cs_new:Npn \@@_to_decimal_dispatch:w #1 - { - \@@_change_func_type:NNN - #1 \@@_to_decimal:w \@@_to_decimal_recover:w - #1 - } -\cs_new:Npn \@@_to_decimal_recover:w #1 #2 ; - { - \@@_error:nffn { unknown-type } { \tl_to_str:n { #2 ; } } { } { } - nan - } -\cs_new:Npn \@@_tuple_to_decimal:w - { \@@_tuple_convert:Nw \@@_to_decimal_dispatch:w } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP] -% { -% \@@_to_decimal:w, -% \@@_to_decimal_normal:wnnnnn, -% \@@_to_decimal_large:Nnnw, -% \@@_to_decimal_huge:wnnnn, -% } -% The structure is similar to \cs{@@_to_scientific:w}. -% Insert |-| for -% negative numbers. Zero gives $0$, $\pm\infty$ and \nan{} yield an -% \enquote{invalid operation} exception; note that $\pm\infty$ -% produces a very large output, which we don't expand now since it -% most likely won't be needed. Normal numbers with an exponent in the -% range $[1,15]$ have that number of digits before the decimal -% separator: \enquote{decimate} them, and remove leading zeros with -% \cs{int_value:w}, then trim trailing zeros and dot. Normal -% numbers with an exponent $16$ or larger have no decimal separator, -% we only need to add trailing zeros. When the exponent is -% non-positive, the result should be $0.\meta{zeros}\meta{digits}$, -% trimmed. -% \begin{macrocode} -\cs_new:Npn \@@_to_decimal:w \s_@@ \@@_chk:w #1#2 - { - \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: - \if_case:w #1 \exp_stop_f: - \@@_case_return:nw { 0 } - \or: \exp_after:wN \@@_to_decimal_normal:wnnnnn - \or: - \@@_case_use:nw - { - \@@_invalid_operation:nnw - { \fp_to_decimal:N \c_@@_overflowing_fp } - { fp_to_decimal } - } - \or: - \@@_case_use:nw - { - \@@_invalid_operation:nnw - { 0 } - { fp_to_decimal } - } - \fi: - \s_@@ \@@_chk:w #1 #2 - } -\cs_new:Npn \@@_to_decimal_normal:wnnnnn - \s_@@ \@@_chk:w 1 #1 #2 #3#4#5#6 ; - { - \int_compare:nNnTF {#2} > 0 - { - \int_compare:nNnTF {#2} < \c_@@_prec_int - { - \@@_decimate:nNnnnn { \c_@@_prec_int - #2 } - \@@_to_decimal_large:Nnnw - } - { - \exp_after:wN \exp_after:wN - \exp_after:wN \@@_to_decimal_huge:wnnnn - \prg_replicate:nn { #2 - \c_@@_prec_int } { 0 } ; - } - {#3} {#4} {#5} {#6} - } - { - \exp_after:wN \@@_trim_zeros:w - \exp_after:wN 0 - \exp_after:wN . - \exp:w \exp_end_continue_f:w \prg_replicate:nn { - #2 } { 0 } - #3#4#5#6 ; - } - } -\cs_new:Npn \@@_to_decimal_large:Nnnw #1#2#3#4; - { - \exp_after:wN \@@_trim_zeros:w \int_value:w - \if_int_compare:w #2 > \c_zero_int - #2 - \fi: - \exp_stop_f: - #3.#4 ; - } -\cs_new:Npn \@@_to_decimal_huge:wnnnn #1; #2#3#4#5 { #2#3#4#5 #1 } -% \end{macrocode} -% \end{macro} -% -% \subsection{Token list representation} -% -% \begin{macro}[EXP]{\fp_to_tl:N, \fp_to_tl:c, \fp_to_tl:n} -% These three public functions evaluate their argument, then pass it -% to \cs{@@_to_tl_dispatch:w}. -% \begin{macrocode} -\cs_new:Npn \fp_to_tl:N #1 { \exp_after:wN \@@_to_tl_dispatch:w #1 } -\cs_generate_variant:Nn \fp_to_tl:N { c } -\cs_new:Npn \fp_to_tl:n - { - \exp_after:wN \@@_to_tl_dispatch:w - \exp:w \exp_end_continue_f:w \@@_parse:n - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP]{\@@_to_tl_dispatch:w, \@@_to_tl_recover:w, \@@_tuple_to_tl:w} -% We allow tuples. -% \begin{macrocode} -\cs_new:Npn \@@_to_tl_dispatch:w #1 - { \@@_change_func_type:NNN #1 \@@_to_tl:w \@@_to_tl_recover:w #1 } -\cs_new:Npn \@@_to_tl_recover:w #1 #2 ; - { - \@@_error:nffn { unknown-type } { \tl_to_str:n { #2 ; } } { } { } - nan - } -\cs_new:Npn \@@_tuple_to_tl:w - { \@@_tuple_convert:Nw \@@_to_tl_dispatch:w } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP] -% { -% \@@_to_tl:w, \@@_to_tl_normal:nnnnn, -% \@@_to_tl_scientific:wnnnnn, \@@_to_tl_scientific:wNw -% } -% A structure similar to \cs{@@_to_scientific_dispatch:w} and -% \cs{@@_to_decimal_dispatch:w}, but without the \enquote{invalid operation} -% exception. First filter special cases. We express normal numbers -% in decimal notation if the exponent is in the range $[-2,16]$, and -% otherwise use scientific notation. -% \begin{macrocode} -\cs_new:Npn \@@_to_tl:w \s_@@ \@@_chk:w #1#2 - { - \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: - \if_case:w #1 \exp_stop_f: - \@@_case_return:nw { 0 } - \or: \exp_after:wN \@@_to_tl_normal:nnnnn - \or: \@@_case_return:nw { inf } - \else: \@@_case_return:nw { nan } - \fi: - } -\cs_new:Npn \@@_to_tl_normal:nnnnn #1 - { - \int_compare:nTF - { -2 <= #1 <= \c_@@_prec_int } - { \@@_to_decimal_normal:wnnnnn } - { \@@_to_tl_scientific:wnnnnn } - \s_@@ \@@_chk:w 1 0 {#1} - } -\cs_new:Npn \@@_to_tl_scientific:wnnnnn - \s_@@ \@@_chk:w 1 #1 #2 #3#4#5#6 ; - { - \exp_after:wN \@@_to_tl_scientific:wNw - \exp_after:wN e - \int_value:w \@@_int_eval:w #2 - 1 - ; #3 #4 #5 #6 ; - } -\cs_new:Npn \@@_to_tl_scientific:wNw #1 ; #2#3; - { \@@_trim_zeros:w #2.#3 ; #1 } -% \end{macrocode} -% \end{macro} -% -% \subsection{Formatting} -% -% This is not implemented yet, as it is not yet clear what a correct -% interface would be, for this kind of structured conversion from a -% floating point (or other types of variables) to a string. Ideas -% welcome. -% -% \subsection{Convert to dimension or integer} -% -% \begin{macro}[EXP]{\fp_to_dim:N, \fp_to_dim:c, \fp_to_dim:n} -% \begin{macro}[EXP]{\@@_to_dim_dispatch:w, \@@_to_dim_recover:w, \@@_to_dim:w} -% All three public variants are based on the same -% \cs{@@_to_dim_dispatch:w} after evaluating their argument to an -% internal floating point. -% We only allow floating point numbers, not tuples. -% \begin{macrocode} -\cs_new:Npn \fp_to_dim:N #1 - { \exp_after:wN \@@_to_dim_dispatch:w #1 } -\cs_generate_variant:Nn \fp_to_dim:N { c } -\cs_new:Npn \fp_to_dim:n - { - \exp_after:wN \@@_to_dim_dispatch:w - \exp:w \exp_end_continue_f:w \@@_parse:n - } -\cs_new:Npn \@@_to_dim_dispatch:w #1#2 ; - { - \@@_change_func_type:NNN #1 \@@_to_dim:w \@@_to_dim_recover:w - #1 #2 ; - } -\cs_new:Npn \@@_to_dim_recover:w #1 - { \@@_invalid_operation:nnw { 0pt } { fp_to_dim } } -\cs_new:Npn \@@_to_dim:w #1 ; { \@@_to_decimal:w #1 ; pt } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}[EXP]{\fp_to_int:N, \fp_to_int:c, \fp_to_int:n} -% \begin{macro}[EXP]{\@@_to_int_dispatch:w, \@@_to_int_recover:w} -% For the most part identical to \cs{fp_to_dim:N} but without |pt|, -% and where \cs{@@_to_int:w} does more work. -% To convert to an integer, first round to $0$ places (to the nearest -% integer), then express the result as a decimal number: the -% definition of \cs{@@_to_decimal_dispatch:w} is such that there are no -% trailing dot nor zero. -% \begin{macrocode} -\cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \@@_to_int_dispatch:w #1 } -\cs_generate_variant:Nn \fp_to_int:N { c } -\cs_new:Npn \fp_to_int:n - { - \exp_after:wN \@@_to_int_dispatch:w - \exp:w \exp_end_continue_f:w \@@_parse:n - } -\cs_new:Npn \@@_to_int_dispatch:w #1#2 ; - { - \@@_change_func_type:NNN #1 \@@_to_int:w \@@_to_int_recover:w - #1 #2 ; - } -\cs_new:Npn \@@_to_int_recover:w #1 - { \@@_invalid_operation:nnw { 0 } { fp_to_int } } -\cs_new:Npn \@@_to_int:w #1; - { - \exp_after:wN \@@_to_decimal:w \exp:w \exp_end_continue_f:w - \@@_round:Nwn \@@_round_to_nearest:NNN #1; { 0 } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Convert from a dimension} -% -% \begin{macro}[EXP]{\dim_to_fp:n} -% \begin{macro}[EXP] -% { -% \@@_from_dim_test:ww, -% \@@_from_dim:wNw, -% \@@_from_dim:wNNnnnnnn, -% \@@_from_dim:wnnnnwNw, -% } -% The dimension expression (which can in fact be a glue expression) is -% evaluated, converted to a number (\emph{i.e.}, expressed in scaled -% points), then multiplied by $2^{-16} = 0.0000152587890625$ to give a -% value expressed in points. The auxiliary \cs{@@_mul_npos_o:Nww} -% expects the desired \meta{final sign} and two floating point -% operands (of the form \cs{s_@@} \ldots{} |;|) as arguments. -% This set of functions is also used to convert dimension registers to -% floating points while parsing expressions: in this context there is -% an additional exponent, which is the first argument of -% \cs{@@_from_dim_test:ww}, and is combined with the exponent $-4$ -% of $2^{-16}$. There is also a need to expand afterwards: this is -% performed by \cs{@@_mul_npos_o:Nww}, and cancelled by -% \cs{prg_do_nothing:} here. -% \begin{macrocode} -\cs_new:Npn \dim_to_fp:n #1 - { - \exp_after:wN \@@_from_dim_test:ww - \exp_after:wN 0 - \exp_after:wN , - \int_value:w \tex_glueexpr:D #1 ; - } -\cs_new:Npn \@@_from_dim_test:ww #1, #2 - { - \if_meaning:w 0 #2 - \@@_case_return:nw { \exp_after:wN \c_zero_fp } - \else: - \exp_after:wN \@@_from_dim:wNw - \int_value:w \@@_int_eval:w #1 - 4 - \if_meaning:w - #2 - \exp_after:wN , \exp_after:wN 2 \int_value:w - \else: - \exp_after:wN , \exp_after:wN 0 \int_value:w #2 - \fi: - \fi: - } -\cs_new:Npn \@@_from_dim:wNw #1,#2#3; - { - \@@_pack_twice_four:wNNNNNNNN \@@_from_dim:wNNnnnnnn ; - #3 000 0000 00 {10}987654321; #2 {#1} - } -\cs_new:Npn \@@_from_dim:wNNnnnnnn #1; #2#3#4#5#6#7#8#9 - { \@@_from_dim:wnnnnwNn #1 {#2#300} {0000} ; } -\cs_new:Npn \@@_from_dim:wnnnnwNn #1; #2#3#4#5#6; #7#8 - { - \@@_mul_npos_o:Nww #7 - \s_@@ \@@_chk:w 1 #7 {#5} #1 ; - \s_@@ \@@_chk:w 1 0 {#8} {1525} {8789} {0625} {0000} ; - \prg_do_nothing: - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Use and eval} -% -% \begin{macro}[EXP]{\fp_use:N, \fp_use:c, \fp_eval:n} -% Those public functions are simple copies of the decimal conversions. -% \begin{macrocode} -\cs_new_eq:NN \fp_use:N \fp_to_decimal:N -\cs_generate_variant:Nn \fp_use:N { c } -\cs_new_eq:NN \fp_eval:n \fp_to_decimal:n -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\fp_sign:n} -% Trivial but useful. See the implementation of \cs{fp_add:Nn} for an -% explanation of why to use \cs{@@_parse:n}, namely, for better error -% reporting. -% \begin{macrocode} -\cs_new:Npn \fp_sign:n #1 - { \fp_to_decimal:n { sign \@@_parse:n {#1} } } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP]{\fp_abs:n} -% Trivial but useful. See the implementation of \cs{fp_add:Nn} for an -% explanation of why to use \cs{@@_parse:n}, namely, for better error -% reporting. -% \begin{macrocode} -\cs_new:Npn \fp_abs:n #1 - { \fp_to_decimal:n { abs \@@_parse:n {#1} } } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[EXP]{\fp_max:nn, \fp_min:nn} -% Similar to \cs{fp_abs:n}, for consistency with \cs{int_max:nn}, \emph{etc.} -% \begin{macrocode} -\cs_new:Npn \fp_max:nn #1#2 - { \fp_to_decimal:n { max ( \@@_parse:n {#1} , \@@_parse:n {#2} ) } } -\cs_new:Npn \fp_min:nn #1#2 - { \fp_to_decimal:n { min ( \@@_parse:n {#1} , \@@_parse:n {#2} ) } } -% \end{macrocode} -% \end{macro} -% -% \subsection{Convert an array of floating points to a comma list} -% -% \begin{macro}[EXP]{\@@_array_to_clist:n} -% \begin{macro}[EXP]{\@@_array_to_clist_loop:Nw} -% Converts an array of floating point numbers to a comma-list. If -% speed here ends up irrelevant, we can simplify the code for the -% auxiliary to become -% \begin{verbatim} -% \cs_new:Npn \__fp_array_to_clist_loop:Nw #1#2; -% { -% \use_none:n #1 -% { , ~ } \fp_to_tl:n { #1 #2 ; } -% \__fp_array_to_clist_loop:Nw -% } -% \end{verbatim} -% The \cs{use_ii:nn} function is expanded after \cs{@@_expand:n} is -% done, and it removes |,~| from the start of the representation. -% \begin{macrocode} -\cs_new:Npn \@@_array_to_clist:n #1 - { - \tl_if_empty:nF {#1} - { - \exp_last_unbraced:Ne \use_ii:nn - { - \@@_array_to_clist_loop:Nw #1 { ? \prg_break: } ; - \prg_break_point: - } - } - } -\cs_new:Npn \@@_array_to_clist_loop:Nw #1#2; - { - \use_none:n #1 - , ~ - \exp_not:f { \@@_to_tl_dispatch:w #1 #2 ; } - \@@_array_to_clist_loop:Nw - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macrocode} -%</package> -% \end{macrocode} -% -% \end{implementation} -% -% \PrintChanges -% -% \PrintIndex |