Comportement étrange avec les touches d'expl3
Oct 07 2020
Considérez le MWE suivant:
\documentclass{article}
\usepackage{amsthm}
\usepackage{xparse}
\newtheorem{theorem}{Theorem}
\newtheorem{definition}{Definition}
\ExplSyntaxOn
\tl_new:N \l_theorem_name_tl
\keys_define:nn { keys-loop } {
thmname
.tl_set:N = \l_theorem_name_tl,
}
\clist_map_inline:nn { {thmname=theorem}, {thmname=definition} } {
\keys_set:nn { keys-loop } { #1 }
% At this level \l_theorem_name_tl is 'theorem' the first time and
% 'definition' the second time.
\cs_set_eq:cc {inner\l_theorem_name_tl} {\l_theorem_name_tl}
\cs_set_eq:cc {endinner\l_theorem_name_tl} {end\l_theorem_name_tl}
\RenewDocumentEnvironment{ \l_theorem_name_tl }{ O{} }{
% Now \l_theorem_name_tl is 'definition' both the first and second time?
% What is going on?
\begin{inner\l_theorem_name_tl}
This
}{
\end{inner\l_theorem_name_tl}
}
}
\ExplSyntaxOff
\begin{document}
\begin{theorem}
is a theorem.
\end{theorem}
\begin{definition}
is a definition.
\end{definition}
\begin{innertheorem}
is a theorem.
\end{innertheorem}
\begin{innerdefinition}
is a definition.
\end{innerdefinition}
\end{document}
qui produit
Pourquoi le premier theoremdevient-il un definition?
Réponses
2 Simon Oct 07 2020 at 15:26
Vous devez utiliser le contenu de \l_theorem_name_tl
\documentclass{article}
\usepackage{amsthm}
\usepackage{xparse}
\newtheorem{theorem}{Theorem}
\newtheorem{definition}{Definition}
\ExplSyntaxOn
\tl_new:N \l_theorem_name_tl
\keys_define:nn { keys-loop }
{
thmname .tl_set:N = \l_theorem_name_tl,
}
\cs_new_protected:Npn \noibe_keyset:n #1
{
\clist_map_inline:nn {#1}
{
\keys_set:nn { keys-loop } {##1}
\noibe_cs_set_eq:V \l_theorem_name_tl
\noibe_renew_env:V \l_theorem_name_tl
}
}
\cs_new_protected:Npn \noibe_cs_set_eq:n #1
{
\cs_set_eq:cc { inner#1 } {#1}
\cs_set_eq:cc { endinner#1 } { end#1 }
}
\cs_generate_variant:Nn \noibe_cs_set_eq:n { V }
\cs_new_protected:Npn \noibe_renew_env:n #1
{
\RenewDocumentEnvironment{#1}{ O{} }
{
\begin{inner#1}
This
}
{
\end{inner#1}
}
}
\cs_generate_variant:Nn \noibe_renew_env:n { V }
\NewDocumentCommand{\setkeys}{ m }
{
\noibe_keyset:n {#1}
}
\setkeys{thmname=theorem, thmname=definition}
\ExplSyntaxOff
\begin{document}
\begin{theorem}
is a theorem.
\end{theorem}
\begin{definition}
is a definition.
\end{definition}
\begin{innertheorem}
is a theorem.
\end{innertheorem}
\begin{innerdefinition}
is a definition.
\end{innerdefinition}
\end{document}
Skillmon Oct 30 2020 at 03:22
Je ne sais pas pourquoi tu passes les choses \keys_set:nn. Dans votre MWE, cela est complètement inutile et ne fait que compliquer les choses. Au lieu de cela, vous pouvez directement utiliser votre code à l'intérieur \clist_map_inline:nnet accéder aux noms d'environnement avec #1.
\documentclass{article}
\usepackage{amsthm}
\usepackage{xparse}
\newtheorem{theorem}{Theorem}
\newtheorem{definition}{Definition}
\ExplSyntaxOn
\clist_map_inline:nn { theorem, definition }
{
\cs_set_eq:cc { inner #1 } {#1}
\cs_set_eq:cc { endinner #1 } { end #1 }
\RenewDocumentEnvironment {#1}{ O{} }
{
\begin{inner#1}
This
}
{
\end{inner#1}
}
}
\ExplSyntaxOff
\begin{document}
\begin{theorem}
is a theorem.
\end{theorem}
\begin{definition}
is a definition.
\end{definition}
\begin{innertheorem}
is a theorem.
\end{innertheorem}
\begin{innerdefinition}
is a definition.
\end{innerdefinition}
\end{document}