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}