[latex3-commits] [latex3/latex3] main: Reduce variant-generation in l3doc (96a159e27)
github at latex-project.org
github at latex-project.org
Mon Nov 27 23:31:44 CET 2023
Repository : https://github.com/latex3/latex3
On branch : main
Link : https://github.com/latex3/latex3/commit/96a159e27d20391d96a162efd5cd5fe09024bc82
>---------------------------------------------------------------
commit 96a159e27d20391d96a162efd5cd5fe09024bc82
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date: Mon Nov 27 19:57:59 2023 +0000
Reduce variant-generation in l3doc
Where appropriate, we add variants to the core as a result:
these are likely to be of general utility.
There are a few internal tune-ups too:
some help avoid variants.
>---------------------------------------------------------------
96a159e27d20391d96a162efd5cd5fe09024bc82
l3kernel/l3doc.dtx | 118 ++++++++++++++++++++---------------------------------
l3kernel/l3tl.dtx | 77 ++++++++++++++++++++++++----------
2 files changed, 100 insertions(+), 95 deletions(-)
diff --git a/l3kernel/l3doc.dtx b/l3kernel/l3doc.dtx
index f587f32f5..ca9674fb3 100644
--- a/l3kernel/l3doc.dtx
+++ b/l3kernel/l3doc.dtx
@@ -955,48 +955,19 @@ and all files in that bundle must be distributed together.
% \begin{macro}
% {
% \seq_set_split:NoV,
-% \str_case:fn,
-% \tl_count:f,
-% \tl_greplace_all:Nen,
-% \tl_greplace_all:Nno,
-% \tl_if_head_eq_charcode:oNTF,
-% \tl_if_head_eq_charcode:oNT,
-% \tl_if_head_eq_charcode:oNF,
-% \tl_if_head_eq_meaning:VNF,
-% \tl_if_in:noTF,
-% \tl_if_in:ooTF,
-% \tl_if_in:NoTF,
-% \tl_if_in:NoT,
-% \tl_if_in:NoF,
-% \tl_replace_all:Non,
-% \tl_replace_all:Nno,
-% \tl_replace_once:Noo,
-% \tl_to_str:f,
-% \tl_to_str:o,
+% \tl_to_str:f
% }
% A few missing variants.
% \begin{macrocode}
\cs_generate_variant:Nn \seq_set_split:Nnn { NoV }
-\cs_generate_variant:Nn \seq_gput_right:Nn { Nf }
-\cs_generate_variant:Nn \str_case:nn { fn }
-\cs_generate_variant:Nn \tl_count:n { f }
-\cs_generate_variant:Nn \tl_greplace_all:Nnn { Nx , Nno }
-\prg_generate_conditional_variant:Nnn \tl_if_empty:n { f } { TF }
-\prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN { o } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \tl_if_head_eq_meaning:nN { V } { F }
-\prg_generate_conditional_variant:Nnn \tl_if_in:nn { no , oo } { TF }
-\prg_generate_conditional_variant:Nnn \tl_if_in:Nn { No } { T , F , TF }
-\cs_generate_variant:Nn \tl_replace_all:Nnn { No , Nno }
-\cs_generate_variant:Nn \tl_replace_once:Nnn { Noo }
-\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
-\cs_generate_variant:Nn \tl_to_str:n { f , o }
+\cs_generate_variant:Nn \tl_to_str:n { f }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_if_almost_str:n}
% Used to test if the argument of |\cmd| or other macros to be indexed
% is almost a string or not: for instance this is \texttt{false} if |#1|
-% contains |\meta{...}|. The surprising |f|-expansion are there to
+% contains |\meta{...}|. The surprising |f|-expansion is there to
% cope with the case of |#1| starting with \cs{c_backslash_str}
% which should be expanded and considered to be \enquote{normal}.
% \begin{macrocode}
@@ -1004,7 +975,7 @@ and all files in that bundle must be distributed together.
{
\int_compare:nNnTF
{ \tl_count:n {#1} }
- < { \tl_count:f { \tl_to_str:f {#1} } }
+ < { \tl_count:e { \tl_to_str:f {#1} } }
{ \prg_return_false: }
{ \prg_return_true: }
}
@@ -1102,7 +1073,7 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_detect_internals_aux:N #1
{
\tl_set_eq:NN \l_@@_detect_internals_tl #1
- \tl_replace_all:Non \l_@@_detect_internals_tl { \token_to_str:N _ } { _ }
+ \tl_replace_all:NVn \l_@@_detect_internals_tl \c_underscore_str { _ }
\seq_set_split:NnV \l_@@_tmpa_seq { _ _ } \l_@@_detect_internals_tl
\seq_pop_left:NN \l_@@_tmpa_seq \l_@@_detect_internals_tl
\seq_map_variable:NNn \l_@@_tmpa_seq \l_@@_detect_internals_tl
@@ -1985,9 +1956,9 @@ and all files in that bundle must be distributed together.
\bool_if:NT \l_@@_cmd_replace_bool
{
\tl_set_rescan:Nnn \l_@@_tmpb_tl { } { _ }
- \tl_replace_all:Non \l_@@_cmd_tl \l_@@_tmpb_tl { _ }
+ \tl_replace_all:NVn \l_@@_cmd_tl \l_@@_tmpb_tl { _ }
\@@_replace_at_at:N \l_@@_cmd_tl
- \tl_replace_all:Nno \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
+ \tl_replace_all:NnV \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
}
% \end{macrocode}
% Typesetting.
@@ -2067,7 +2038,7 @@ and all files in that bundle must be distributed together.
{
\tl_set_rescan:Nnn \l_@@_tmpb_tl
{ \char_set_catcode:nn { `_ } {##1} } { _ }
- \tl_replace_all:Non \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \tl_replace_all:NVn \l_@@_tmpa_tl \l_@@_tmpb_tl
{ \@@_ensuremath_sb:n }
}
\exp_args:NV \@@_meta_original:n \l_@@_tmpa_tl
@@ -2147,8 +2118,8 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_get_hyper_target:nN #1#2
{
\__kernel_tl_set:Ne #2 { \tl_to_str:n {#1} }
- \tl_replace_all:Nen #2 { \c_underscore_str } { / }
- \tl_remove_all:Ne #2 { \c_backslash_str }
+ \tl_replace_all:NVn #2 \c_underscore_str { / }
+ \tl_remove_all:NV #2 \c_backslash_str
\tl_put_left:Nn #2 { doc/function// }
}
\cs_generate_variant:Nn \@@_get_hyper_target:nN { o , e }
@@ -2274,8 +2245,8 @@ and all files in that bundle must be distributed together.
{
\seq_pop:NN #1 \l_@@_tmpa_tl
\tl_gset_eq:NN \g_@@_base_name_tl \l_@@_tmpa_tl
- \tl_greplace_all:Nno \g_@@_base_name_tl
- { ~ } { \c_catcode_other_space_tl }
+ \tl_greplace_all:NnV \g_@@_base_name_tl
+ { ~ } \c_catcode_other_space_tl
\seq_get:NN #1 \l_@@_tmpa_tl
\str_if_eq:VnTF \l_@@_tmpa_tl { \scan_stop: }
{
@@ -2345,7 +2316,7 @@ and all files in that bundle must be distributed together.
\bool_if:NTF \l_@@_macro_internal_bool
{ \prg_return_true: }
{
- \tl_if_empty:fTF
+ \tl_if_empty:eTF
{
\exp_after:wN \@@_if_macro_internal_aux:w
\tl_to_str:n { #1 ~ __ }
@@ -3009,8 +2980,8 @@ and all files in that bundle must be distributed together.
\tl_if_empty:NTF \l_@@_macro_documented_tl
{ \@@_names_block_base_map:N \@@_macro_save_names_aux:n }
{
- \seq_gput_right:Nf \g_@@_nested_names_seq
- { \exp_after:wN \token_to_str:N \l_@@_macro_documented_tl }
+ \seq_gput_right:Ne \g_@@_nested_names_seq
+ { \tl_to_str:N \l_@@_macro_documented_tl }
}
}
\cs_new_protected:Npn \@@_macro_save_names_aux:n #1
@@ -3180,8 +3151,8 @@ and all files in that bundle must be distributed together.
\int_compare:nTF { \str_count:n {#1} <= 28 }
{ \MacroFont } { \MacroLongFont }
\tl_set:Nn \l_@@_tmpa_tl {#1}
- \tl_replace_all:Nno \l_@@_tmpa_tl
- { ~ } { \c_catcode_other_space_tl }
+ \tl_replace_all:NnV \l_@@_tmpa_tl
+ { ~ } \c_catcode_other_space_tl
\@@_macroname_prefix:o \l_@@_tmpa_tl
\@@_macroname_suffix:N #2
}
@@ -3361,8 +3332,8 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_macro_end_wrap_item:n #1
{
\tl_set:Nn \l_@@_tmpa_tl {#1}
- \tl_replace_all:Non \l_@@_tmpa_tl
- { \token_to_str:N _ } { \_ }
+ \tl_replace_all:NVn \l_@@_tmpa_tl
+ \c_underscore_str { \_ }
\texttt { \l_@@_tmpa_tl }
}
\cs_new_protected:Npn \@@_print_end_definition:
@@ -3409,7 +3380,7 @@ and all files in that bundle must be distributed together.
}
\prg_new_conditional:Npnn \@@_if_macro_primitive:n #1 { p }
{
- \tl_if_empty:fTF
+ \tl_if_empty:eTF
{
\exp_after:wN \@@_if_macro_primitive_aux:w
\tl_to_str:n { #1 :D }
@@ -4371,7 +4342,7 @@ and all files in that bundle must be distributed together.
\__kernel_tl_set:Ne #1 { \tl_to_str:n {#2} }
\@@_if_almost_str:nTF {#2}
{
- \tl_replace_all:Non #1 { \tl_to_str:n { __ } }
+ \tl_replace_all:Nen #1 { \tl_to_str:n { __ } }
{
\verbatimchar
\token_to_str:N \_ \token_to_str:N \_
@@ -4394,8 +4365,8 @@ and all files in that bundle must be distributed together.
}
{
\tl_set:Nn #1 {#2}
- \tl_replace_all:Non #1
- { \c_backslash_str }
+ \tl_replace_all:NVn #1
+ \c_backslash_str
{ \token_to_str:N \bslash \c_space_tl }
}
\@@_quote_special_char:N #1
@@ -4434,27 +4405,26 @@ and all files in that bundle must be distributed together.
% module name, while for \TeX{}/\LaTeXe{} commands the module name is
% |TeX|, and others have an empty module name.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_key_get:n #1
- {
- \@@_key_get_base:nN {#1} \l_@@_index_macro_tl
- \__kernel_tl_set:Ne \l_@@_index_key_tl
- { \tl_to_str:N \l_@@_index_macro_tl }
- \tl_clear:N \l_@@_index_module_tl
- \tl_if_in:NoTF \l_@@_index_key_tl { \tl_to_str:n { __ } }
- { \bool_set_true:N \l_@@_index_internal_bool }
- { \bool_set_false:N \l_@@_index_internal_bool }
- \exp_last_unbraced:NNo
- \tl_if_head_eq_charcode:oNT
- { \l_@@_index_key_tl } \c_backslash_str
- { \@@_key_pop: }
- \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N : }
- { \@@_key_func: }
+\cs_new_protected:Npe \@@_key_get:n #1
+ {
+ \exp_not:N \@@_key_get_base:nN {#1} \exp_not:N \l_@@_index_macro_tl
+ \__kernel_tl_set:Ne \exp_not:N \l_@@_index_key_tl
+ { \exp_not:N \tl_to_str:N \exp_not:N \l_@@_index_macro_tl }
+ \tl_clear:N \exp_not:N \l_@@_index_module_tl
+ \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \tl_to_str:n { __ } }
+ { \bool_set_true:N \exp_not:N \l_@@_index_internal_bool }
+ { \bool_set_false:N \exp_not:N \l_@@_index_internal_bool }
+ \exp_not:N \tl_if_head_eq_charcode:VNT
+ \exp_not:N \l_@@_index_key_tl \c_backslash_str
+ { \exp_not:N \@@_key_pop: }
+ \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \token_to_str:N : }
+ { \exp_not:N \@@_key_func: }
{
- \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N _ }
- { \@@_key_var: }
+ \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \token_to_str:N _ }
+ { \exp_not:N \@@_key_var: }
{
- \tl_if_in:NoT \l_@@_index_key_tl { \token_to_str:N @ }
- { \tl_set:Nn \l_@@_index_module_tl { TeX } }
+ \tl_if_in:NnT \exp_not:N \l_@@_index_key_tl { \token_to_str:N @ }
+ { \tl_set:Nn \exp_not:N \l_@@_index_module_tl { TeX } }
}
}
}
@@ -4480,7 +4450,7 @@ and all files in that bundle must be distributed together.
}
\cs_new_protected:Npn \@@_key_drop_underscores:
{
- \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } _
+ \tl_if_head_eq_charcode:VNT \l_@@_index_key_tl _
{ \@@_key_pop: \@@_key_drop_underscores: }
}
% \end{macrocode}
@@ -4495,7 +4465,7 @@ and all files in that bundle must be distributed together.
% \begin{macrocode}
\cs_new_protected:Npn \@@_key_func:
{
- \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } .
+ \tl_if_head_eq_charcode:VNT \l_@@_index_key_tl .
{ \@@_key_pop: }
\@@_key_drop_underscores:
\tl_set_eq:NN \l_@@_index_module_tl \l_@@_index_key_tl
@@ -4531,7 +4501,7 @@ and all files in that bundle must be distributed together.
\exp_args:Ne \tl_if_head_eq_charcode:nNTF
{ \exp_args:No \str_tail:n \l_@@_index_key_tl } _
{
- \str_case:fn { \str_head:N \l_@@_index_key_tl }
+ \str_case:en { \str_head:N \l_@@_index_key_tl }
{
{ q } { \tl_set:Nn \l_@@_index_module_tl { quark } }
{ s } { \tl_set:Nn \l_@@_index_module_tl { scan } }
diff --git a/l3kernel/l3tl.dtx b/l3kernel/l3tl.dtx
index 1b6b9367d..f6f9a0814 100644
--- a/l3kernel/l3tl.dtx
+++ b/l3kernel/l3tl.dtx
@@ -295,7 +295,11 @@
% or \cs{str_if_eq:nnTF} if category codes are not important.
% \end{function}
%
-% \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:cn, \tl_if_in:cV}
+% \begin{function}[TF]
+% {
+% \tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:No,
+% \tl_if_in:cn, \tl_if_in:cV, \tl_if_in:co
+% }
% \begin{syntax}
% \cs{tl_if_in:NnTF} \meta{tl~var} \Arg{token list} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -307,7 +311,10 @@
% \end{function}
%
% \begin{function}[TF]
-% {\tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:nV, \tl_if_in:on, \tl_if_in:no}
+% {
+% \tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:VV, \tl_if_in:on, \tl_if_in:oo,
+% \tl_if_in:nV, \tl_if_in:no
+% }
% \begin{syntax}
% \cs{tl_if_in:nnTF} \Arg{token list_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -367,7 +374,10 @@
% \subsection{Testing the first token}
%
% \begin{function}[updated = 2012-07-09, EXP, pTF]
-% {\tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:oN}
+% {
+% \tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:VN,
+% \tl_if_head_eq_catcode:eN, \tl_if_head_eq_catcode:oN
+% }
% \begin{syntax}
% \cs{tl_if_head_eq_catcode_p:nN} \Arg{token list} \meta{test token}
% \cs{tl_if_head_eq_catcode:nNTF} \Arg{token list} \meta{test token}
@@ -379,7 +389,10 @@
% \end{function}
%
% \begin{function}[updated = 2012-07-09, EXP, pTF]
-% {\tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:fN}
+% {
+% \tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:VN,
+% \tl_if_head_eq_charcode:eN, \tl_if_head_eq_charcode:fN
+% }
% \begin{syntax}
% \cs{tl_if_head_eq_charcode_p:nN} \Arg{token list} \meta{test token}
% \cs{tl_if_head_eq_charcode:nNTF} \Arg{token list} \meta{test token}
@@ -390,7 +403,11 @@
% \meta{token list} is empty, the test is always \texttt{false}.
% \end{function}
%
-% \begin{function}[updated = 2012-07-09, EXP, pTF]{\tl_if_head_eq_meaning:nN}
+% \begin{function}[updated = 2012-07-09, EXP, pTF]
+% {
+% \tl_if_head_eq_meaning:nN, \tl_if_head_eq_meaning:VN,
+% \tl_if_head_eq_meaning:eN
+% }
% \begin{syntax}
% \cs{tl_if_head_eq_meaning_p:nN} \Arg{token list} \meta{test token}
% \cs{tl_if_head_eq_meaning:nNTF} \Arg{token list} \meta{test token}
@@ -516,7 +533,7 @@
% \subsection{Counting and reversing token lists}
%
% \begin{function}[added = 2012-05-13, EXP]
-% {\tl_count:n, \tl_count:V, \tl_count:o}
+% {\tl_count:n, \tl_count:V, \tl_count:v, \tl_count:e, \tl_count:o}
% \begin{syntax}
% \cs{tl_count:n} \Arg{tokens}
% \end{syntax}
@@ -2437,7 +2454,11 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:cn, \tl_if_in:cV}
+% \begin{macro}[TF]
+% {
+% \tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:No,
+% \tl_if_in:cn, \tl_if_in:cV, \tl_if_in:co
+% }
% See \cs{tl_if_in:nnTF} for further comments. Here we simply
% expand the token list variable and pass it to \cs{tl_if_in:nnTF}.
% \begin{macrocode}
@@ -2445,11 +2466,15 @@
\cs_new_protected:Npn \tl_if_in:NnF { \exp_args:No \tl_if_in:nnF }
\cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
\prg_generate_conditional_variant:Nnn \tl_if_in:Nn
- { NV , c , cV } { T , F , TF }
+ { NV , No , c , cV , co } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:on, \tl_if_in:nV, \tl_if_in:no}
+% \begin{macro}[TF]
+% {
+% \tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:VV, \tl_if_in:on, \tl_if_in:oo,
+% \tl_if_in:nV, \tl_if_in:no
+% }
% Once more, the test relies on the emptiness test for robustness.
% The function \cs{@@_tmp:w} removes tokens until the first occurrence
% of |#2|. If this does not appear in |#1|, then the final |#2| is removed,
@@ -2479,7 +2504,7 @@
\if_false: } \fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_in:nn
- { V , o , nV , no } { T , F , TF }
+ { V , VV , o , oo , nV , no } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
@@ -2759,7 +2784,7 @@
%
% \subsection{Working with the contents of token lists}
%
-% \begin{macro}{\tl_count:n, \tl_count:V, \tl_count:o}
+% \begin{macro}{\tl_count:n, \tl_count:V, \tl_count:v, \tl_count:e, \tl_count:o}
% \begin{macro}{\tl_count:N, \tl_count:c}
% \begin{macro}{\@@_count:n}
% Count number of elements within a token list or token list
@@ -2779,7 +2804,7 @@
{ 0 \tl_map_function:NN #1 \@@_count:n }
}
\cs_new:Npn \@@_count:n #1 { + 1 }
-\cs_generate_variant:Nn \tl_count:n { V , o }
+\cs_generate_variant:Nn \tl_count:n { V , v , e , o }
\cs_generate_variant:Nn \tl_count:N { c }
% \end{macrocode}
% \end{macro}
@@ -3017,11 +3042,21 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[pTF]{\tl_if_head_eq_meaning:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_charcode:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_charcode:fN}
-% \begin{macro}[pTF]{\tl_if_head_eq_catcode:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_catcode:oN}
+% \begin{macro}[pTF]
+% {
+% \tl_if_head_eq_meaning:nN, \tl_if_head_eq_meaning:VN
+% \tl_if_head_eq_meaning:eN
+% }
+% \begin{macro}[pTF]
+% {
+% \tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:VN
+% \tl_if_head_eq_charcode:eN, \tl_if_head_eq_charcode:fN
+% }
+% \begin{macro}[pTF]
+% {
+% \tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:VN
+% \tl_if_head_eq_catcode:eN, \tl_if_head_eq_catcode:oN
+% }
% \begin{macro}[EXP]{\@@_head_exp_not:w}
% \begin{macro}[EXP]{\@@_if_head_eq_empty_arg:w}
% Accessing the first token of a token list is tricky in three cases:
@@ -3060,7 +3095,7 @@
\fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN
- { f } { p , TF , T , F }
+ { V , e , f } { p , TF , T , F }
% \end{macrocode}
% For \cs{tl_if_head_eq_catcode:nN}, again we detect special cases
% with a \cs{tl_if_head_is_N_type:n}. Then we need to test if the
@@ -3087,7 +3122,7 @@
\fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_head_eq_catcode:nN
- { o } { p , TF , T , F }
+ { V , e , o } { p , TF , T , F }
% \end{macrocode}
% For \cs{tl_if_head_eq_meaning:nN}, again, detect special cases. In
% the normal case, use \cs{tl_head:w}, with no \cs{exp_not:N} this
@@ -3108,6 +3143,8 @@
\@@_if_head_eq_meaning_special:nN
{#1} #2
}
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_meaning:nN
+ { V , e } { p , TF , T , F }
\cs_new:Npn \@@_if_head_eq_meaning_normal:nN #1 #2
{
\exp_after:wN \if_meaning:w
@@ -3161,8 +3198,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}[pTF]{\tl_if_head_is_N_type:n}
% \begin{macro}[EXP]
More information about the latex3-commits
mailing list.