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:c
cs
clist
n步骤,你不能保证它会扩大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}
它是一个“真正的” expl3
clist。
\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}