我正在使用 databib 包(datatool 包)从 BibTeX 数据库中获取信息,以便在 LaTeX 文件中任意使用。它提供了一个循环遍历 BibTeX 条目的命令。在这样的循环中,可以调用(未记录的)宏来\DTLformatauthorlist
格式化该条目的作者列表(根据预定义格式)。
现在,我想在目录中使用此列表(使用\chapterprecistoc
memoir 包的宏)。由于目录是根据 toc 文件中找到的数据排版的,因此排版发生在循环体之外。因此,的参数\chapterprecistoc
必须包含 的扩展版本\DTLformatauthorlist
。但是,我不知道如何做到这一点。
根据本网站上关于扩展的一些讨论,我尝试
\expandafter\chapterprecistoc\expandafter{\DTLformatauthorlist}
但这会导致错误,因为
\precistoctext {\let }
在 toc 文件中。
但我知道,这\precistoctext
确实扩展了它的参数:使用 databib 可以使用\DTLbibfield
宏访问 BibTeX 条目字段。然后
\chapterprecistoc{\DTLbibfield{Author}}
确实将 的扩展放入\DTLbibfield{Author}
了 toc 文件中。所以我猜想这\DTLformatauthorlist
需要“更多”扩展。
所要求的最小示例:
\begin{filecontents}{data.bib}
@inproceedings{test,
Author = {Author One and Auteur Twee},
Title = {An expansive approach to author list transportation},
}
\end{filecontents}
\documentclass{memoir}
\usepackage{databib}
\begin{document}
\tableofcontents
% GET DATA OUT OF BIBFILE INTO DB
\nocite{*}
\DTLloadbbl{data}{data.bib}
\DTLforeachbibentry*{data}{
% GET DATA OUT OF DB INTO MACROS
\providecommand{\Authors}{\DTLbibfield{Author}}
\providecommand{\Title}{\DTLbibfield{Title}}
% ADD LINE TO TOC
\addcontentsline{toc}{chapter}{\Title}
\chapterprecistoc{\Authors} % works, just for illustration
% \chapterprecistoc{\DTLformatauthorlist} % does not work
}
\end{document}
答案1
您不必尝试获取目录中扩展的作者列表,而是可以仅传递 cite 键,然后在目录中再次调用数据库:
\documentclass{memoir}
\usepackage{databib}
\newcommand\printauthorlist{}
\DeclareRobustCommand\printauthorlist[1]{%
\DTLforeachbibentry[\DTLbibfieldiseq{CiteKey}{#1}]{data}{\DTLformatauthorlist}}
\begin{document}
\nocite{*}
\DTLloadbbl{data}{data.bib}
\tableofcontents
\DTLforeachbibentry*{data}{
% GET DATA OUT OF DB INTO MACROS
\providecommand{\Authors}{\DTLbibfield{Author}}
\providecommand{\Title}{\DTLbibfield{Title}}
% ADD LINE TO TOC
\addcontentsline{toc}{chapter}{\Title}
\chapterprecistoc{\printauthorlist{\DBIBcitekey}} % works, just for illustration
}
\end{document}
(我对 databib 不够了解,不知道针对 CiteKey 的测试是否是打印单个项目的最佳方式。我通常使用 biblatex 来做这样的事情。)
答案2
这\DTLformatauthorlist
似乎只是为了立即打印当前作者列表。
我建议获取它的定义并将其转换为带有参数的另一个宏,我们用以可扩展形式从数据库中提取该宏\DTLbibfieldlet
。
应该对标题使用相同的宏,并且应该立即扩展临时宏(一次),否则如果文件中存在更多条目,您将只获得最后一组.bib
。
\begin{filecontents}{\jobname.bib}
@inproceedings{test,
Author = {Author One and Auteur Twee},
Title = {An expansive approach to author list transportation},
}
\end{filecontents}
\documentclass{memoir}
\usepackage{databib}
\makeatletter
\protected\def\formatauthorlist#1{%
\DTLstartsentencespace
\@dtl@authorcount=0\relax
\@for\@dtl@author:=#1\do{%
\advance\@dtl@authorcount by 1\relax}%
\@dtl@tmpcount=0\relax
\ifnum\@dtl@authorcount>\c@DTLmaxauthors
{%
\@for\@dtl@author:=#1\do{%
\advance\@dtl@tmpcount by 1\relax
\ifnum\@dtl@tmpcount=1\relax
\expandafter\DTLformatauthor\@dtl@author
\else
\ifnum\@dtl@tmpcount>\c@DTLmaxauthors
\DTLandnotlast \etalname
\expandafter\DTLcheckendsperiod\expandafter{\etalname}%
\@endfortrue
\else
\DTLandnotlast \expandafter\DTLformatauthor\@dtl@author
\fi
\fi
}%
}%
\else
\@for\@dtl@author:=#1\do{%
\advance\@dtl@tmpcount by 1\relax
\ifnum\@dtl@tmpcount=1\relax
\expandafter\DTLformatauthor\@dtl@author
\else
\ifnum\@dtl@tmpcount=\@dtl@authorcount
\ifnum\@dtl@authorcount=2\relax
\DTLtwoand
\else
\DTLandlast
\fi
\expandafter\DTLformatauthor\@dtl@author
\else
\DTLandnotlast \expandafter\DTLformatauthor\@dtl@author
\fi
\fi
}%
\fi
}
\makeatother
\begin{document}
\tableofcontents
% GET DATA OUT OF BIBFILE INTO DB
\nocite{*}
\DTLloadbbl{data}{\jobname.bib}
\DTLforeachbibentry*{data}{%
% GET DATA OUT OF DB INTO MACROS
\DTLbibfieldlet\thisauthor{Author}%
\DTLbibfieldlet\thistitle{Title}%
% ADD LINE TO TOC
\begingroup\edef\x{\endgroup
\noexpand\addcontentsline{toc}{chapter}{\unexpanded\expandafter{\thistitle}}}\x
\begingroup\edef\x{\endgroup
\noexpand\chapterprecistoc{%
\formatauthorlist{\unexpanded\expandafter{\thisauthor}}}}\x
}
\end{document}