Chamada de mapa em uma lista de propriedades: controle sobre a posição do valor na saída

Chamada de mapa em uma lista de propriedades: controle sobre a posição do valor na saída

Acabei de começar a mergulhar no expl3. Eu tenho uma lista de propriedades e um código wrapper de comando de documento. Eu preencho a lista e a percorro com \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}
  • Saída esperada: lista de pares no estilo keyde valuedescrição
  • Saída real: lista de itens indexados por key, mas exibindovalue duas vezes.
  • Não solução ruim: valueé exibida uma vez se eu usar \mweitemDumbem vez de \mweitem.

Até aqui, pensei ter entendido o que acontece aqui. Mas agora estou frustrado. Independentemente do que aconteça na definição de \mweitem, valuesempre será despejado no fluxo de saída no final de cada etapa de iteração de mapeamento.

Qual etapa eu perdi aqui? Eu gostaria de usar o argumento passado \mweitemcomo \prop_map_function:NNum argumento de macro normal,ou sejaque eu possa decidir sozinho onde colocá-lo no código expandido.

Responder1

A função chamada por \prop_map_function:NNdeve ser uma função de dois argumentos. O primeiro argumento receberá a chave, o segundo o valor. Não há necessidade de ligar \mwe_get:n.

Alterei os nomes das funções para cumprir as recomendações.

\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}

insira a descrição da imagem aqui

informação relacionada