在 \clist_set 中使用 \csname 時需要額外的大括號:否

在 \clist_set 中使用 \csname 時需要額外的大括號:否

clist 沒有用\cs_if_exist_use:cor適當設置\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

首先,應該與 a 一起使用,而不是 a (它可以工作,因為它們的實作恰好相似,但你不能依賴它)。另外,除非一個函數被記錄為完全擴展\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 使用符號名稱,請以更正確的方式進行。你不應該指望\def\zzz{a,b,c}成為一個「真正的」expl3清單。

\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}

在此輸入影像描述

相關內容