LaTeX3 clist 可以包含夸克吗?

LaTeX3 clist 可以包含夸克吗?

介绍l3clistinterface3.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
  • 通过使用\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:导致给定项被截断。我在使用unravelwith\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}

相关内容