先放代码
\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 对应的参数写在最后一个位置吗?
不必。
代码
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 }
只是拷贝了“指针”而不是指针指向的值。
非常感谢, 理解了, 谢谢