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
文件中时才会被检测到,即当它们被明确地\cite
d 或被添加到.bbl
with中时\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}