[latex3-commits] [git/LaTeX3-latex3-latex3] seq-spaces: Add \seq_set_split_keep_spaces:Nnn (closes #784) (262840307)
Joseph Wright
joseph.wright at morningstar2.co.uk
Wed Mar 24 08:29:14 CET 2021
Repository : https://github.com/latex3/latex3
On branch : seq-spaces
Link : https://github.com/latex3/latex3/commit/262840307071eed8b513d283ed3ef3f4ff8efa19
>---------------------------------------------------------------
commit 262840307071eed8b513d283ed3ef3f4ff8efa19
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date: Wed Mar 24 07:29:10 2021 +0000
Add \seq_set_split_keep_spaces:Nnn (closes #784)
>---------------------------------------------------------------
262840307071eed8b513d283ed3ef3f4ff8efa19
l3kernel/CHANGELOG.md | 1 +
l3kernel/l3seq.dtx | 63 +++++++++++++++++++++++++++++++----------
l3kernel/testfiles/m3seq004.lvt | 17 +++++++++++
l3kernel/testfiles/m3seq004.tlg | 42 ++++++++++++++++++++++++++-
4 files changed, 107 insertions(+), 16 deletions(-)
diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index 4ab203fb7..a794de59a 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -8,6 +8,7 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
### Added
+- `\seq_set_split_keep_spaces:Nnn` (see #784)
- `\tracingstacklevels`
- Color export in comma-separated format
diff --git a/l3kernel/l3seq.dtx b/l3kernel/l3seq.dtx
index ac195a07f..2a5978eaa 100644
--- a/l3kernel/l3seq.dtx
+++ b/l3kernel/l3seq.dtx
@@ -146,6 +146,27 @@
% into \meta{items} as a \meta{token list}.
% \end{function}
%
+% \begin{function}[added = 2021-03-24]
+% {
+% \seq_set_split_keep_spaces:Nnn , \seq_set_split_keep_spaces:NnV ,
+% \seq_gset_split_keep_spaces:Nnn, \seq_gset_split:_keep_spaces:NnV
+% }
+% \begin{syntax}
+% \cs{seq_set_split_keep_spaces:Nnn} \meta{sequence} \Arg{delimiter} \Arg{token list}
+% \end{syntax}
+% Splits the \meta{token list} into \meta{items} separated
+% by \meta{delimiter}, and assigns the result to the \meta{sequence}.
+% One set of outer braces is removed (if any) but any surround spaces
+% are retained: a single set of braces \emph{inside} one or more spaces are
+% therefore kept. Empty \meta{items} are preserved by
+% \cs{seq_set_split_keep_spaces:Nnn}, and can be removed afterwards using
+% \cs{seq_remove_all:Nn} \meta{sequence} |{}|.
+% The \meta{delimiter} may not contain |{|, |}| or |#|
+% (assuming \TeX{}'s normal category code r\'egime).
+% If the \meta{delimiter} is empty, the \meta{token list} is split
+% into \meta{items} as a \meta{token list}.
+% \end{function}
+%
% \begin{function}
% {\seq_concat:NNN, \seq_concat:ccc, \seq_gconcat:NNN, \seq_gconcat:ccc}
% \begin{syntax}
@@ -1210,10 +1231,15 @@
% \seq_set_split:Nnn , \seq_set_split:NnV ,
% \seq_gset_split:Nnn, \seq_gset_split:NnV
% }
+% \begin{macro}
+% {
+% \seq_set_split_keep_spaces:Nnn , \seq_set_split_keep_spaces:NnV ,
+% \seq_gset_split_keep_spaces:Nnn, \seq_gset_split_keep_spaces:NnV
+% }
% \begin{macro}{\@@_set_split:NNnn}
% \begin{macro}
% {
-% \@@_set_split_auxi:w, \@@_set_split_auxii:w,
+% \@@_set_split:Nw, \@@_set_split:w,
% \@@_set_split_end:
% }
% When the separator is empty, everything is very simple, just map
@@ -1238,46 +1264,53 @@
% braces which are outermost after space trimming.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_split:Nnn
- { \@@_set_split:NNnn \__kernel_tl_set:Nx }
+ { \@@_set_split:NNNnn \__kernel_tl_set:Nx \tl_trim_spaces:n }
\cs_new_protected:Npn \seq_gset_split:Nnn
- { \@@_set_split:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_split:NNnn #1#2#3#4
+ { \@@_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:Nx \exp_not:n }
+\cs_new_protected:Npn \seq_gset_split_keep_spaces:Nnn
+ { \@@_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 {#3}
+ \tl_if_empty:nTF {#4}
{
\tl_set:Nn \l_@@_internal_a_tl
- { \tl_map_function:nN {#4} \@@_wrap_item:n }
+ { \tl_map_function:nN {#5} \@@_wrap_item:n }
}
{
\tl_set:Nn \l_@@_internal_a_tl
{
- \@@_set_split_auxi:w \prg_do_nothing:
- #4
+ \@@_set_split:Nw #2 \prg_do_nothing:
+ #5
\@@_set_split_end:
}
- \tl_replace_all:Nnn \l_@@_internal_a_tl { #3 }
+ \tl_replace_all:Nnn \l_@@_internal_a_tl {#4}
{
\@@_set_split_end:
- \@@_set_split_auxi:w \prg_do_nothing:
+ \@@_set_split:Nw #2 \prg_do_nothing:
}
\__kernel_tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
}
- #1 #2 { \s_@@ \l_@@_internal_a_tl }
+ #1 #3 { \s_@@ \l_@@_internal_a_tl }
}
-\cs_new:Npn \@@_set_split_auxi:w #1 \@@_set_split_end:
+\cs_new:Npn \@@_set_split:Nw #1#2 \@@_set_split_end:
{
- \exp_not:N \@@_set_split_auxii:w
- \exp_args:No \tl_trim_spaces:n {#1}
+ \exp_not:N \@@_set_split:w
+ \exp_args:No #1 {#2}
\exp_not:N \@@_set_split_end:
}
-\cs_new:Npn \@@_set_split_auxii:w #1 \@@_set_split_end:
+\cs_new:Npn \@@_set_split:w #1 \@@_set_split_end:
{ \@@_wrap_item:n {#1} }
\cs_generate_variant:Nn \seq_set_split:Nnn { NnV }
\cs_generate_variant:Nn \seq_gset_split:Nnn { NnV }
+\cs_generate_variant:Nn \seq_set_split_keep_spaces:Nnn { NnV }
+\cs_generate_variant:Nn \seq_gset_split_keep_spaces:Nnn { NnV }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\seq_concat:NNN, \seq_concat:ccc}
% \UnitTested
diff --git a/l3kernel/testfiles/m3seq004.lvt b/l3kernel/testfiles/m3seq004.lvt
index 290bfd941..6c34e5833 100644
--- a/l3kernel/testfiles/m3seq004.lvt
+++ b/l3kernel/testfiles/m3seq004.lvt
@@ -63,6 +63,23 @@
\seq_log:N \l_my_seq
}
+\TEST{seq_set_split_keep_spaces:Nnn}{
+ \seq_set_split_keep_spaces:Nnn \l_my_seq { | } { }
+ \seq_log:N \l_my_seq
+ \seq_set_split_keep_spaces:Nnn \l_my_seq { , } { a, }
+ \seq_log:N \l_my_seq
+ \seq_set_split_keep_spaces:Nnn \l_my_seq { , } { a~,~b }
+ \seq_log:N \l_my_seq
+ \seq_set_split_keep_spaces:Nnn \l_my_seq { | }
+ { ~ a | b | ~c~ | {|} | ~{~|{}~} | d ~ }
+ \seq_log:N \l_my_seq
+ \seq_set_split_keep_spaces:Nnn \l_my_seq { ~ }
+ { Hello,~world,~my~name~is~LaTeX3! }
+ \seq_log:N \l_my_seq
+ \seq_set_split_keep_spaces:Nnn \l_my_seq { } { abcdefghijklm }
+ \seq_log:N \l_my_seq
+}
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\TEST{seq_set_(filter|map):NNn}{
diff --git a/l3kernel/testfiles/m3seq004.tlg b/l3kernel/testfiles/m3seq004.tlg
index a0dab4fc6..8d721efd2 100644
--- a/l3kernel/testfiles/m3seq004.tlg
+++ b/l3kernel/testfiles/m3seq004.tlg
@@ -68,7 +68,47 @@ The sequence \l_my_seq contains the items (without outer braces):
> {m}.
============================================================
============================================================
-TEST 3: seq_set_(filter|map):NNn
+TEST 3: seq_set_split_keep_spaces:Nnn
+============================================================
+The sequence \l_my_seq contains the items (without outer braces):
+> {}.
+The sequence \l_my_seq contains the items (without outer braces):
+> {a}
+> {}.
+The sequence \l_my_seq contains the items (without outer braces):
+> {a }
+> { b}.
+The sequence \l_my_seq contains the items (without outer braces):
+> { a}
+> {b}
+> { c }
+> {|}
+> { { |{} }}
+> {d }.
+The sequence \l_my_seq contains the items (without outer braces):
+> {Hello,}
+> {world,}
+> {my}
+> {name}
+> {is}
+> {LaTeX3!}.
+The sequence \l_my_seq contains the items (without outer braces):
+> {a}
+> {b}
+> {c}
+> {d}
+> {e}
+> {f}
+> {g}
+> {h}
+> {i}
+> {j}
+> {k}
+> {l}
+> {m}.
+============================================================
+============================================================
+TEST 4: seq_set_(filter|map):NNn
============================================================
The sequence \l_my_seq contains the items (without outer braces):
> {4}
More information about the latex3-commits
mailing list.