
Habe gerade angefangen, mich in expl3 zu vertiefen. Ich habe eine Eigenschaftenliste und einen Wrappercode für Dokumentbefehle. Ich fülle die Liste auf und durchlaufe sie mit \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}
- Erwartete Ausgabe: Beschreibungsartige Liste von
key
-Paarenvalue
- Tatsächliche Ausgabe: Liste der Elemente, die von indiziert sind
key
, aber angezeigt werdenvalue
zweimal. - Schlechte Nicht-Lösung:
value
wird einmal angezeigt, wenn ich\mweitemDumb
anstelle von verwende\mweitem
.
Bis hierhin dachte ich, ich hätte verstanden, was hier passiert. Aber jetzt bin ich ratlos. Unabhängig davon, was in der Definition von passiert \mweitem
, value
wird am Ende jedes Mapping-Iterationsschritts immer in den Ausgabestrom ausgegeben.
Welchen Schritt habe ich hier übersehen? Ich möchte das \mweitem
von übergebene Argument \prop_map_function:NN
wie ein normales Makroargument verwenden.dhdass ich selbst entscheiden kann, wo ich es in den erweiterten Code einfüge.
Antwort1
Die aufgerufene Funktion \prop_map_function:NN
sollte eine Funktion mit zwei Argumenten sein. Dem ersten Argument wird der Schlüssel übergeben, dem zweiten der Wert. Ein Aufruf von ist nicht erforderlich \mwe_get:n
.
Ich habe die Funktionsnamen geändert, um den Empfehlungen zu entsprechen.
\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}