[latex3-commits] [latex3/latex2e] gh1189: Extend cmd copy/show to handle optimisation (667d6923)

github at latex-project.org github at latex-project.org
Tue Nov 28 18:56:52 CET 2023


Repository : https://github.com/latex3/latex2e
On branch  : gh1189
Link       : https://github.com/latex3/latex2e/commit/667d69235c8bd3350b4f299633d6085f1f476cc1

>---------------------------------------------------------------

commit 667d69235c8bd3350b4f299633d6085f1f476cc1
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Tue Nov 28 17:53:18 2023 +0000

    Extend cmd copy/show to handle optimisation


>---------------------------------------------------------------

667d69235c8bd3350b4f299633d6085f1f476cc1
 base/ltcmd.dtx                       | 67 ++++++++++++++++++++++++++++++------
 base/testfiles-ltcmd/github-1009.tlg | 28 ++++++++-------
 2 files changed, 72 insertions(+), 23 deletions(-)

diff --git a/base/ltcmd.dtx b/base/ltcmd.dtx
index ab9a129f..cc8b34ff 100644
--- a/base/ltcmd.dtx
+++ b/base/ltcmd.dtx
@@ -2070,7 +2070,7 @@
 % \begin{macro}{\@@_copy:NN}
 % \begin{macro}{\@@_set_eq_if_exist:NN,\@@_set_eq_if_exist:cc}
 %   This macro just branches to the proper copying command by using
-%   \cs{@@_cmd_type_cases:NnnnnF}.  The copying command takes the names
+%   \cs{@@_cmd_type_cases:NnnnnnF}.  The copying command takes the names
 %   of the commands to be copied to and from, and the actual commands
 %   as its four arguments.
 %    \begin{macrocode}
