20 LaTeX中对l3prg模块里两个函数的疑惑

发布于 2023-06-12 23:05:50

在LaTeX3中的l3prg模块遇到这样两个函数(具体在interface3.pdf的9.8节72页),原文截取图如下:
1.png
2.png
大概意思是用来跳出递归或循环(类似python中的break),但我没看明白它们的具体意思(水平有限,解读不出它们的具体功用),所以想问问大佬们这两个函数的具体作用是什么,如果能举几个例子说明那更好,在此先行谢过!

查看更多

关注者
0
被浏览
555
雾月
雾月 2023-06-13
这家伙很懒,什么也没写!

LaTeX3 中一些 \.._map_... 函数是通过尾递归来实现的,\prg_break_point:Nn 用于标记循环要跳出时的位置,\prg_map_break:Nn 用于跳出循环。
先看一个例子,这是 \tl_map_function:nN 的简化版实现:

% \cs_new_eq:NN \prg_break_point:Nn \use_ii:nn
\cs_new:Npn \mytl_map_function:nN #1#2 
  {
    \__mytl_map_function:Nn #2 #1 \q_recursion_tail \q_recursion_stop
    \prg_break_point:Nn \mytl_map_break: { }
  }
\cs_new:Npn \mytl_map_break: { \prg_map_break:Nn \mytl_map_break: { } }
\cs_new:Npn \__mytl_map_function:Nn #1#2 
  { 
    \quark_if_recursion_tail_stop:n {#2} 
    #1 {#2}
    \__mytl_map_function:Nn #1
  }

\__mytl_map_function:Nn 有两个参数,第一个是 function,第二个是 tl 的某一项。
比如 \mytl_map_function:nN { abcd } \tl_show:n\__mytl_map_function:Nn 第一个参数都是 \tl_show:n,第二个参数依次是 abcd\q_recursion_tail
当第二个参数不是 \q_recursion_tail 时,先执行 \tl_show:n { .. },然后继续执行 \__mytl_map_function:Nn;当发现第二个参数是 \q_recursion_tail 时,它吞掉 \q_recursion_stop 及其之前的内容,尾递归结束。
但如果改为:

\cs_new:Npn \__my_if_not_c_show:n #1 
  {
    \tl_if_eq:nnTF {#1} { c }
      { \mytl_map_break: }
      { \tl_show:n {#1} }
  }
\mytl_map_function:nN { abcd } \__my_if_not_c_show:n

那么当第二个参数是 c 时,会直接跳出循环,跳出的位置正是 \prg_break_point:Nn 所在的位置。
\prg_map_break:Nn\prg_break_point:Nn 的第一个参数是用于标记不同类型的 map 的,\tl_map_...\tl_map_break:\seq_map_... 则是 \seq_map_break:

相当于某些编程语言里的 goto,只是 \prg_map_break:Nn 只能向后跳转。

这个例子同时也演示了 \quark_if_recursion_tail_stop:n 的用法。

3 个回答
芒果不盲
芒果不盲 2023-06-13
学好TiKZ和tcolorbox!

帮你召唤一下大佬哈哈哈@u10307

⁡⁢  待定
⁡⁢  待定 2023-06-14
这家伙很懒,什么也没写!

~

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览