使用 clist_push:Nn 和 clist_if_in:NnTF

使用 clist_push:Nn 和 clist_if_in:NnTF

我正在学习 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_tlclist。(您可以使用 进行检查\clist_show:N \l_aljumaily_myCList_clist。)

你想要做的是通过价值tl

\clist_push:NV\l_aljumaily_myCList_clist \l_aljumaily_input_tl

相关内容