我正在学习 LaTeX3 语法,并创建了一个最小示例来了解 clist 的工作原理。我意识到,当使用 插入元素时\clist_push:Nn
,\clist_if_in:NnTF
条件对它不起作用。例如,假设我们一开始就有唯一元素,并决定插入另一个唯一元素9
,那么检查9
列表中是否存在会得出 false。我很感激对此的解释以及任何改进代码标准的建议。
\documentclass{article}
\ExplSyntaxOn
\clist_new:N \l_aljumaily_myCList_clist
\tl_new:N \l_aljumaily_input_tl
\NewDocumentCommand{\useCList}{}{
\clist_use:Nnnn \l_aljumaily_myCList_clist{~and~}{,~}{,~and~}
}
\NewDocumentCommand{\setCList}{m}{
\clist_set:Nn \l_aljumaily_myCList_clist{#1}
}
\NewDocumentCommand{\printLength}{}{
\clist_count:N \l_aljumaily_myCList_clist
}
\NewDocumentCommand{\getItem}{m}{
\clist_item:Nn \l_aljumaily_myCList_clist{#1}
}
\NewDocumentCommand{\insertToLeft}{m}{
\tl_set:Nn \l_aljumaily_input_tl {#1}
\clist_push:Nn\l_aljumaily_myCList_clist {\l_aljumaily_input_tl}
}
\NewDocumentCommand{\isInList}{m}{
\str_set:Nn \l_aljumaily_input_str {#1}
\clist_if_in:NnTF \l_aljumaily_myCList_clist {#1}{Yes}{No}
}
\ExplSyntaxOff
\begin{document}
\setCList{7, 3, 9, 1, 2}
Printing list: \useCList\par
Length is: \printLength\par
Item at index 1: \getItem{1}\par
Printing list: \useCList\par
Inserting 4 to left\insertToLeft{4}\par
Item at index 1: \getItem{1}\par
Printing list: \useCList\par
Is item 4 in: \isInList{4}.\par
Is item 3 in: \isInList{3}.\par
Is item 9 in: \isInList{9}.\par
Is item 1 in: \isInList{1}.\par
Is item 2 in: \isInList{2}.\par
Is item 7 in: \isInList{7}.
\end{document}
答案1
你误解了 的第二个参数的性质\clist_push:Nn
。它是一个n
-type 标记列表,IE正是你传递给它的内容。所以
\tl_set:Nn \l_aljumaily_input_tl {#1}
\clist_push:Nn\l_aljumaily_myCList_clist {\l_aljumaily_input_tl}
添加\l_aljumaily_input_tl
到clist
。(您可以使用 进行检查\clist_show:N \l_aljumaily_myCList_clist
。)
你想要做的是通过价值的tl
:
\clist_push:NV\l_aljumaily_myCList_clist \l_aljumaily_input_tl