latex3 clist 放入环境定义中

latex3 clist 放入环境定义中

我很困惑为什么以下方法不起作用:

\documentclass{article}

\usepackage{xparse}

 \ExplSyntaxOn
 \clist_new:N \l_test
 \clist_set:Nn \l_test {a,b,c}
\NewDocumentCommand{\putitem}{m}{
  \clist_put_right:Nn \l_test {#1}}
\NewDocumentEnvironment{foobar}{mm}{ FOO }{ BAR \putitem{##1}}
 \NewDocumentCommand{\giveitems}{}{\clist_map_inline:Nn \l_test {\fbox{##1}}}
 \ExplSyntaxOff

\begin{document}

 \putitem{xyz}
 \putitem{asdf}
 \giveitems

\begin{foobar}{abab}{baba}
  XXX
\end{foobar}

\giveitems % output is the same as the earlier call
\end{document}

因此,作为创建环境的一部分,应该向 clist 添加一个额外的字符串。但这样做不起作用。我希望第二个\giveitems有一个额外的项目,即abab。在新环境中用其定义替换\putitem没有任何区别。我在这里遗漏了什么?

答案1

环境形成组,这意味着您需要一个全局变量来查看外部结果。同时,使用来自环境的参数时则#1不需要。##1

\ExplSyntaxOn
\clist_new:N \g__seamus_test_clist
\clist_set:Nn \g__seamus_test_clist {a,b,c}
\NewDocumentCommand{\putitem}{m}{
  \clist_gput_right:Nn \g__seamus_test_clist {#1}
}
\NewDocumentEnvironment{foobar}{mm}
  { FOO }
  { BAR \putitem{#1}}
\NewDocumentCommand{\giveitems}{}
  {\clist_map_inline:Nn \g__seamus_test_clist {\fbox{##1}}}
\ExplSyntaxOff

相关内容