我正在使用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}