属性列表上的 Map 调用:控制输出中值的位置

属性列表上的 Map 调用:控制输出中值的位置

刚开始深入研究 expl3。我有一个属性列表和文档命令包装器代码。我填充列表,并使用以下内容遍历它\prop_map_function:NN

%!lualatex %
\documentclass{article}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_mwe_list_prop
\cs_new:Npn \mwe_push#1#2{\prop_put:Nnn \g_mwe_list_prop{#1}{#2}}
\cs_new:Npn \mwe_get#1   {\prop_item:Nn \g_mwe_list_prop{#1}    }
\NewDocumentCommand\mweadd{m +m}{\mwe_push{#1}{#2}} % +m = allow second mandatory argument to contain paragraph material
\NewDocumentCommand\mweitem{m}{\item[#1]\mwe_get{#1}}
\NewDocumentCommand\mweitemDumb{m}{\item[#1]}
\ExplSyntaxOff

\begin{document}
% Filling the list
\mweadd{key1}{value1}
\mweadd{key2}{value2

with

paragraph}
\mweadd{key3}{value3}

\begin{description}
\ExplSyntaxOn
\prop_map_function:NN \g_mwe_list_prop \mweitem % Call \mweitem for all property list elements
\ExplSyntaxOff
\end{description}
\end{document}
  • 预期输出:描述样式的key-value对列表
  • 实际输出:按 索引的项目列表key,但显示value 两次
  • 糟糕的非解决方案:如果我使用而不是value则会显示一次。\mweitemDumb\mweitem

到目前为止,我以为我明白了这里发生了什么。但现在我被难住了。无论 的定义中发生了什么\mweitemvalue总是会在每个映射迭代步骤结束时被转储到输出流中。

我在这里错过了哪一步?我想像使用\mweitem普通\prop_map_function:NN宏参数一样使用传递给的参数,IE我可以自己决定把它放到扩展代码的哪里。

答案1

调用的函数\prop_map_function:NN应为双参数函数。第一个参数将传递键,第二个参数将传递值。无需调用\mwe_get:n

我更改了函数名称以符合建议。

\documentclass{article}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_mwe_list_prop
\cs_new_protected:Npn \mwe_push:nn #1#2
 {
  \prop_put:Nnn \g_mwe_list_prop {#1} {#2}
 }
\cs_new:Npn \mwe_get:n #1
 {
  \prop_item:Nn \g_mwe_list_prop{#1}
 }

\NewDocumentCommand\mweadd{m +m}
 {% +m = allow second mandatory argument to contain paragraph material
  \mwe_push:nn {#1}{#2}
 } 
\NewDocumentCommand\mweitem{m +m}
 {
  \item[#1] #2
 }
\NewDocumentCommand\mweitemDumb{m}{\item[#1]}

\ExplSyntaxOff

\begin{document}
% Filling the list
\mweadd{key1}{value1}
\mweadd{key2}{value2

with

paragraph}
\mweadd{key3}{value3}

\begin{description}
\ExplSyntaxOn
\prop_map_function:NN \g_mwe_list_prop \mweitem % Call \mweitem for all property list elements
\ExplSyntaxOff
\end{description}
\end{document}

在此处输入图片描述

相关内容