获取 tl 变量的内容

获取 tl 变量的内容

要获取变量中的内容tl(在函数中\foo_my_func:n),我有几种方法:

% 1
\foo_my_func:n { \l__foo_test_tl }
% 2
\cs_generate_variant:Nn \foo_my_func:n { N }
\foo_my_func:N \l__foo_test_tl
% 2
\cs_generate_variant:Nn \foo_my_func:n { V }
\foo_my_func:V \l__foo_test_tl

在这个简单的情况下,它们似乎都给出了相同的结果。但是有什么区别吗?

答案1

首先要注意的是nN都是“基本”参数类型。对于tl,我们使用这两个来区分

\tl_foo:n { tokens }
\tl_foo:N \l_tokens_tl

V变体与有关n,因此

\tl_foo:V \l_tokens_tl

相当于

\tl_foo:n { <content of \l_tokens_tl> }

根据特定函数的内部结构,它可能有可能您可以传递一个tl变量 ( N-type) 并获得与 token 本身相同的行为。但是,这并不能保证,不应依赖。这将取决于函数采取的操作。例如,如果我们查看\tl_to_str:n,结果

\tl_set:Nn \l_tmpa_tl { Hello }
\cs_generate_variant:Nn \tl_to_str:n { V }
\tl_to_str:n { \l_tmpa_tl }
\tl_to_str:V \l_tmpa_tl

有很大的不同。

一般来说,你应该不是在 -type 参数“内部”传递tl变量n。如果可用,请使用专用的N-type 函数,或者使用 -type 变量传递值V


要清楚的是,N类型参数意味着“恰好一个标记”。最明显的地方是我们要设置(或调整)的内容tl。例如,\tl_set:Nn必须将标记列表变量的名称作为第一个参数:它不能是类型V。你不能假设N-type 参数“变成”使用它的函数内部的某个标记列表。

相反,V-type 参数是只是获得 -类型底层值的方法n。因此任何事物可以在这里使用给出“值”的函数:

\cs_generate_variant:Nn \tl_set:Nn { NV }
\tl_set:NV \l_tmpa_tl \l_tmpa_int

请注意,我从这里得到的值int完全不相关:一旦V-type 起作用,我就会留下一个可以保存在 中的标记列表tl

相关内容