基于 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}
#1
是key-start-date={Date}
并且#2
是Goodbye~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}