속성 목록에 대한 맵 호출: 출력에서 ​​값의 위치 제어

속성 목록에 대한 맵 호출: 출력에서 ​​값의 위치 제어

이제 막 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

여기까지는 여기서 무슨 일이 일어나는지 이해했다고 생각했습니다. 하지만 지금은 당황스럽습니다. 의 정의에서 어떤 일이 발생하는지에 관계없이 는 각 매핑 반복 단계가 끝날 때 항상 출력 스트림으로 덤프됩니다 \mweitem.value

여기서 어떤 단계를 놓쳤습니까? 일반 매크로 인수처럼 \mweitem전달 된 인수를 사용하고 싶습니다 .\prop_map_function:NN확장된 코드의 어디에 넣을지 스스로 결정할 수 있습니다.

답변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}

여기에 이미지 설명을 입력하세요

관련 정보