biblatex:设置单个条目的最大名称

biblatex:设置单个条目的最大名称

我正在使用biblatex(以 biber 作为后端)。我使用全局maxnames选项来缩短作者列表(使用“et al.”)。但是,我想为某些特定条目创建一些例外情况。

我希望我可以使用options输入字段(用于每个输入选项)。

例如,我将使用以下全局设置:

\usepackage[bibstyle=numeric-comp,citestyle=numeric-comp,backend=biber,maxnames=3]{biblatex}

然后,我将覆盖maxnames某些单个项目的设置,例如允许更长的作者列表,如下所示:

@INPROCEEDINGS{Vallejos2009b,
  author = {John Doe and Pete Peters and Jane Jones and John Johnson and Alison Anderson},
  title = {Some Title},
  booktitle = {...},
  year = {2009},
  options = {maxnames=5}
}

不幸的是,这不起作用,因为maxnames它不支持作为入门级选项。至少在当前的 biblatex 版本中是这样。

有人知道我该怎么做这样的事吗?

附言:我使用数字引用样式,因此我的问题仅涉及参考书目本身中作者列表的缩写。

答案1

您无法通过 bib 文件关键字或样式编辑自行可靠地完成此操作,因为 maxnames(以及 maxbibnames、maxalphanames)在生成 .bbl 时由 biber 内部用于执行各种操作。因此,如果 biber 不支持将其作为每个条目选项,则条目信息可能会出现错误/不一致的情况,例如标签、哈希和唯一名称/唯一列表设置。

我们已经研究过这一点,该功能将在下一个 biber 和 biblatex 版本中实现,可能是 0.9.6/1.7。您将能够设置:

最大名称/最小名称 最大cite名称/最小cite名称 最大bib名称/最小bib名称 最大alpha名称/最小alpha名称 最大项目/最小项目

基于每个类型和每个条目。

只是为了确认这已经在几天前发布的 biber 0.9.6/biblatex 1.7 中实现。

答案2

解决方案是黑客。参见PLK的合法答案。

您必须修改每个 bibitem。我想通过keyword为相关 bib 条目设置特殊值来实现这一点。在 bibitem 的开头,您可以测试密钥是否已设置。如果密钥已设置,您可以更改计数器maxnames

\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}
@INPROCEEDINGS{Vallejos2009b,
  author = {John Doe and Pete Peters and Jane Jones and John Johnson and Alison Anderson},
  title = {Some Title},
  booktitle = {...},
  year = {2009},
  keywords={increasemaxnames},
}

@book{test,
author="John Smith and John Doe and Pete Peters and Jane Jones and John Johnson",
title="TITLE",
year=2009,
publisher="PUP",
}
\end{filecontents}
\documentclass{article}
\usepackage[bibstyle=numeric-comp,citestyle=numeric-comp,backend=biber,maxnames=3]{biblatex}
\bibliography{\jobname.bib}
\AtEveryBibitem{%
\ifkeyword{increasemaxnames}%
   {\setcounter{maxnames}{5}}
   {\setcounter{maxnames}{3}}
}

\begin{document}
\cite{Vallejos2009b} \cite{test}
\printbibliography
\end{document}

编辑:

Audrey 希望我的方法不需要编辑 bib 文件。这可以通过比较来实现entrykey。我创建了一个名为 的命令\individualentry。该命令需要用逗号分隔的 列表entrykeys。如果entrykey不存在,它也会起作用 ;-)

这里是命令的定义:

\newrobustcmd*\individualentry[1]{%
  \def\tempa{}%
  \def\tempb{ ( test {\ifstrequal{2}{1}} ) }%
  \forcsvlist{\listeadd\tempa}{#1}
  \def\do##1{%
     \gappto\tempb{ or (test  {\iffieldequalstr{entrykey}{##1}}) }
  }%
  \dolistloop{\tempa}%
  \AtEveryBibitem{
    \expandafter\ifboolexpr\expandafter{\tempb}%
            {\setcounter{maxnames}{5}}%
            {\setcounter{maxnames}{3}}
  }
}

在序言中使用该命令非常重要!

以下是整个例子:

\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}
@INPROCEEDINGS{Vallejos2009b,
  author = {John Doe and Pete Peters and Jane Jones and John Johnson and Alison Anderson},
  title = {Some Title},
  booktitle = {...},
  year = {2009},
  keywords={increasemaxnames},
}

@book{test,
author="John Smith and John Doe and Pete Peters and Jane Jones and John Johnson",
title="TITLE",
year=2009,
publisher="PUP",
}
\end{filecontents}
\documentclass{article}
\usepackage[bibstyle=numeric-comp,citestyle=numeric-comp,backend=biber,maxnames=3]{biblatex}
\bibliography{\jobname.bib}
\newrobustcmd*\individualentry[1]{%
  \def\tempa{}%
  \def\tempb{ ( test {\ifstrequal{2}{1}} ) }%
  \forcsvlist{\listeadd\tempa}{#1}%
  \def\do##1{%
     \gappto\tempb{ or (test  {\iffieldequalstr{entrykey}{##1}}) }%
  }%
  \dolistloop{\tempa}%
  \AtEveryBibitem{%
    \expandafter\ifboolexpr\expandafter{\tempb}%
            {\setcounter{maxnames}{5}}%
            {\setcounter{maxnames}{3}}%
  }%%
  \AtEveryCitekey{%
     \expandafter\ifboolexpr\expandafter{\tempb}%
            {\setcounter{maxnames}{5}}%
            {\setcounter{maxnames}{3}}%
  }%
}
%\individualentry{foo,Vallejos2009b,test}
\individualentry{foo,Vallejos2009b}
\begin{document}
\cite{Vallejos2009b} \cite{test} 

\fullcite{Vallejos2009b}

 \fullcite{test} 

\printbibliography
\end{document}

相关内容