Comportamento estranho com as chaves do expl3
Oct 07 2020
Considere o seguinte MWE:
\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}
que produz
Por que o primeiro theoremse torna um definition?
Respostas
2 Simon Oct 07 2020 at 15:26
Você precisa usar o conteúdo 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
Eu não sei porque você passa as coisas \keys_set:nn. No seu MWE isso é completamente desnecessário e só complica as coisas. Em vez disso, você pode usar diretamente seu código interno \clist_map_inline:nne acessar os nomes de ambiente com #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}
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas