我已经为项目和人员设置了一个数据库结构。目的是将人员的 ID 作为值存储在项目数据库的列中。现在我想引用那些信息存储在不同数据库中的人员。
更新
我能够使用 获得所需信息\DTLgetvalue
。对于 中的一个条目,这现在工作正常pi
。但是我如何循环遍历 中存储的所有条目pi
?我尝试使用clist_map_inline
失败了。
梅威瑟:
\documentclass{scrbook}
\usepackage{datatool}
% ===== people database setup =======
\makeatletter
\define@key{person}{name}{\DTLnewdbentry{\crcDB}{name}{#1}}
\define@key{person}{nameFirst}{\DTLnewdbentry{\crcDB}{nameFirst}{#1}}
\makeatother
\NewDocumentCommand{\crcPersonEntry}{ m m }{
\def\crcDB{#1}
\DTLifdbexists{\crcDB}{}{\DTLnewdb{\crcDB}}
\DTLnewrow{\crcDB}
\setkeys{person}{#2}
}
% ===== project database setup
\makeatletter
\define@key{project}{name}[\DTLnewdbentry{\crcDB}{name}{}]{\DTLnewdbentry{\crcDB}{name}{#1}}
\define@key{project}{pi}[\DTLnewdbentry{\crcDB}{pi}{}]{\DTLnewdbentry{\crcDB}{pi}{#1}}
\makeatother
\NewDocumentCommand{\crcProjectEntry}{ m m }{
\def\crcDB{#1}
\DTLifdbexists{\crcDB}{}{\DTLnewdb{\crcDB}}
\DTLnewrow{\crcDB}
\setkeys{project}{#2}
}
\ExplSyntaxOn
% Use: \getProject{<id>}
\NewDocumentCommand{\getPIs}{m}{%
\clist_map_inline:Nn {#1}{%
\DTLgetvalue{\thePI}{##1}{1}{\dtlcolumnindex{##1}{nameFirst}}\thePI\space
\DTLgetvalue{\thePI}{##1}{1}{\dtlcolumnindex{##1}{name}}\thePI
}}
\NewDocumentCommand{\getProject}{m}{%
\DTLgetvalue{\theProjectName}{#1}{1}{\dtlcolumnindex{#1}{name}}\theProjectName-\space
\DTLgetvalue{\thePIlist}{#1}{1}{\dtlcolumnindex{#1}{pi}}(\thePIlist)\space
\getPIs{\thePIlist}
}
\ExplSyntaxOff
\begin{document}
\crcProjectEntry{project1}{
name={My Project},
pi={person1, person2}
}
\crcProjectEntry{project2}{
name={My other Project},
pi={person3}
}
\crcPersonEntry{person1}{
name={Perssonos},
nameFirst={Peter}
}
\crcPersonEntry{person2}{
name={Holgersson},
nameFirst={Agnes}
}
\crcPersonEntry{person3}{
name={Ickstein},
nameFirst={Paula}
}
%\getProject{project1} % --> My Project, Peter Perssonos, Agnes Holgersson
\getProject{project2} % -> My other Project, Paula Ickstein
\end{document}
这就是目前的结果。