是否可以标记(l3keys)键值的值以便在其他地方轻松地重复使用它?

是否可以标记(l3keys)键值的值以便在其他地方轻松地重复使用它?

我有一个命令 ( ) 用于输入人员。其可选参数允许用户使用 ( ) 键值系统\people[⟨options⟩]{⟨name⟩}指定可能的人员(可能为多个)属性:(这些值在内部放入序列中)。l3keysattribute={⟨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})
  • 其他值未标记,因为未在其他地方重复使用。

是否可以?

相关内容