
プロパティ リストを使用しており、for ループの生成に使用するキーのリストを生成するコマンドを作成できるようにしたいと考えています。現在、すべてのキーを生成するために \prop_map_inline を使用していますが、これを for ループで使用すると、複数の項目のコレクションではなく、単一の項目として解釈されます。
これはサンプルコードです:
\documentclass{article}
\usepackage{ifthen}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g_persons_prop
% Create a new person
\NewDocumentCommand{\CreatePerson}{m} {
\prop_gput:Nnn \g_persons_prop { #1 }
}
% Gets all persons
\NewDocumentCommand{\GetAllPersonKeys}{}{
\prop_map_inline:Nn \g_persons_prop {
##1,
}
}
\ExplSyntaxOff
\CreatePerson{jd}{John Doe}
\CreatePerson{ad}{Albert Dull}
\CreatePerson{bu}{Ben Under}
\begin{document}
I would like to have this:
\makeatletter
\begin{itemize}
\@for\sun:={jd, ad, bu}\do{\item We have person: \sun. }
\end{itemize}
\makeatother
But I get this instead:
\makeatletter
\begin{itemize}
\@for\sun:={\GetAllPersonKeys}\do{\item We have person: \sun. }
\end{itemize}
\makeatother
\end{document}
答え1
expl3 のキーをマップすることもできます:
\documentclass{article}
\usepackage{ifthen}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g_persons_prop
% Create a new person
\NewDocumentCommand{\CreatePerson}{m} {
\prop_gput:Nnn \g_persons_prop { #1 }
}
\NewDocumentCommand{\MapAllPersonKeys}{m}{
\prop_map_inline:Nn \g_persons_prop {
#1
}
}
\ExplSyntaxOff
\CreatePerson{jd}{John Doe}
\CreatePerson{ad}{Albert Dull}
\CreatePerson{bu}{Ben Under}
\begin{document}
I would like to have this:
\makeatletter
\begin{itemize}
\@for\sun:={jd, ad, bu}\do{\item We have person: \sun. }
\end{itemize}
\makeatother
\begin{itemize}
\MapAllPersonKeys{\item we have person: #1!}
\end{itemize}
\end{document}