因此,我尝试将与当前环境关联的“日期”值传递给宏定义的属性列表。它似乎不起作用,我不确定为什么。这是一个 MWE:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\tl_new:N \l_thedate_tl
\NewDocumentEnvironment{Day}{m}{
\tl_set:Nn \l_thedate_tl {#1}
\begin{center}
\textbf{#1}
\end{center}
Begin:\\
}{
\\
End.
}
\NewDocumentCommand{\writeentry}{mm}{
\prop_new:c {g_#1_prop}
\prop_gput:cnn {g_#1_prop} {key} {#1}
\prop_gput:cnn {g_#1_prop} {value} {#2}
\prop_gput:cnn {g_#1_prop} {date} {\tl_to_str:N \l_thedate_tl}
#1 \hspace{2em} #2
}
\NewDocumentCommand{\getdate}{m}{
\prop_get:cn {g_#1_prop} {date}
}
\NewDocumentCommand{\getvalue}{m}{
\prop_get:cn {g_#1_prop}{value}
}
\ExplSyntaxOff
\begin{document}
\begin{Day}{14 April}
\writeentry{foo}{Something}
\writeentry{bar}{Something else}
\end{Day}
Get Value: \getvalue{foo} \hspace{2em}
Get Date: \getdate{foo}
\end{document}
如您所见,该\getdate
函数没有打印任何内容。但据我了解,它应该打印\l_thedate_tl
设置属性列表时的值。
我究竟做错了什么?
答案1
你不想\tl_to_str:N
,而且最不想放入\tl_to_str:N \l_thedate_tl
的是属性列表,但是令牌列表变量的值。\prop_gput:cnV
你的朋友也是如此:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\tl_new:N \l_seamus_thedate_tl
\NewDocumentEnvironment{Day}{m}{
\tl_set:Nn \l_seamus_thedate_tl {#1}
\begin{center}
\textbf{#1}
\end{center}
Begin:\\
}{
\\
End.
}
\NewDocumentCommand{\writeentry}{mm}{
\prop_new:c {g_seamus_#1_prop}
\prop_gput:cnn {g_seamus_#1_prop} {key} {#1}
\prop_gput:cnn {g_seamus_#1_prop} {value} {#2}
\prop_gput:cnV {g_seamus_#1_prop} {date} \l_seamus_thedate_tl
#1 \hspace{2em} #2
}
\NewDocumentCommand{\getdate}{m}{
\prop_get:cn {g_seamus_#1_prop} {date}
}
\NewDocumentCommand{\getvalue}{m}{
\prop_get:cn {g_seamus_#1_prop}{value}
}
\ExplSyntaxOff
\begin{document}
\begin{Day}{14 April}
\writeentry{foo}{Something}
\writeentry{bar}{Something else}
\end{Day}
Get Value: \getvalue{foo} \hspace{2em}
Get Date: \getdate{foo}
\end{document}
如果我还问\prop_show:N \g_seamus_foo_prop
我
The property list \g_seamus_foo_prop contains the pairs (without outer braces):
> {key} => {foo}
> {value} => {Something}
> {date} => {14 April}.
这正是您想要的。
请注意前缀的使用,这是强烈推荐的。
变体速成课程
您正在使用的主要功能是\prop_gput:Nnn
,但您在任何地方都没有输入它,而是输入了它的几个变体。
内核有一个定义\prop_gput:Nnn
,然后它说
\cs_generate_variant:Nn \prop_gput:Nnn { cnn }
\cs_generate_variant:Nn \prop_gput:Nnn { NnV }
\cs_generate_variant:Nn \prop_gput:Nnn { cnV }
(以及其他一些变体)。这些命令实际上定义了三个新功能
\prop_gput:cnn
\prop_gput:NnV
\prop_gput:cnV
基于主函数,前面有一些\expandafter
技巧,以便调用
\prop_gput:cnn { g_seamus_foo_prop } { X } { Y }
相当于调用
\prop_gput:Nnn \g_seamus_foo_prop { X } { Y }
也就是说,由参数形成控制序列名称。当然,这只有当控制序列名称具有可变部分时才有用,就像您的代码中那样。
呼唤
\prop_gput:NnV \g_seamus_foo_prop { X } \l_seamus_thedate_tl
相当于调用
\prop_gput:Nnn \g_seamus_foo_prop { X } { <value of \l_seamus_thedate_tl> }
因此V
参数被替换为变量的值在括号中。第三个函数只是上面两个变体的组合。
这提供了一种统一的做事方式,无需增加函数的“基本名称”:它们都是\prop_gput:<signature>
。