LaTeX3 属性列表和扩展

LaTeX3 属性列表和扩展

因此,我尝试将与当前环境关联的“日期”值传递给宏定义的属性列表。它似乎不起作用,我不确定为什么。这是一个 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>

相关内容