Latex3 和 \foreach:对 clist 变量列表执行常见操作

Latex3 和 \foreach:对 clist 变量列表执行常见操作

我正在尝试学习 LaTeX3。在编写我的一个项目时,我遇到了一种情况,在这种情况下,使用短逗号分隔列表很有用,测试它们是否为空、是否只有一个项目等......

我在 LaTeX3 中找到了所有这些问题的解决方案。但我找不到允许对逗号分隔列表执行常见操作的解决方案,例如清除它们的内容。所以我尝试了\foreach宏,但似乎不起作用。

例子:

\documentclass{article}
\usepackage{tikz}

\ExplSyntaxOn

\clist_new:N \l_test_a
\clist_new:N \l_test_b

\clist_put_left:Nn \l_test_a {1,2}
\clist_put_left:Nn \l_test_b {3,4}

\newcommand{\writeLists}{%
 \l_test_a;  \l_test_b
}

\newcommand{\clearLists}{%
\foreach \n in {\l_test_a,\l_test_b}{%
\clist_clear:N \n}
}

\newcommand{\clearListsTheHardWay}{%
\clist_clear:N \l_test_a
\clist_clear:N \l_test_b
}

\ExplSyntaxOff

\begin{document}
\writeLists\par

\clearLists
\writeLists

\clearListsTheHardWay
\writeLists

\end{document}

我期望得到的只是一行文本,即第二次调用时\writeLists所有文本都是空的。即使使用全局变量也\clist_gclear:N没有给出我期望的结果,只是\clearListsTheHardWay有效,而我一般都想避免这种情况。

我怀疑问题在于\foreach无法识别具有 LaTeX3 名称的变量。我该如何修复此示例以获得预期结果?

我对使用 LaTeX3 函数的解决方案非常感兴趣,尽管使用 lua 的解决方案也可以,因为无论如何我都在运行 LuaTeX ...

答案1

\foreach。原因有几个,首先是它按组执行循环中的每个项目。

以下代码可完成此任务:定义一个包含要管理的列表的序列。然后\WriteLists“漂亮地打印”列表。

\documentclass{article}

\ExplSyntaxOn

% a list of lists
\seq_new:N \l_krulis_test_lists_seq

% the lists
\clist_new:N \l_krulis_test_a_clist
\clist_new:N \l_krulis_test_b_clist

% add them to the list of lists
\seq_put_right:Nn \l_krulis_test_lists_seq { \l_krulis_test_a_clist }
\seq_put_right:Nn \l_krulis_test_lists_seq { \l_krulis_test_b_clist }

% populate them
\clist_put_right:Nn \l_krulis_test_a_clist {1,2}
\clist_put_right:Nn \l_krulis_test_b_clist {3,4}

\cs_new:Nn \__krulis_test_write:nn
 {
  \int_compare:nF { #1 = 1 } { ;~ }
  \clist_use:Nn #2 { ,~ }
 }

\NewDocumentCommand{\writeLists}{}
 {
  \seq_map_indexed_function:NN \l_krulis_test_lists_seq \__krulis_test_write:nn
 }

\NewDocumentCommand{\clearLists}{}
 {
  \seq_map_inline:Nn \l_krulis_test_lists_seq
   {
    \clist_clear:N ##1
   }
 }

\ExplSyntaxOff

\begin{document}

\writeLists

\clearLists

\writeLists

\end{document}

在此处输入图片描述

相关内容