我期望此示例代码给出两行相同的代码,但\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
如果你需要它们很长,请在参数规范中使用。)