不必。
代码
unknown .code:n = \tl_set:Nn \l__myTest_标签_tl \l_keys_key_str的作用是把 \l__myTest_标签_tl 设置为 \l_keys_key_str 而不是它的值。
在执行完 \keys_set:nn { myTest } { 馒头,序号=23 } 后,\l_keys_key_str 的值是最后那个键名,也就是 序号。所以,\l__myTest_标签_tl 展开为 \l_keys_key_str,然后 \l_keys_key_str 展开为 序号,所以最终显示为了 序号。
应该这么写
unknown .code:n = \tl_set:No \l__myTest_标签_tl { \l_keys_key_str }
% 或 \tl_set:NV .. 或 \tl_set:Nx .. 或 \tl_set_eq:NN ..使用 \tl_set:No,LaTeX 发现 馒头 这个键未定义(此时 \l_keys_key_str 的值已经是 馒头),就先把 \l_keys_key_str 展开一次,其结果是 馒头,然后把这个值保存到 \l__myTest_标签_tl,就得到了想要的结果。
可类比于“浅拷贝”与“深拷贝”。\tl_set:Nn \l__myTest_标签_tl { \l_keys_key_str } 只是拷贝了“指针”而不是指针指向的值。









问 l3 中 key 使用中 unknown 参数只能放最后吗?