要获取变量中的内容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
首先要注意的是n
和N
都是“基本”参数类型。对于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
。