[latex3-commits] [git/LaTeX3-latex3-latex2e] gh479: Automate a bit and tidy the make-harmless code (c0a09135)
PhelypeOleinik
phelype.oleinik at latex-project.org
Fri Mar 19 02:04:04 CET 2021
Repository : https://github.com/latex3/latex2e
On branch : gh479
Link : https://github.com/latex3/latex2e/commit/c0a09135c6534a4504d4dd840092f911fa706d07
>---------------------------------------------------------------
commit c0a09135c6534a4504d4dd840092f911fa706d07
Author: PhelypeOleinik <phelype.oleinik at latex-project.org>
Date: Thu Mar 18 22:04:04 2021 -0300
Automate a bit and tidy the make-harmless code
Also add \changes entries and step the file version
>---------------------------------------------------------------
c0a09135c6534a4504d4dd840092f911fa706d07
base/latexrelease.dtx | 135 +++++++++++++++++++++++++-------------------------
1 file changed, 68 insertions(+), 67 deletions(-)
diff --git a/base/latexrelease.dtx b/base/latexrelease.dtx
index e3900892..c390a360 100644
--- a/base/latexrelease.dtx
+++ b/base/latexrelease.dtx
@@ -40,7 +40,7 @@
%<*latexrelease>
% \fi
% \ProvidesFile{latexrelease.dtx}
- [2021/01/23 v1.0l LaTeX release emulation and tests
+ [2021/03/18 v1.0m LaTeX release emulation and tests
(including releases up to \latexreleaseversion)]
% \iffalse
%</latexrelease>
@@ -391,6 +391,7 @@
%
% \begin{macro}{\sourceLaTeXdate}
% \changes{v1.0l}{2021/01/23}{\cs{sourceLaTeXdate} added}
+% \changes{v1.0m}{2021/03/18}{Define \cs{sourceLaTeXdate} conditionally}
% Store the original \LaTeX{} format version
% as a number in the format |YYYYMMDD|. This macro has to
% be defined conditionally, so that it isn't changed in case
@@ -501,72 +502,83 @@ of this package available from CTAN}
%
% \section{Ignoring \texttt{\string_new} errors when rolling back}
%
+% \changes{v1.0m}{2021/03/18}
+% {Make \texttt{\string_new} definitions harmless}
% \begin{macrocode}
\ExplSyntaxOn
+%<@@=latexrelease>
% \end{macrocode}
%
+% First we'll define a \cs{declarecommand} that does \cs{renewcommand}
+% if the command being defined already exists, and \cs{newcommand}
+% otherwise.
% \begin{macrocode}
-\cs_set_eq:NN \__latexrelease_cs_if_free:NF \cs_if_free:NF
-\cs_set_eq:NN \__latexrelease___kernel_chk_if_free_cs:N \__kernel_chk_if_free_cs:N
+\cs_new_protected:Npn \@@_declare_command:w
+ { \@star at or@long \@@_declare_command:Nw }
+\cs_new_protected:Npn \@@_declare_command:Nw #1
+ { \cs_if_exist:NTF #1 { \renew at command } { \new at command } #1 }
% \end{macrocode}
%
+% Now create a token list to hold the list of changed commands, and
+% define a temporary macro that will loop through the command list,
+% store each in \cs{l_@@_restores_tl}, save a copy, and redefine each.
% \begin{macrocode}
-\cs_set_eq:NN \__latexrelease___kernel_msg_error:nnx \__kernel_msg_error:nnx
-\cs_set_eq:NN \__latexrelease___kernel_msg_new:nn \__kernel_msg_new:nn
-\cs_set_eq:NN \__kernel_msg_new:nnn \__latexrelease___kernel_msg_new:nnn
-\cs_set_eq:NN \__latexrelease_msg_new:nn \msg_new:nn
-\cs_set_eq:NN \__latexrelease_msg_new:nnn \msg_new:nnn
-\cs_set_eq:NN \__latexrelease_msg_new:nnnn \msg_new:nnnn
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_set_eq:NN \__latexrelease_NewDocumentCommand \NewDocumentCommand
-\cs_set_eq:NN \__latexrelease_newcommand \newcommand
-% \end{macrocode}
-%
-% The new definitions while rolling back:
-% \begin{macrocode}
-\cs_set_eq:NN \cs_if_free:NF \use_none:nn
-\cs_set_eq:NN \__kernel_chk_if_free_cs:N \use_none:n
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_set_eq:NN \__kernel_msg_error:nnx \__kernel_msg_info:nnx
-\cs_set_eq:NN \__kernel_msg_new:nn \__kernel_msg_set:nn
-\cs_set_eq:NN \__kernel_msg_new:nnn \__kernel_msg_set:nnn
-\cs_set_eq:NN \msg_new:nn \msg_set:nn
-\cs_set_eq:NN \msg_new:nnn \msg_set:nnn
-\cs_set_eq:NN \msg_new:nnnn \msg_set:nnnn
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\declarecommand{\@star at or@long\declare at command}
-\def\declare at command#1{%
- \@tempswafalse
- \ifx#1\@undefined \@tempswatrue \else % not the way to do it but ...
- \ifx#1\relax \@tempswatrue \fi \fi % good enough for now
- \if at tempswa
- \expandafter\new at command
- \else
- \expandafter\renew at command
- \fi
- #1}
+\tl_new:N \l_@@_restores_tl
+\cs_new:Npn \@@_tmp:w #1 #2
+ {
+ \quark_if_recursion_tail_stop:N #1
+ \tl_put_right:Nn \l_@@_restores_tl {#1}
+ \cs_set_eq:cN { @@_ \cs_to_str:N #1 } #1
+ \cs_set_eq:NN #1 #2
+ \@@_tmp:w
+ }
+\tl_clear:N \l_@@_restores_tl
% \end{macrocode}
%
+% The redefinitions below are needed because:
+% \begin{description}
+% \def\makelabel#1{\cs{#1}}
+% \item[__kernel_chk_if_free_cs:N] This function is used ubiquitously
+% in the \pkg{l3kernel} to check if a control sequence is definable,
+% and give an error otherwise (similar to \cs{@ifdefinable}).
+% Making it a no-op is enough for most cases (except when defining
+% new registers);
+% \item[__kernel_msg_error:nnx] This command is used to error on
+% already defined scan marks. Just making the error do nothing is
+% enough, as no action is taken in that case;
+% \item[__kernel_msg_new:nnn] Used to define new messages. Making it
+% \texttt{\string_set} is enough;
+% \item[__kernel_msg_new:nnnn] Same as above;
+% \item[msg_new:nnn] Same as above;
+% \item[msg_new:nnnn] Same as above;
+% \item[NewDocumentCommand] Used to define user-level commands in the
+% kernel. Making it equal to \cs{DeclareDocumentCommand} solves the
+% problem;
+% \item[newcommand] Same as above.
+% \end{description}
+% And here we go:
% \begin{macrocode}
-\cs_set_eq:NN \NewDocumentCommand\DeclareDocumentCommand
-\cs_set_eq:NN \newcommand \declarecommand
+\@@_tmp:w
+ \__kernel_chk_if_free_cs:N \use_none:n
+ \__kernel_msg_error:nnx \use_none:nnn
+ \__kernel_msg_new:nnn \__kernel_msg_set:nnn
+ \__kernel_msg_new:nnnn \__kernel_msg_set:nnnn
+ \msg_new:nnn \msg_set:nnn
+ \msg_new:nnnn \msg_set:nnnn
+ \NewDocumentCommand \DeclareDocumentCommand
+ \newcommand \@@_declare_command:w
+ \q_recursion_tail \q_recursion_tail
+ \q_recursion_stop
% \end{macrocode}
%
+% Finally, redirect the error thrown by \cs{NewHook} to nowhere so it
+% can be safely reused (the hook isn't redeclared if it already exists).
% \begin{macrocode}
-\msg_redirect_name:nnn {hooks} {exists} {none}
+\msg_redirect_name:nnn { hooks } { exists } { none }
% \end{macrocode}
%
% \begin{macrocode}
\ExplSyntaxOff
-% \end{macrocode}
-%
-% \begin{macrocode}
%</latexrelease>
% \end{macrocode}
%
@@ -574,38 +586,27 @@ of this package available from CTAN}
%
% \begin{macrocode}
%<*latexrelease-finish>
-% \end{macrocode}
-%
-% \begin{macrocode}
\ExplSyntaxOn
% \end{macrocode}
%
+% Now just loop through the list of redefined commands and restore their
+% previous meanings.
% \begin{macrocode}
-\cs_set_eq:NN \cs_if_free:NF \__latexrelease_cs_if_free:NF
-\cs_set_eq:NN \__kernel_chk_if_free_cs:N \__latexrelease___kernel_chk_if_free_cs:N
-\cs_set_eq:NN \__kernel_msg_error:nnx \__latexrelease___kernel_msg_error:nnx
-\cs_set_eq:NN \__kernel_msg_new:nn \__latexrelease___kernel_msg_new:nn
-\cs_set_eq:NN \__kernel_msg_new:nn \__latexrelease___kernel_msg_new:nnn
-\cs_set_eq:NN \msg_new:nn \__latexrelease_msg_new:nn
-\cs_set_eq:NN \msg_new:nnn \__latexrelease_msg_new:nnn
-\cs_set_eq:NN \msg_new:nnnn \__latexrelease_msg_new:nnnn
-\cs_set_eq:NN \NewDocumentCommand \__latexrelease_NewDocumentCommand
-\cs_set_eq:NN \newcommand \__latexrelease_newcommand
+\tl_map_inline:Nn \l_@@_restores_tl
+ { \cs_set_eq:Nc #1 { @@_ \cs_to_str:N #1 } }
% \end{macrocode}
%
+% And restore the hook error message.
% \begin{macrocode}
-\msg_redirect_name:nnn {hooks} {exists} {}
+\msg_redirect_name:nnn { hooks } { exists } { }
% \end{macrocode}
%
% \begin{macrocode}
+%<@@=>
\ExplSyntaxOff
-% \end{macrocode}
-%
-% \begin{macrocode}
%</latexrelease-finish>
% \end{macrocode}
%
-%
% \section{Individual Changes}
%
% The code for each change will be inserted at this point, extracted
More information about the latex3-commits
mailing list.