\ clist_set:Noで\ csnameを使用する場合の余分な中括弧

Aug 23 2020

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}

回答

6 PhelypeOleinik Aug 23 2020 at 03:10

まず、ではなく、で使用する必要があります(実装は似ているため機能しますが、信頼することはできません)。機能が完全に展開するに文書化されていない限り、またn個のステップ、あなたはそれがに拡大するという保証がないn個のステップを、そしてそれがない場合、それは、例えば(最終的に変更される可能性や、あなたが頼ることができるように、2つの段階で拡大して文書化されていますその上で)。\cs_if_exist_use:ccsclist\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}
4 egreg Aug 23 2020 at 03:35

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}