summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3kernel/l3seq.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-01-23 03:00:53 +0000
committerNorbert Preining <norbert@preining.info>2024-01-23 03:00:53 +0000
commit208ecf90e1d5a239ff2a8cd506c077d194d348c0 (patch)
treee505248dddbb616aa6190340ab46f5f8b4b55803 /macros/latex/contrib/l3kernel/l3seq.dtx
parent3bb554642b743cd7ca7aef2b3668604343bfe708 (diff)
CTAN sync 202401230300
Diffstat (limited to 'macros/latex/contrib/l3kernel/l3seq.dtx')
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx114
1 files changed, 77 insertions, 37 deletions
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index debdd81397..45e5028d1b 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-04}
+% \date{Released 2024-01-22}
%
% \maketitle
%
@@ -173,6 +173,22 @@
% See also \cs{seq_set_split:Nnn}, which removes spaces around the delimiters.
% \end{function}
%
+% \begin{function}[added = 2012-06-15]
+% {\seq_set_filter:NNn, \seq_gset_filter:NNn}
+% \begin{syntax}
+% \cs{seq_set_filter:NNn} \meta{seq~var_1} \meta{seq~var_2} \Arg{inline boolexpr}
+% \end{syntax}
+% Evaluates the \meta{inline boolexpr} for every \meta{item} stored
+% within the \meta{seq~var_2}. The \meta{inline boolexpr}
+% receives the \meta{item} as |#1|. The sequence of all \meta{items}
+% for which the \meta{inline boolexpr} evaluated to \texttt{true}
+% is assigned to \meta{seq~var_1}.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
% \begin{function}
% {\seq_concat:NNN, \seq_concat:ccc, \seq_gconcat:NNN, \seq_gconcat:ccc}
% \begin{syntax}
@@ -635,8 +651,8 @@
% \begin{syntax}
% \cs{seq_map_indexed_function:NN} \meta{seq~var} \meta{function}
% \end{syntax}
-% Applies \meta{function} to every entry in the \meta{sequence
-% variable}. The \meta{function} should have signature |:nn|. It
+% Applies \meta{function} to every entry in the \meta{seq~var}.
+% The \meta{function} should have signature |:nn|. It
% receives two arguments for each iteration: the \meta{index} (namely
% |1| for the first entry, then |2| and so on) and the \meta{item}.
% \end{function}
@@ -645,8 +661,8 @@
% \begin{syntax}
% \cs{seq_map_indexed_inline:Nn} \meta{seq~var} \Arg{inline function}
% \end{syntax}
-% Applies \meta{inline function} to every entry in the \meta{sequence
-% variable}. The \meta{inline function} should consist of code which
+% Applies \meta{inline function} to every entry in the \meta{seq~var}.
+% The \meta{inline function} should consist of code which
% receives the \meta{index} (namely |1| for the first entry, then |2|
% and so on) as~|#1| and the \meta{item} as~|#2|.
% \end{function}
@@ -933,8 +949,8 @@
% items in the sequence representing the set.
%
% Sets should not contain several occurrences of a given item. To make
-% sure that a \meta{sequence variable} only has distinct items, use
-% \cs{seq_remove_duplicates:N} \meta{sequence variable}. This function
+% sure that a \meta{seq~var} only has distinct items, use
+% \cs{seq_remove_duplicates:N} \meta{seq~var}. This function
% is relatively slow, and to avoid performance issues one should only
% use it when necessary.
%
@@ -1238,22 +1254,22 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_from_clist:NN #1#2
{
- \__kernel_tl_set:Ne #1
+ \__kernel_tl_set:Nx #1
{ \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n }
}
\cs_new_protected:Npn \seq_set_from_clist:Nn #1#2
{
- \__kernel_tl_set:Ne #1
+ \__kernel_tl_set:Nx #1
{ \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n }
}
\cs_new_protected:Npn \seq_gset_from_clist:NN #1#2
{
- \__kernel_tl_gset:Ne #1
+ \__kernel_tl_gset:Nx #1
{ \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n }
}
\cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2
{
- \__kernel_tl_gset:Ne #1
+ \__kernel_tl_gset:Nx #1
{ \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n }
}
\cs_generate_variant:Nn \seq_set_from_clist:NN { Nc }
@@ -1322,13 +1338,13 @@
% braces which are outermost after space trimming.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_split:Nnn
- { \@@_set_split:NNNnn \__kernel_tl_set:Ne \tl_trim_spaces:n }
+ { \@@_set_split:NNNnn \__kernel_tl_set:Nx \tl_trim_spaces:n }
\cs_new_protected:Npn \seq_gset_split:Nnn
- { \@@_set_split:NNNnn \__kernel_tl_gset:Ne \tl_trim_spaces:n }
+ { \@@_set_split:NNNnn \__kernel_tl_gset:Nx \tl_trim_spaces:n }
\cs_new_protected:Npn \seq_set_split_keep_spaces:Nnn
- { \@@_set_split:NNNnn \__kernel_tl_set:Ne \exp_not:n }
+ { \@@_set_split:NNNnn \__kernel_tl_set:Nx \exp_not:n }
\cs_new_protected:Npn \seq_gset_split_keep_spaces:Nnn
- { \@@_set_split:NNNnn \__kernel_tl_gset:Ne \exp_not:n }
+ { \@@_set_split:NNNnn \__kernel_tl_gset:Nx \exp_not:n }
\cs_new_protected:Npn \@@_set_split:NNNnn #1#2#3#4#5
{
\tl_if_empty:nTF {#4}
@@ -1348,7 +1364,7 @@
\@@_set_split_end:
\@@_set_split:Nw #2 \prg_do_nothing:
}
- \__kernel_tl_set:Ne \l_@@_internal_a_tl { \l_@@_internal_a_tl }
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
}
#1 #3 { \s_@@ \l_@@_internal_a_tl }
}
@@ -1372,6 +1388,30 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\seq_set_filter:NNn, \seq_gset_filter:NNn}
+% \begin{macro}{\@@_set_filter:NNNn}
+% Similar to \cs{seq_map_inline:Nn}, without a
+% \cs{prg_break_point:} because the user's code
+% is performed within the evaluation of a boolean expression,
+% and skipping out of that would break horribly.
+% The \cs{@@_wrap_item:n} function inserts the relevant
+% \cs{@@_item:n} without expansion in the input stream,
+% hence in the \texttt{e}-expanding assignment.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_filter:NNn
+ { \@@_set_filter:NNNn \__kernel_tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_filter:NNn
+ { \@@_set_filter:NNNn \__kernel_tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_filter:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \bool_if:nT {#4} { \@@_wrap_item:n {##1} } }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\seq_concat:NNN, \seq_concat:ccc}
% \UnitTested
% \begin{macro}{\seq_gconcat:NNN, \seq_gconcat:ccc}
@@ -1422,7 +1462,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_put_left:Nn #1#2
{
- \__kernel_tl_set:Ne #1
+ \__kernel_tl_set:Nx #1
{
\exp_not:n { \s_@@ \@@_item:n {#2} }
\exp_not:f { \exp_after:wN \@@_put_left_aux:w #1 }
@@ -1430,7 +1470,7 @@
}
\cs_new_protected:Npn \seq_gput_left:Nn #1#2
{
- \__kernel_tl_gset:Ne #1
+ \__kernel_tl_gset:Nx #1
{
\exp_not:n { \s_@@ \@@_item:n {#2} }
\exp_not:f { \exp_after:wN \@@_put_left_aux:w #1 }
@@ -1553,9 +1593,9 @@
% \texttt{e}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
% \begin{macrocode}
\cs_new_protected:Npn \seq_remove_all:Nn
- { \@@_remove_all_aux:NNn \__kernel_tl_set:Ne }
+ { \@@_remove_all_aux:NNn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gremove_all:Nn
- { \@@_remove_all_aux:NNn \__kernel_tl_gset:Ne }
+ { \@@_remove_all_aux:NNn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_remove_all_aux:NNn #1#2#3
{
\@@_push_item_def:n
@@ -1599,15 +1639,15 @@
% last argument \cs{use_ii:nn} vs \cs{use_i:nn}.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_item:Nnn #1#2#3
- { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_set:Ne \use_i:nn }
+ { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_set:Nx \use_i:nn }
\cs_new_protected:Npn \seq_gset_item:Nnn #1#2#3
- { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_gset:Ne \use_i:nn }
+ { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_gset:Nx \use_i:nn }
\cs_generate_variant:Nn \seq_set_item:Nnn { c }
\cs_generate_variant:Nn \seq_gset_item:Nnn { c }
\prg_new_protected_conditional:Npnn \seq_set_item:Nnn #1#2#3 { TF , T , F }
- { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_set:Ne \use_ii:nn }
+ { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_set:Nx \use_ii:nn }
\prg_new_protected_conditional:Npnn \seq_gset_item:Nnn #1#2#3 { TF , T , F }
- { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_gset:Ne \use_ii:nn }
+ { \@@_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_gset:Nx \use_ii:nn }
\prg_generate_conditional_variant:Nnn \seq_set_item:Nnn { c } { TF , T , F }
\prg_generate_conditional_variant:Nnn \seq_gset_item:Nnn { c } { TF , T , F }
% \end{macrocode}
@@ -1729,9 +1769,9 @@
% from the stack, and the memory consumption becomes linear.
% \begin{macrocode}
\cs_new_protected:Npn \seq_reverse:N
- { \@@_reverse:NN \__kernel_tl_set:Ne }
+ { \@@_reverse:NN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_greverse:N
- { \@@_reverse:NN \__kernel_tl_gset:Ne }
+ { \@@_reverse:NN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_reverse:NN #1 #2
{
\cs_set_eq:NN \@@_tmp:w \@@_item:n
@@ -1912,7 +1952,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_get_left:NN #1#2
{
- \__kernel_tl_set:Ne #2
+ \__kernel_tl_set:Nx #2
{
\exp_after:wN \@@_get_left:wnw
#1 \@@_item:n { \q_no_value } \s_@@_stop
@@ -1964,7 +2004,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_get_right:NN #1#2
{
- \__kernel_tl_set:Ne #2
+ \__kernel_tl_set:Nx #2
{
\exp_after:wN \use_i_ii:nnn
\exp_after:wN \@@_get_right_loop:nw
@@ -2005,9 +2045,9 @@
% finally stops the loop.
% \begin{macrocode}
\cs_new_protected:Npn \seq_pop_right:NN
- { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_set:Ne }
+ { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gpop_right:NN
- { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Ne }
+ { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_pop_right:NNN #1#2#3
{
\cs_set_eq:NN \@@_tmp:w \@@_item:n
@@ -2019,7 +2059,7 @@
#2
{
\if_false: { \fi: }
- \__kernel_tl_set:Ne #3
+ \__kernel_tl_set:Nx #3
}
{ } \use_none:nn
\cs_set_eq:NN \@@_item:n \@@_tmp:w
@@ -2067,10 +2107,10 @@
{ \@@_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:NNN \__kernel_tl_set:Ne #1 #2 }
+ { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_set:Nx #1 #2 }
\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2
{ T , F , TF }
- { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Ne #1 #2 }
+ { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Nx #1 #2 }
\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c }
{ T , F , TF }
\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c }
@@ -2396,9 +2436,9 @@
% semantics.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_map_e:NNn
- { \@@_set_map_e:NNNn \__kernel_tl_set:Ne }
+ { \@@_set_map_e:NNNn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gset_map_e:NNn
- { \@@_set_map_e:NNNn \__kernel_tl_gset:Ne }
+ { \@@_set_map_e:NNNn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_set_map_e:NNNn #1#2#3#4
{
\@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
@@ -2415,9 +2455,9 @@
% <inline function>.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_map:NNn
- { \@@_set_map:NNNn \__kernel_tl_set:Ne }
+ { \@@_set_map:NNNn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gset_map:NNn
- { \@@_set_map:NNNn \__kernel_tl_gset:Ne }
+ { \@@_set_map:NNNn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
{
\@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } }