Skip to content

Commit

Permalink
Fix result of \@ifdefinable on the empty cs
Browse files Browse the repository at this point in the history
fixes #778
  • Loading branch information
PhelypeOleinik committed Jun 13, 2022
1 parent ec35ad5 commit 952afcb
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 6 deletions.
27 changes: 25 additions & 2 deletions base/ltdefns.dtx
Expand Up @@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
[2022/05/13 v1.5q LaTeX Kernel (definition commands)]
[2022/06/12 v1.5r LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
Expand Down Expand Up @@ -671,23 +671,46 @@
% \changes{v1.0n}{1994/05/10}{Removed braces around \cs{@ifundefined}
% argument. ASAJ.}
% \changes{v1.0s}{1994/05/13}{Coded more efficiently, thanks to FMi.}
% \changes{v1.5r}{2022/06/12}{Fix result of \cs{@ifdefinable} on the empty cs (gh/778).}
%
% \begin{macro}{\@ifdefinable}
% \begin{macro}{\@@ifdefinable}
% \begin{macro}{\@rc@ifdefinable}
% Test if user is allowed to define a command.
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2022/11/01}{\@ifdefinable}
%<latexrelease> {Fix \cs{@ifdefinable} on the empty cs}%
\long\def\@ifdefinable #1#2{%
\edef\reserved@a{\expandafter\@gobble\string #1}%
\@ifundefined\reserved@a
\@expl@cs@if@free@@NTF #1%
{\edef\reserved@b{\expandafter\@carcube \reserved@a xxx\@nil}%
\ifx \reserved@b\@qend \@notdefinable\else
\ifx \reserved@a\@qrelax \@notdefinable\else
#2%
\fi
\fi}%
\@notdefinable}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>
%<latexrelease>\IncludeInRelease{0000/00/00}{\@ifdefinable}
%<latexrelease> {Fix \cs{@ifdefinable} on the empty cs}%
%<latexrelease>\long\def\@ifdefinable #1#2{%
%<latexrelease> \edef\reserved@a{\expandafter\@gobble\string #1}%
%<latexrelease> \@ifundefined\reserved@a
%<latexrelease> {\edef\reserved@b{\expandafter\@carcube \reserved@a xxx\@nil}%
%<latexrelease> \ifx \reserved@b\@qend \@notdefinable\else
%<latexrelease> \ifx \reserved@a\@qrelax \@notdefinable\else
%<latexrelease> #2%
%<latexrelease> \fi
%<latexrelease> \fi}%
%<latexrelease> \@notdefinable}
%<latexrelease>\EndIncludeInRelease
%</2ekernel|latexrelease>
%<*2ekernel>
% \end{macrocode}
%
% Saved definition of |\@ifdefinable|.
% \begin{macrocode}
\let\@@ifdefinable\@ifdefinable
Expand Down
9 changes: 8 additions & 1 deletion base/ltexpl.dtx
Expand Up @@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltexpl.dtx}
[2022/02/28 v1.3f LaTeX Kernel (expl3-dependent code)]
[2022/06/12 v1.3g LaTeX Kernel (expl3-dependent code)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltexpl.dtx}
Expand Down Expand Up @@ -371,6 +371,12 @@
\cs_gset_eq:NN \@expl@char@generate@@nn \char_generate:nn
% \end{macrocode}
%
% \changes{v1.3g}{2022/06/12}
% {Add \cs{@expl@cs@if@free@@NTF} for \cs{@ifdefinable} (gh/778)}
% \begin{macrocode}
\cs_gset_eq:NN \@expl@cs@if@free@@NTF \cs_if_free:NTF
% \end{macrocode}
%
% \begin{macrocode}
\ExplSyntaxOff
% \end{macrocode}
Expand All @@ -390,6 +396,7 @@
%<latexrelease>\let \@expl@cs@argument@spec@@N \@undefined
%<latexrelease>\let \@expl@cs@replacement@spec@@N \@undefined
%<latexrelease>\let \@expl@str@map@function@@NN \@undefined
%<latexrelease>% \let \@expl@cs@if@free@@NTF \@undefined
%<latexrelease>\EndIncludeInRelease
%</2ekernel|latexrelease>
% \end{macrocode}
Expand Down
24 changes: 21 additions & 3 deletions base/testfiles/github-0778.tlg
Expand Up @@ -11,14 +11,32 @@ If that doesn't work, type X <return> to quit.
->A.
<argument> \csname\endcsname
l. ......ndafter}\expandafter\test\csname\endcsname
> \csname\endcsname=\long macro:
->B.
<argument> \csname\endcsname
! LaTeX Error: Command \csname\endcsnamealready defined.
Or name \end... illegal, see p.192 of the manual.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l. ......ndafter}\expandafter\test\csname\endcsname
Your command was ignored.
Type I <command> <return> to replace it with another command,
or <return> to continue without it.
> \csname\endcsname=\long macro:
->A.
<argument> \csname\endcsname
l. ......ndafter}\expandafter\test\csname\endcsname
! LaTeX Error: Command \csname\endcsnamealready defined.
Or name \end... illegal, see p.192 of the manual.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l. ......ndafter}\expandafter\test\csname\endcsname
Your command was ignored.
Type I <command> <return> to replace it with another command,
or <return> to continue without it.
> \csname\endcsname=macro:
->\romannumeral \ifx \protect \@typeset@protect \expandafter \expandafter \expandafter \expandafter \expandafter \expandafter \expandafter \z@ \else \expandafter \z@ \expandafter \protect \fi \end .
<argument> \csname\endcsname
l. ......ndafter}\expandafter\test\csname\endcsname
> \end=\long macro:
->B.
\test ...onment {}{A}{B} \par \show #1 \show \end
Expand Down

0 comments on commit 952afcb

Please sign in to comment.