在 \clist_set 中使用 \csname 时需要额外的括号:否

在 \clist_set 中使用 \csname 时需要额外的括号:否

clist 未正确使用\cs_if_exist_use:c或进行设置\csname ... \endcsname,似乎有多余的括号。如果我使用\clist_set:Nx,则会发生错误。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\expandafter\def\csname test-1\endcsname{a,$\alpha\dotsb$,b}
\ExplSyntaxOn
\clist_new:N \l_test_clist
\NewDocumentCommand {\test} {}
  {
    \clist_set:No \l_test_clist {\cs_if_exist_use:c {test-1}}
    \clist_use:Nn \l_test_clist {*}
  }
\ExplSyntaxOff

\begin{document}
\test
\end{document}

答案1

首先,应该与 一起使用,而不是(它之所以有效,是因为它们的实现恰好相似,但你不能依赖这一点)。此外,除非函数被记录为完全扩展为\cs_if_exist_use:ccsclistn步骤,你不能保证它会扩大n步骤,如果确实如此,它最终可能会改变(例如,\char_generate:nn\prg_replicate:nn记录为分两步扩展,因此您可以依赖它)。

为了得到你想要的,你可以使用x扩展\clist_if_exist:cT然后保护价值通过使用以下clist方式扩展\exp_not:v

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\expandafter\def\csname test-1\endcsname{a,$\alpha\dotsb$,b}
\ExplSyntaxOn
\clist_new:N \l_test_clist
\NewDocumentCommand {\test} {}
  {
    \clist_set:Nx \l_test_clist
      {
        \clist_if_exist:cT {test-1}
          { \exp_not:v { test-1 } }
      }
    \clist_use:Nn \l_test_clist {*}
  }
\ExplSyntaxOff

\begin{document}
\test
\end{document}

答案2

o变体将执行单身的扩展步骤。您需要执行更多操作才能到达 clist。

如果要为 clist 使用符号名称,请以更合适的方式进行。您不应指望\def\zzz{a,b,c}它是一个“真正的” expl3clist。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\defineclist}{mm}
 {
  \clist_clear_new:c { l__zhiyuanlck_#1_clist }
  \clist_set:cn { l__zhiyuanlck_#1_clist } { #2 }
 }

\NewDocumentCommand {\test} {m}
 {
  \clist_if_exist:cTF { l__zhiyuanlck_#1_clist }
   {
    \clist_use:cn { l__zhiyuanlck_#1_clist } {*}
   }
   {OOPS}
 }

\ExplSyntaxOff

\defineclist{test-1}{a,$\alpha\dotsb$,b}

\begin{document}

\test{test-1}

\test{test-2}

\end{document}

在此处输入图片描述

相关内容