介绍l3clist
interface3.pdf
状态
此外,逗号列表不能存储夸克
\q_mark
或\q_stop
。
但是,该部分的其他地方都没有提到这一点(与前一句中关于“ {
,}
,或#
(假设适用通常的 TEX 类别代码)”的警告相反,该警告在相关函数的描述中重复出现)。
我尝试将提到的夸克放入一个列表中并进行一些基本测试,一切似乎都运行良好:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_test_clist
\clist_set:Nn \l_test_clist { \q_mark, \q_stop }
\clist_map_inline:Nn \l_test_clist { \tl_to_str:n { #1 } }
\ExplSyntaxOff
\end{document}
- 把夸克放入 clist 中真的有问题吗?你能举个例子吗?
- 如果是这样,那么这是否只适用于
\q_mark
和\q_stop
,正如上面的引用所暗示的那样? - 如果是这样,假设这是因为它们在实现中使用,为什么在实现中没有选择一些特定于模块的夸克来防止这个问题?
答案1
我也会在该声明中\q_nil
添加:-)\q_recursion_tail
回答你问题中的三点:
我通过浏览源代码进行了一些测试
l3clist
,并设法获得了一些\q_nil
、\q_mark
、\q_stop
和\q_recursion_tail
中断clist
函数的示例。并非所有函数都会受到影响,因为显然它们的实现不同,并且受影响的方式也不同。该列表肯定不是详尽无遗的,因为我只查找了明显的情况,例如\clist_get:NN
,它与 中断\q_stop
:\cs_new_protected:Npn \clist_get:NN #1#2 { \if_meaning:w #1 \c_empty_clist \tl_set:Nn #2 { \q_no_value } \else: \exp_after:wN \@@_get:wN #1 , \q_stop #2 \fi: } \cs_new_protected:Npn \@@_get:wN #1 , #2 \q_stop #3 { \tl_set:Nn #3 {#1} }
\q_recursion_tail
也会破坏一些功能。\q_recursion_tail
用于指示已到达递归的结尾,因此看到函数后会认为列表已结束并尝试终止执行。\q_recursion_stop
如果单独发现它似乎不会造成危害(函数寻找的夸克是\q_recursion_tail
),但正如我所说,我只检查了明显的问题。[供 LaTeX3 团队成员填写的空间:-)]1我认为这是因为 quark 不应该由最终用户(duh)和仅使用高级函数的程序包编写者使用。如果您正在编写较低级别的函数,则应该使用 Quark,如果您这样做,您可能知道风险以及如何避免问题。但是我认为出于安全原因,可以更改代码以使用私有 quark 来避免此类问题。
1我想我不能再找这个借口了;-)
我使用夸克设法打破的东西(如果您发现任何其他东西,请随意添加到列表中):
- 通过使用
\q_mark
:- \clist_reverse:N(以及
\clist_reverse:n
扩展):\q_mark
在列表中使用会导致无限扩展\q_mark
;
- \clist_reverse:N(以及
- 通过使用
\q_stop
:\clist_get:NN
:导致! Missing control sequence inserted
错误。\clist_pop:NN
:导致! Missing control sequence inserted
错误。\clist_item:Nn
:导致列表过早终止,然后代码会\q_stop
在输入流中留下另一个列表以无限扩展。但是,只有当第二个参数(项目索引)小于列表中夸克的位置时,才会发生这种情况。
- 通过使用
\q_recursion_tail
:\clist_map_function:NN
:导致映射过早终止。没有错误,但之后的所有项都\q_recursion_tail
将被忽略。功能?
- 通过使用
\q_nil
:\clist_(g)set:NN
:导致给定项被截断。我在使用unravel
with\unravel[prompt-input=u\q_nil]
调试某些代码时发现了这一点,但什么也没发生,因为unravel
内部使用了一个 clist,而本\q_nil
应是输入一部分的 消失了,而 单独u
什么也不做。
这是测试文件:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_test_clist
\tl_new:N \l_test_tl
\cs_new:Npn \schtandard_function:n #1 { ( \tl_to_str:n {#1} ) }
% \q_mark breaks \clist_reverse:N
\clist_set:Nn \l_test_clist { a, \q_mark, b }
% \clist_reverse:N \l_test_clist
% \q_stop breaks \clist_get:NN, \clist_(g)pop:NN, \clist_item:Nn (if #2 is less than the position of \q_stop)
\clist_set:Nn \l_test_clist { a, \q_stop, b }
% \clist_get:NN \l_test_clist \l_test_tl
% \clist_pop:NN \l_test_clist \l_test_tl
% \clist_item:Nn \l_test_clist {1}
% \q_recursion_tail breaks \clist_map_function:NN (prematurely ends the mapping)
\clist_set:Nn \l_test_clist { a, \q_recursion_tail, b }
% \clist_map_function:NN \l_test_clist \schtandard_function:n
% \q_nil breaks \clist_set:Nn (trims the current item)
\clist_set:Nn \l_test_clist { u \q_nil v }
\clist_show:N \l_test_clist % prints:
% The comma list \l_tmpa_clist contains the items (without outer braces):
% > {u}.
\ExplSyntaxOff
\end{document}