我有一个命令 ( ) 用于输入人员。其可选参数允许用户使用 ( ) 键值系统\people[⟨options⟩]{⟨name⟩}
指定可能的人员(可能为多个)属性:(这些值在内部放入序列中)。l3keys
attribute={⟨value A⟩},attribute={⟨value B⟩},...
现在,有些人可能⟨value⟩
与已经输入的人共享相同的属性,在这种情况下,这些⟨value⟩
属性必须区别对待。为此,还有另一个键值:duplicateattribute={⟨value⟩}
。
我可以使用两个并行序列(“属性”和“重复属性”)进行管理,如以下 MWE(涉及datatool
):
\documentclass{article}
\usepackage{xparse}
\usepackage{datatool}
\ExplSyntaxOn
\DTLnewdb{_mymodule_people}
\seq_new:N \l_mymodule_people_attributes_seq
\seq_new:N \l_mymodule_people_duplicateattributes_seq
\keys_define:nn { mymodule/people } {%
attribute .code:n = \seq_put_right:Nn \l_mymodule_people_attributes_seq {#1},
duplicateattribute .code:n =\seq_put_right:Nn \l_mymodule_people_duplicateattributes_seq {#1}
}
\cs_new_protected:Nn \_mymodule_enter_people:n
{
\DTLnewrow{_mymodule_people}
\DTLnewdbentry{_mymodule_people}{name}{#1}
\DTLnewdbentry{_mymodule_people}{attribute}{\tl_to_str:n{#1}}
\DTLnewdbentry{_mymodule_people}{duplicateattribute}{\tl_to_str:n{#1}}
}
\NewDocumentCommand \people { O{} m }
{
\seq_clear:N \l_mymodule_people_attributes_seq
\seq_clear:N \l_mymodule_attributes_seq
\seq_clear:N \l_mymodule_people_duplicateattributes_seq
\keys_set:nn { mymodule/people } { #1 }
\_mymodule_enter_people:n {#2}
\seq_new:c { g_mymodule_attributes_ \tl_to_str:n{#2} _seq }
\seq_gset_eq:cN { g_mymodule_attributes_ \tl_to_str:n{#2} _seq } \l_mymodule_people_attributes_seq
\seq_new:c { g_mymodule_duplicateattributes_ \tl_to_str:n{#2} _seq }
\seq_gset_eq:cN { g_mymodule_duplicateattributes_ \tl_to_str:n{#2} _seq }
\l_mymodule_people_duplicateattributes_seq
% \seq_show:c { g_mymodule_attributes_ \tl_to_str:n{#2} _seq }
% \seq_show:c { g_mymodule_duplicateattributes_ \tl_to_str:n{#2} _seq }
}
\ExplSyntaxOff
\begin{document}
\people {People 0}
\people[attribute = {value A}]{People 1}
\people[attribute = {value B},
attribute = {value C}]{People 2}
\people[attribute = {value D},
duplicateattribute = {value B},
attribute = {value E}]{People 3}
\end{document}
但这有个缺点,就是重复属性⟨value⟩
必须重复(见value B
示例:在现实生活中,值可能会更长):从维护的角度来看,这很无聊并且有问题。
因此,我希望能够选择性地标记 (tag)⟨value⟩
以便在其他地方重复使用它们,只需复制它们的标签而不是整体即可,例如以以下方式:
[...]
\people[attribute = [tagB]{value B},
attribute = {value C}]{People 2}
\people[attribute = {value D},
duplicateattribute = {tagB},
attribute = {value E}]{People 3}
[...]
在哪里:
value B
被标记为tagB
([tagB]{value B})
并在其他地方重复使用 (duplicateattribute = {tagB})
- 其他值未标记,因为未在其他地方重复使用。
是否可以?