在界面3.pdfsec 1.2,它表示带有星号的函数可以在x
、e
、中完全展开f
,而带有空心星号的函数可以在x
和中完全展开e
,并且无法在 f 型参数中完全展开.我的第一个问题是
f
-型论证将把“空心星”扩大到多深
我的主要问题是:还有一些没有星号的函数,例如,,,类型参数将\tl_set_eq:NN
如何处理它?我做了一些测试,但输出让我感到困惑。x
e
f
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\tl_new:N \l_tmpc_tl
\tl_new:N \l_tmpd_tl
\tl_set:Nn \l_tmpa_tl { abc }
\tl_set:Nn \l_tmpb_tl { ABC }
% I want to reset \l_tmpb_tl the same as \l_tmpa_tl, and set \l_tmpc_tl (\l_tmpd_tl)
\tl_set:Nf \l_tmpc_tl { \tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl \l_tmpb_tl }
\tl_set:Nx \l_tmpd_tl { \tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl \l_tmpb_tl }
\tl_show:N \l_tmpc_tl
\tl_show:N \l_tmpd_tl
\ExplSyntaxOff
\end{document}
使用pdflatex编译后输出:
> \l_tmpc_tl=\tex_let:D \l_tmpb_tl = \l_tmpa_tl \l_tmpb_tl .
<recently read> }
l.11 \tl_show:N \l_tmpc_tl
?
> \l_tmpd_tl=\tl_set_eq:NN ABCabcABC.
<recently read> }
l.12 \tl_show:N \l_tmpd_tl
?
我们可以看到f
-type 扩展\tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl
为 tex 原语:
\tex_let:D \l_tmpb_tl = \l_tmpa_tl \l_tmpb_tl
但是x
-type 没有对 执行任何操作\tl_set_eq:NN
,它只是将其留在输出流中。~~为什么会发生这种情况?~~那么 latex3 如何扩展无星函数?
更新:
继续阅读interface3.pdf,我在第4.3节中发现它:
不受“保护”的函数会在 x 扩展中完全展开。相反,“受保护”的函数不会在 x 扩展中展开。
我回到了 的定义\tl_set_eq:NN
,它是“受保护的”
> \tl_set_eq:NN=\protected\long macro:#1#2->\tex_let:D #1= #2.
<recently read> }
l.13 \cs_show:N \tl_set_eq:NN
因此它不能通过x
-type 参数进行扩展,而受保护的函数可以通过 -type 进行扩展f
。我说得对吗?
然后我的第二个问题是:所有没有星号的功能都受到保护吗?
答案1
是的,所有没有星号的函数都是(或至少应该是)\protected
,这样它们就不会扩展x
或e
键入扩展或写入文件时。
f
和c
类型扩展 是不同的,并且忽略\protected
。但是(故意)用 类型扩展来扩展它们(没有星号的函数)是错误的f
。
f
-类型扩展将扩展所有内容,直到它遇到第一个不可扩展的标记(如前所述,忽略\protected
,所以这意味着直到它遇到不可扩展的原语或类别 1、2、3、4、6、7、8、11 或 12 的字符标记)或空格(然后该空间将被吞噬,不可扩展的标记将留在那里)。
顺便说一句,许多空心星号函数不一定是f
-type 安全的,但可能是,这取决于提供的用户代码。例如,\int_step_function:nN
不是f
-expansion 安全的,但用法应该\int_step_function:nN {10} \use_none:n
是 (虽然不可否认这是一个无意义的例子)。原因 (它们被标记为空心星号) 通常是因为它们迭代某些输入,并且对于每个元素,在输入流中留下一些代码,并且该代码可能是不可扩展的或无论如何,因此不能保证它总是能正常工作。