
Recién comencé a sumergirme en expl3. Tengo una lista de propiedades y un código contenedor de comandos de documento. Completo la lista y la recorro con \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}
- Resultado esperado: lista de estilos de descripción de
key
paresvalue
- Salida real: lista de elementos indexados por
key
, pero que se muestranvalue
dos veces. - Mala no solución:
value
se muestra una vez si uso\mweitemDumb
en lugar de\mweitem
.
Hasta aquí creía entender lo que pasa aquí. Pero ahora estoy bloqueado. Independientemente de lo que suceda en la definición de \mweitem
, value
siempre se volcará en el flujo de salida al final de cada paso de iteración del mapeo.
¿Qué paso me perdí aquí? Me gustaría utilizar el argumento pasado \mweitem
como \prop_map_function:NN
un argumento macro normal,es decirque puedo decidir por mí mismo dónde colocarlo en el código expandido.
Respuesta1
La función llamada por \prop_map_function:NN
debe ser una función de dos argumentos. Al primer argumento se le pasará la clave, al segundo el valor. No es necesario llamar \mwe_get:n
.
Cambié los nombres de las funciones para cumplir con las recomendaciones.
\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}