プロパティリストのマップ呼び出し: 出力内の値の位置の制御

プロパティリストのマップ呼び出し: 出力内の値の位置の制御

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 2回
  • 悪い非解決策:の代わりにvalueを使用すると、 が 1 回表示されます。\mweitemDumb\mweitem

ここまでは、ここで何が起きているのか理解できたと思っていました。しかし、今は行き詰まっています。 の定義で何が起こっているかに関係なく\mweitem、 はvalue常に各マッピング反復ステップの最後に出力ストリームにダンプされます。

ここでどのステップを見逃したのでしょうか?通常のマクロ引数のよう\mweitemに渡された引数を使用したいのですが、\prop_map_function:NNつまり拡張されたコードのどこに配置するかを自分で決めることができます。

答え1

によって呼び出される関数は\prop_map_function:NN、2 つの引数を持つ関数である必要があります。最初の引数にはキーが渡され、2 番目の引数には値が渡されます。 を呼び出す必要はありません\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}

ここに画像の説明を入力してください

関連情報