移动宏参数的预扩展

移动宏参数的预扩展

我正在使用 databib 包(datatool 包)从 BibTeX 数据库中获取信息,以便在 LaTeX 文件中任意使用。它提供了一个循环遍历 BibTeX 条目的命令。在这样的循环中,可以调用(未记录的)宏来\DTLformatauthorlist格式化该条目的作者列表(根据预定义格式)。

现在,我想在目录中使用此列表(使用\chapterprecistocmemoir 包的宏)。由于目录是根据 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}

在此处输入图片描述

相关内容