LaTeX3 - 使用 .tl_set:N 和 .code:n

LaTeX3 - 使用 .tl_set:N 和 .code:n

我正在尝试创建一个可用于多种用途的密钥。

我有一个assignment键,它接受存储在中的一些值 \ l__aljumaily_componentNumber_tl。除此之外,它还应该在中存储一些文本\l__aljumaily_componentType_tl。我还有另一个键,它也使用(类似于)lecture存储组件类型,但现在在中存储其他内容。\l__aljumaily_componentNumber_tlassignment\l__aljumaily_componentType_tl

为了存储组件类型,我使用了.code:n = { ... }。现在,存储组件编号可以正常工作没有的使用.code:n = { ... },否则,它只会注册组件编号的初始值。我怎样才能使用单个键来处理组件类型和编号?

\documentclass{article}

\ExplSyntaxOn
\tl_new:N \l__aljumaily_componentType_tl
\tl_new:N \l__aljumaily_componentNumber_tl

\keys_define:nn {aljumaily/module}{
    assignment  .tl_set:N  = \l__aljumaily_componentNumber_tl,
    assignment  .initial:n = {00},
    assignment  .code:n = {
      \tl_set:Nn \l__aljumaily_componentType_tl{assignment}
    },
    lecture  .tl_set:N  = \l__aljumaily_componentNumber_tl,
    lecture  .initial:n = {00},
    lecture  .code:n = {
      \tl_set:Nn \l__aljumaily_componentType_tl{lecture}
    }
}

\keys_set:nn {aljumaily/module}{assignment=01}

\NewDocumentCommand{\printData}{}{
  \tl_use:N \l__aljumaily_componentType_tl,
  \tl_use:N \l__aljumaily_componentNumber_tl
}
\ExplSyntaxOff

\begin{document}
\printData, where 00 should be 01
\end{document}

输出

答案1

分配

assignment  .code:n = { \tl_set:Nn \l__aljumaily_componentType_tl{assignment} },

覆盖

assignment  .tl_set:N  = \l__aljumaily_componentNumber_tl,

你想要的只是.code:n

\documentclass{article}

\ExplSyntaxOn
\tl_new:N \l__aljumaily_componentType_tl
\tl_new:N \l__aljumaily_componentNumber_tl

\keys_define:nn {aljumaily/module}
 {
  assignment  .code:n =
   {
    \tl_set:Nn \l__aljumaily_componentNumber_tl { #1 }
    \tl_set:Nn \l__aljumaily_componentType_tl{assignment}
   },
  assignment  .initial:n = {00},
  lecture  .code:n =
   {
    \tl_set:Nn \l__aljumaily_componentNumber_tl { #1 }
    \tl_set:Nn \l__aljumaily_componentType_tl{lecture}
   },
  lecture  .initial:n = {00},
}

\keys_set:nn {aljumaily/module}{assignment=01}

\NewDocumentCommand{\printData}{}{
  \tl_use:N \l__aljumaily_componentType_tl,
  \tl_use:N \l__aljumaily_componentNumber_tl
}
\ExplSyntaxOff

\begin{document}
\printData
\end{document}

在此处输入图片描述

答案2

仅用于比较,在expkv-def使用前缀向现有键添加另一个操作非常简单alsostore(几乎)等同于.tl_set:N(尽管创建的key不会是\long,因此没有明确的\par标记可以成为其值的一部分,您可以使用前缀long,但对于数字输入来说,这没有多大意义),并且code等同于.code:n(除了没有前缀\long之外long)。

\documentclass{article}

\usepackage{expkv-def}
\ekvdefinekeys{aljumaily/module}
  {
     store     assignment = \componentNumber
    ,also code assignment = \def\componentType{assignment}
    ,store     lecture = \componentNumber
    ,also code lecture = \def\componentType{lecture}
    ,initial   lecture = 00
  }

\ekvset{aljumaily/module}{assignment=01}

\NewExpandableDocumentCommand\printData{}
  {\componentType, \componentNumber}

\begin{document}
\printData
\end{document}

相关内容