我可以让“citetitles”(注意是复数)引用书中的所有条目吗?

我可以让“citetitles”(注意是复数)引用书中的所有条目吗?

xelatex考虑这个 MWE (与、biber、一起运行xelatex

\documentclass{article}
\usepackage[backend=biber]{biblatex-chicago}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{poe1907hemmelighedsfulde,
title = {Hemmelighedsfulde Fortællinger},
author = {Poe, Edgar Allan},
year = {1907},
publisher = {Gyldendal},
}
@inbook{poe1907mysteriet,
title = {Mysteriet Marie Rogêt},
crossref = {poe1907hemmelighedsfulde},
}

@inbook{poe1907guldbillen,
title = {Guldbillen},
crossref = {poe1907hemmelighedsfulde},
}

\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}

The book \citetitle{poe1907hemmelighedsfulde} contains \citetitles{poe1907mysteriet,poe1907guldbillen}.

\end{document}

有可能做这样的事吗?

The book \citetitle{poe1907hemmelighedsfulde} contains \citealltitles{poe1907hemmelighedsfulde}.

答案1

biblatex没有crossref特定父条目的条目列表。因此,当我们处理时,poe1907hemmelighedsfulde我们无法知道其子条目。

这意味着解决这个问题的第一步是获取它的子项。这在下面发生:列表\AtDataInput中的每个条目都将包含其子项。这在某个级别发生的事实意味着一个非常重要的限制:crossref\knblx@crossrefs@<refsection>@for@<entrykey>biblatex\AtDataInput仅当子项出现在.bbl文件中时才会被检测到,即当它们被明确地\cited 或被添加到.bblwith中时\nocite即使 Biber 提供了现成的条目列表,也不可能克服这一限制,因为这将要求.bib检查和阅读每个条目(无论是否引用)(相关:是否可以使用 Biblatex/Biber 并在文档代码内根据关键字向参考书目添加条目?)。

如果您有该子项列表,则实现\citeallcontainedtitles“只是”循环遍历列表并打印所需信息。由于一般不能保证crossref-ing 条目与其父项具有“in”关系,因此 MWE 中实现的命令会检查是否确实如此。

\documentclass{article}
\usepackage[backend=biber]{biblatex-chicago}

\makeatletter
\AtDataInput{%
  \iffieldundef{crossref}
    {}
    {\listcsxadd{knblx@crossrefs@\the\c@refsection @for@\thefield{crossref}}{\thefield{entrykey}}}}

% {<loopcode>}{<entrytype> (* applies to all types)}{<entry key>}
\newcommand*{\knlbx@filteredloop}[3]{%
  \edef\knblx@thisentrytype{#2}%
  \entrydata{#3}{%
    \ifstrequal{#2}{*}
      {#1}
      {\expandafter\ifentrytype\expandafter{\knblx@thisentrytype}
         {#1}
         {}}}}

\newbibmacro{citeallcontainedtitles}{%
  \ifcsvoid{knblx@crossrefs@\the\c@refsection @for@\thefield{entrykey}}
    {\blx@nounit}
    {\forlistcsloop
       {\knlbx@filteredloop
          {\usebibmacro{kncite:title}%
           \setunit{\addcomma\space}}
          {in\thefield{entrytype}}}
       {knblx@crossrefs@\the\c@refsection @for@\thefield{entrykey}}}}

\newbibmacro{kncite:title}{%
  \ifciteindex
    {\indexfield{indextitle}}
    {}%
  \printfield[citetitle]{labeltitle}}
\makeatother

\DeclareCiteCommand{\citeallcontainedtitles}
  {\boolfalse{citetracker}%
   \boolfalse{pagetracker}%
   \usebibmacro{prenote}}
  {\usebibmacro{citeallcontainedtitles}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{poe1907hemmelighedsfulde,
  title     = {Hemmelighedsfulde Fortællinger},
  author    = {Poe, Edgar Allan},
  year      = {1907},
  publisher = {Gyldendal},
}
@inbook{poe1907mysteriet,
  title    = {Mysteriet Marie Rogêt},
  crossref = {poe1907hemmelighedsfulde},
}
@inbook{poe1907guldbillen,
  title    = {Guldbillen},
  crossref = {poe1907hemmelighedsfulde},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\nocite{*}

\begin{document}
The book \citetitle{poe1907hemmelighedsfulde} contains \citeallcontainedtitles{poe1907hemmelighedsfulde}.
\end{document}

《Hemmelighedsfulde Fortællinger》一书中包含“Guldbillen”、“Mysteriet Marie Rogêt”。

相关内容