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

发布于 2023-05-17 14:42:58

先放代码

\documentclass{article}
\usepackage{ctex}
\ExplSyntaxOn
\keys_define:nn{myTest}
{
  序号.int_gset:N = \l__myTest_序号_int,
  序号.initial:n = 0,

  标签.tl_set:N = \l__myTest_标签_tl,
  标签.initial:n = 模块,

  unknown .code:n = \tl_set:Nn \l__myTest_标签_tl \l_keys_key_str,
} 
\NewDocumentCommand{\myTest}{O{} +m}{
  \int_gincr:N \l__myTest_序号_int
  \keys_set:nn{myTest}{#1}
  \begin{center}
    标签为 \l__myTest_标签_tl, 序号为 \int_use:N \l__myTest_序号_int #2
  \end{center}
}
\ExplSyntaxOff
\begin{document}

\myTest[序号=3]{测试1}
\myTest{测试2}
\myTest[序号=9,标签=鸡腿]{测试3}
\myTest[序号=11,鸡腿]{测试4}
\myTest[凤爪]{测试5}
\myTest[馒头,序号=23]{测试6}
\end{document}

就是测试6那里, 我发现我这样写, 我希望他能识别, 馒头是我想要的标签, 但是必须把 unknown 对应的参数写在最后一个位置吗?

查看更多

关注者
0
被浏览
857
雾月
雾月 2023-05-17
这家伙很懒,什么也没写!

不必。

代码

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 } 只是拷贝了“指针”而不是指针指向的值。

1 个回答

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览