当键是宏值时,Expl3 属性似乎不起作用

当键是宏值时,Expl3 属性似乎不起作用

我期望此示例代码给出两行相同的代码,但\usevalue{\xyz}结果却并非如此XYZ。我可以强制扩展键以使其\usevalue{\xyz}引用\usevalue{0}相同的值吗?

\documentclass{article}

\usepackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_my_data_prop
\cs_new_protected:Npn \addvalue #1#2 { \prop_gput:Nnn \g_my_data_prop {#1} {#2} }
\cs_new:Npn \usevalue #1 { \prop_get:Nn \g_my_data_prop {#1} }
\ExplSyntaxOff

\begin{document}

\edef\xyz{0}

\addvalue{0}{XYZ}

Value: \usevalue{0}

Value: \usevalue{\xyz}

\end{document}

答案1

您需要先扩展宏:

\expandafter\usevalue\expandafter{\xyz}

您可以定义\usevalue一种默认扩展其参数一次(相当于上面的行)的方式:

\cs_new:Npn \usevalue #1 { \prop_get:No \g_my_data_prop {#1} }
\cs_generate_variant:Nn \prop_get:Nn { No }

如果您想要更多的灵活性并根据具体情况做出决定,您可以这样做:

\documentclass{article}

\usepackage{expl3,xparse}
\ExplSyntaxOn
\prop_new:N \g_kazi_data_prop

\cs_new_protected:Npn \kazi_addvalue:nn #1#2 {
  \prop_gput:Nnn \g_kazi_data_prop {#1} {#2}
}

\cs_new:Npn \kazi_usevalue:n #1 {
  \prop_get:Nn \g_kazi_data_prop {#1}
}
\cs_generate_variant:Nn \kazi_usevalue:n { o }

\NewDocumentCommand \addvalue { mm }
  { \kazi_addvalue:nn {#1} {#2} }

\NewDocumentCommand \usevalue { sm }
  {
    \IfBooleanTF {#1}
      { \kazi_usevalue:o {#2} }
      { \kazi_usevalue:n {#2} }
  }
\ExplSyntaxOff

\begin{document}

\def\xyz{0}

\addvalue{0}{XYZ}

Value: \usevalue{0}

Value: \usevalue*{\xyz}

\end{document}

但是,这种方式\usevalue不再可扩展,这可能不是你想要的。如果你需要它可扩展,请使用\DeclareExpandableDocumentCommand。(此外,参数也不再可用\long+m如果你需要它们很长,请在参数规范中使用。)

相关内容