我定义了一个宏\getdocvar
,它根据键从属性列表中检索值。它有一个可选参数,即键值列表。目前只transform
定义了键。我想在这个键中存储一个宏,以应用于检索到的值\getdocvar
。
\keys_define:nn { docvar/get }
{
transform .tl_set:N = \l_docvar_tranformation_tl,
}
宏的名称存储为标记列表。
\cs_new_protected:Npn \docvar_get_properties:n #1
{
\group_begin:
\keys_set:nn { docvar/get } { #1 }
\group_end:
}
现在,如果\getdocvar
没有可选参数,prop
则会检索其值,但我不知道如何#2
根据名称应用宏。
\DeclareDocumentCommand \getdocvar {o m}{
\IfNoValueTF { #1 }
{
\prop_get:NVN \g_docvar_values_prop #2 \g_tmpa_tl
\tl_use:N \g_tmpa_tl
}
{
\docvar_get_properties:n {#1}
%%% MISSIn CODE to cronstruct a macro from transform key
}
对于如何做到这一点,有任何建议吗?
使用此宏的完整顺序是
\definedocvar{title}
\setdocvar{title}{This is my title}
\getdocvar{title}
% This should print:
This is my title
\getdocvar[transform=MakeUppercase]{title}
% This should print:
\MakeUppercase{This is my title}
答案1
如果我正确理解了你的目的,那么这可能会做到:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g_docvar_values_prop
\tl_new:N \l__docvar_temp_tl
\NewDocumentCommand{\setdocvar}{mm}
{
\prop_gput:Nnn \g_docvar_values_prop { #1 } { #2 }
}
\NewDocumentCommand{\getdocvar}{O{}m}
{
\group_begin:
\keys_set:nn { docvar/get } { #1 }
\prop_get:NnN \g_docvar_values_prop { #2 } \l__docvar_temp_tl
\__docvar_transform:VV \l_docvar_transform_tl \l__docvar_temp_tl
\group_end:
}
\cs_new_protected:Nn \__docvar_transform:nn
{
#1{#2}
}
\cs_generate_variant:Nn \__docvar_transform:nn { VV }
\keys_define:nn { docvar/get }
{
transform .tl_set:N = \l_docvar_transform_tl,
transform .initial:n = \use:n,
}
\ExplSyntaxOff
\setdocvar{title}{This is my title}
\begin{document}
\getdocvar{title}
\getdocvar[transform=\MakeUppercase]{title}
\end{document}
值应该transform
是一个单参数宏。
但下面的方法更简单:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g_docvar_values_prop
\tl_new:N \l__docvar_temp_tl
\NewDocumentCommand{\setdocvar}{mm}
{
\prop_gput:Nnn \g_docvar_values_prop { #1 } { #2 }
}
\NewDocumentCommand{\getdocvar}{O{\use:n}m}
{
\prop_get:NnN \g_docvar_values_prop { #2 } \l__docvar_temp_tl
\exp_args:NV #1 \l__docvar_temp_tl
}
\ExplSyntaxOff
\setdocvar{title}{This is my title}
\begin{document}
\getdocvar{title}
\getdocvar[\MakeUppercase]{title}
\end{document}