对 l3keys 文档的误解

对 l3keys 文档的误解

基于 interface3 文档和一篇很好的文章TUGboat, Volume 31 (2010), No. 1 called Programming key–value in expl3 by Joseph Wright(可用这里),我一直在尝试组合一个 MWE,它将允许我创建一个自定义文档命令,该命令将根据通过键传递的值和段落填充结构化表。即文档调用看起来像这样:

\CustomCommand[key1={abc},key2={def}] % would include a mandatory argument only if absolutely necessary

这是对在此留下的评论的回应数据库导出时出现换行符,在表中显示为多余的行这个问题实际上指出,与无休止的有序参数相比,密钥将是传递信息的更实用的方式。

我以为我已经理解了文档中的示例,并尝试整理一个简单的示例,但输出对我来说毫无意义:

\documentclass[10pt]{article}

\usepackage{xparse}

\ExplSyntaxOn

    \keys_define:nn { mymodule }
    {
        key-start-date .tl_set:N = \l_mymodule_tl
    }

    \DeclareDocumentCommand \MyModuleSetup { o m }
    {
        Hello~World~The~date~today~is~{\l_mymodule_tl}~and~I~say~#1
    }

\ExplSyntaxOff

\begin{document}

    \MyModuleSetup[key-start-date={Date}]{Goodbye~World}

\end{document}

得出:

你好,世界 今天的日期是 我说 key-start-date=Date

我期望

你好世界今天的日期是日期,我说再见世界

首先,我不明白为什么键名被解析为文本......

答案1

#1是您定义中的可选参数,#2将是强制参数:\DeclareDocumentCommand \MyModuleSetup { o m }。因此,当您使用

\MyModuleSetup[key-start-date={Date}]{Goodbye~World}

#1key-start-date={Date}并且#2Goodbye~World。这正是您所看到的。

另外,您正在使用 定义密钥,\keys_define:nn但并未对其进行设置\keys_set:nn。一个可行的建议:

\documentclass[10pt]{article}

\usepackage{xparse}

\ExplSyntaxOn

% define the variable before using it:
\tl_new:N \l_mymodule_start_date_tl

% define key:    
\keys_define:nn { mymodule }
  {
    key-start-date .tl_set:N = \l_mymodule_start_date_tl
  }

% #1: set keys (optional)
% #2: do something (mandatory)
\DeclareDocumentCommand \MyModuleSetup { o m }
  {
    % start a group to keep key setting local:
    \group_begin:
      % set keys if optional argument #1 is given:
      \IfNoValueF {#1} { \keys_set:nn {mymodule} {#1} }
      % do something with variable and mandatory argument #2:
      Hello~World~The~date~today~is~{\l_mymodule_start_date_tl}~and~I~say~#2
    \group_end:
  }

\ExplSyntaxOff

\begin{document}

\MyModuleSetup[key-start-date={Date}]{Goodbye World}

\end{document}

答案2

keys_set:nn在 的使用中缺失\DeclareDocumentCommand,因此\l_mymodule_tl实际上是空的。

\documentclass[10pt]{article}

\usepackage{xparse}

\ExplSyntaxOn
   \tl_new:N \l_mymodule_tl
   \keys_define:nn { mymodule }
   {
     key-start-date .tl_set:N= \l_mymodule_tl
   }

    \DeclareDocumentCommand \MyModuleSetup {O{}m }
    { 
      \keys_set:nn{mymodule}{#1}
        Hello~World~The~date~today~is~{\tl_use:N \l_mymodule_tl}~and~I~say~#1
    }

\ExplSyntaxOff

\begin{document}

    \MyModuleSetup[key-start-date={Date}]{Goodbye~World}

\end{document}

相关内容