执行 expl3 中键值中给出的宏

执行 expl3 中键值中给出的宏

我定义了一个宏\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}

相关内容