我正在尝试学习 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}