根据内容对书目字段进行复数化

根据内容对书目字段进行复数化

考虑以下最小示例:

\documentclass{article}      

\usepackage{biblatex,filecontents}

\begin{filecontents*}{references.bib}
@book{book1,
  author    = {A Author},
  title     = {A title},
  chapter   = {1},
  publisher = {A publisher},
  year      = {2000}
}
@book{book2,
  author    = {B Author},
  title     = {B Title},
  chapter   = {1-3},
  publisher = {B publisher},
  year      = {2001}
}
\end{filecontents*}

\addbibresource{references.bib}

\DeclareFieldFormat[book]{chapter}{Chapter~\mkcomprange{#1}}

\begin{document}

\nocite{*}

\printbibliography

\end{document}

我如何更新chapter字段声明的格式(本例中特定于@book条目),以便能够区分单个和多个章节条目。也就是说,book1应该按原样打印,而book2应该打印Chapters 1-5(注意复数形式)。

在此处输入图片描述

我试过

\DeclareFieldFormat[book]{chapter}{%
  Chapter\ifnumcomp{\rangelen{chapter}}{>}{1}{s}{}~\mkcomprange{#1}}

\rangelen期望一个字段被定义为包含一个范围,但chapter事实并非如此。

答案1

我们有检查\ifnumeral\ifnumerals。前者检查数字,而后者检查数字范围。我们可以放心地假设,\ifnumeral当你想要单数字符串时,将产生“true”,而\ifnumerals当你想要复数字符串时,将产生“true”。

我建议您另外使用参考书目字符串。chapter已经存在,但没有复数形式chapters

\NewBibliographyString{chapters}
\DefineBibliographyStrings{english}{
  chapter  = {chapter},
  chapters = {chapters}
}

然后你可以使用

\DeclareFieldFormat[book]{chapter}{%
  \ifnumerals{#1}
    {\ifnumeral{#1}
       {\bibstring{chapter}}
       {\bibstring{chapters}}}
    {}%
  ~\mkcomprange{#1}}

或者

\DeclareFieldFormat[book]{chapter}{%
  \ifnumeral{#1}
    {\bibstring{chapter}}
    {\ifnumerals{#1}
       {\bibstring{chapters}}
       {}}%
  ~\mkcomprange{#1}}

后者或多或少就是这样\mkpageprefix的。

相关内容