@@ -2079,9 +2079,10 @@
     \use:x
       {
         \int_set:Nn \tex_escapechar:D { 92 }
-        \exp_not:N \@@_cmd_type_cases:NnnnnF \exp_not:N #2
+        \exp_not:N \@@_cmd_type_cases:NnnnnnF \exp_not:N #2
           { \@@_copy_command:nnNN }
           { \@@_copy_expandable:nnNN }
+          { \@@_copy_optimised:nnNN }
           { \@@_copy_environment:nnNN }
           { \@@_copy_environment_end:nnNN }
           { \@@_cant_copy:nwn { non-ltcmd } }
@@ -2223,6 +2224,14 @@
 %<latexrelease>\EndIncludeInRelease
 %    \end{macrocode}
 %
+% \begin{macro}{\@@_copy_optimised:nnNN}
+%   Trivial copy.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_copy_optimised:nnNN #1#2#3#4
+  { \cs_set_eq:NN #3 #4 }
+%    \end{macrocode}
+% \end{macro}
+%
 %    \begin{macrocode}
 %<latexrelease>\IncludeInRelease{2021/11/15}{\@@_copy:NN (part 2)}%
 %<latexrelease>  {Support~\NewCommandCopy~in~ltcmd}
@@ -2460,7 +2469,7 @@
 %
 % \begin{macro}{\@@_show:N}
 %   This macro just branches to the proper showing command by using
-%   \cs{@@_cmd_type_cases:NnnnnF}.  The showing command takes the command
+%   \cs{@@_cmd_type_cases:NnnnnnF}.  The showing command takes the command
 %   to be shown as argument.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_show:N #1
@@ -2468,9 +2477,10 @@
     \use:x
       {
         \int_set:Nn \tex_escapechar:D { 92 }
-        \exp_not:N \@@_cmd_type_cases:NnnnnF \exp_not:N #1
+        \exp_not:N \@@_cmd_type_cases:NnnnnnF \exp_not:N #1
           { \@@_show_command:N }
           { \@@_show_expandable:N }
+          { \@@_show_optimised:N }
           { \@@_show_environment:N }
           { \@@_show_environment_end:N }
           { \@@_cant_copy:nwn { non-ltcmd } }
@@ -2487,6 +2497,7 @@
 %     \@@_show_command:NnNNwN,
 %     \@@_show_expandable:N,
 %     \@@_show_expandable:NnNNNNnN,
+%     \@@_show_optimised:N,
 %     \@@_show_command_aux:NnNNn,
 %     \@@_show_environment:N,
 %     \@@_show:x,
@@ -2567,6 +2578,37 @@
   }
 %    \end{macrocode}
 %
+% Optimised functions needs things done a bit differently as we need to
+% reconstruct the argument spec.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_show_optimised:N #1
+  {
+    \tl_show:e
+      {
+        \token_to_str:N #1 =
+          \token_if_protected_macro:NF #1 { expandable ~ } document~command:
+        \iow_newline:
+        \int_step_function:nN
+          { \tl_count:n { \cs_parameter_spec:N #1 } / 2 }
+          \@@_show_optimised_aux:N
+        ->
+        \use:e
+          {
+            \exp_not:N \@@_show_optimised_aux:w
+              \cs_replacement_spec:N #1
+          }
+      }
+  }
+\cs_new:Npn \@@_show_optimised_aux:N #1
+  { \c_space_tl \c_hash_str #1 : m \iow_newline: }
+\use:e
+  {
+    \cs_new:Npn \exp_not:N \@@_show_optimised_aux:w
+      \token_to_str:N \@@_start_optimised: \c_space_tl
+  }
+  { }
+%    \end{macrocode}
+%
 %   We can reuse most of the above to show an environment, except that
 %   we need to ensure that the proper \cs[no-index]{environment~\ldots}
 %   are passed to \cs{@@_show_command_aux:NnNNn}.  Additionally, when
@@ -4413,13 +4455,14 @@
 % \end{macro}
 %
 % \begin{macro}{\__kernel_cmd_if_xparse:NTF}
-% \begin{macro}{\@@_cmd_type_cases:Nnnnn}
+% \begin{macro}{\@@_cmd_type_cases:Nnnnnn}
 % \changes{v1.0d}{2021/04/19}{Renamed \cs{__cmd_cmd_if_xparse:NTF} to
 %      \cs{__kernel_cmd_if_xparse:NTF} for cross-module usage}
 % \changes{v1.0d}{2021/07/30}{Added \cs{@@_cmd_type_cases:NnnnnF} for
 %      \cs{NewCommandCopy} and \cs{ShowCommand} support}
 % \changes{v1.0l}{2022/03/18}{Fix \cs{@@_cmd_type_cases:NnnnnF}
 %"     prematurely expanding macros (gh/795)}
+% \changes{v1.2b}{2023/11/28}{Extend for optimised commands}
 % \begin{macro}{\@@_cmd_if_xparse_aux:N}
 %
 %    To determine whether the command is an \pkg{xparse} command check
@@ -4427,13 +4470,14 @@
 %    that its |replacement_spec| starts with either
 %    \cs{@@_start:nNNnnn} (non-expandable command) or
 %    \cs{@@_start_expandable:nNNNNn} (expandable command) or
+%    \cs{@@_start_optimised:} (optimised command) or
 %    \cs{@@_start_env:nnnnn} (environment) or
 %    \cs[no-index]{environment~\#1~end~aux} (environment end).
 %
 %    This conditional is needed in several kernel modules and is
 %    therefore has a kernel-internal name.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cmd_type_cases:NnnnnF #1 #2 #3 #4 #5 #6
+\cs_new_protected:Npn \@@_cmd_type_cases:NnnnnnF #1 #2 #3 #4 #5 #6#7
   {
     \exp_args:Ne \str_case_e:nnF
       {
@@ -4443,20 +4487,21 @@
       {
         { \exp_not:N \@@_start:nNNnnn } {#2}
         { \exp_not:N \@@_start_expandable:nNNNNn } {#3}
-        { \exp_not:N \@@_start_env:nnnnn } {#4}
+        { \exp_not:N \@@_start_optimised: } {#4}
+        { \exp_not:N \@@_start_env:nnnnn } {#5}
         {
           \exp_after:wN \exp_not:N
             \cs:w environment~
               \exp_last_unbraced:Ne \use_none:nnn
                 { \cs_to_str:N #1 } ~end~aux \cs_end:
-        } {#5}
+        } {#6}
       }
-      {#6}
+      {#7}
   }
 \cs_new_protected:Npn \__kernel_cmd_if_xparse:NTF #1
   {
-    \@@_cmd_type_cases:NnnnnF #1
-      { } { } { } { } { \use_iii:nnn }
+    \@@_cmd_type_cases:NnnnnnF #1
+      { } { } { } { } { } { \use_iii:nnn }
     \use_i:nn
   }
 %    \end{macrocode}
diff --git a/base/testfiles-ltcmd/github-1009.tlg b/base/testfiles-ltcmd/github-1009.tlg
index 67965ea5..35d0e6b5 100644
--- a/base/testfiles-ltcmd/github-1009.tlg
+++ b/base/testfiles-ltcmd/github-1009.tlg
@@ -3,13 +3,15 @@ Don't change this file in any respect.
 ============================================================
 TEST 1: Non-expandable Document Commands with m-type arguments
 ============================================================
-> \foo=\protected macro:
-->\__cmd_start_optimised: .
-<argument> \foo 
+> \foo=document command:
+ #1:m
+->.
+<recently read> }
 l. ...}
-> \baz=\protected macro:
-->\__cmd_start_optimised: .
-<argument> \baz 
+> \baz=document command:
+ #1:m
+->.
+<recently read> }
 l. ...}
 > \foo=\protected macro:
 #1->\__cmd_start_optimised: .
@@ -43,13 +45,15 @@ l. ...}
 ============================================================
 TEST 2: Expandable Document Commands with m-type arguments
 ============================================================
-> \foo=macro:
-->\__cmd_start_optimised: .
-<argument> \foo 
+> \foo=expandable document command:
+ #1:m
+->.
+<recently read> }
 l. ...}
-> \baz=macro:
-->\__cmd_start_optimised: .
-<argument> \baz 
+> \baz=expandable document command:
+ #1:m
+->.
+<recently read> }
 l. ...}
 > \foo=macro:
 #1->\__cmd_start_optimised: .





More information about the latex3-commits mailing list.