使用 biblatex 启用牛津逗号并自定义“and”

使用 biblatex 启用牛津逗号并自定义“and”

我需要启用牛津逗号(适用于 3 位或更多作者),以及在参考书目和引文中将“and”替换为“&”。我可以执行其中一项或另一项,但尝试同时执行两项操作无法启用牛津逗号。

梅威瑟:

\documentclass{article}

\usepackage[UKenglish]{babel}
\usepackage{csquotes}
\usepackage[style=authoryear,uniquename=init,giveninits]{biblatex}

\begin{filecontents}[overwrite]{\jobname.bib}
@book{3people,
  author    = {John Smith1 and Alex Smith2 and Bob Smith3},
  title     = {Some Random Thing},
  date      = {1970}
}
@book{2people,
  author    = {John Smith1 and Alex Smith2},
  title     = {Some Other Thing},
  date      = {1971}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\DeclareNameAlias{sortname}{family-given} % Make last names come before first names
\renewcommand*\finalnamedelim{\addspace\&\addspace} % Replace "and" with "&"
\DefineBibliographyExtras{UKenglish}{\def\finalandcomma{\addcomma}} % Enable Oxford Comma

\begin{document}

\parencite{2people}\par\parencite{3people}
\printbibliography

\end{document}

期望输出:

(史密斯 1 和史密斯 2 1971 年)
(史密斯 1、史密斯 2 和史密斯 3 1970 年)

参考

Smith1, J. & Smith2, A. (1971). 其他一些事情。Smith1
, J., Smith2, A., & Smith3, B. (1970). 一些随机的事情。

答案1

finalnamedelim你可能想看看biblatex.def,第 3.14 版第 85-87 行

\DeclareDelimFormat{finalnamedelim}{%
  \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
  \addspace\bibstring{and}\space}

并将其修改为使用“&”而不是“and”,如下所示

\documentclass{article}
\usepackage[UKenglish]{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, uniquename=init, giveninits]{biblatex}


\DeclareNameAlias{sortname}{family-given}% Make last names come before first names

\DeclareDelimFormat{finalnamedelim}{%
  \ifnumgreater{\value{liststop}}{2}{\finalandcomma}{}%
  \addspace\&\space}
  
\DefineBibliographyExtras{UKenglish}{\def\finalandcomma{\addcomma}} % Enable Oxford Comma

\begin{filecontents}{\jobname.bib}
@book{3people,
  author    = {John Smith1 and Alex Smith2 and Bob Smith3},
  title     = {Some Random Thing},
  date      = {1970},
}
@book{2people,
  author    = {John Smith1 and Alex Smith2},
  title     = {Some Other Thing},
  date      = {1971},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\parencite{2people}\par\parencite{3people}
\printbibliography
\end{document}

(Smith1 和 Smith2 1971)//(Smith1、Smith2 和 Smith3 1970)

示例中的结果与Ulrike 的回答,但有两个相关区别。

  1. 此答案使用finalnamedelim上下文敏感的分隔符,并使用接口来实现它。 (\renewcommand在上下文敏感的分隔符上使用并不是错误,但我更喜欢使用新接口,因为它可以更自然地推广到其他分隔符上下文。)
  2. \finalandcomma此解决方案保留了牛津逗号的使用。这意味着它需要的代码比 Ulrike 的答案更多,但它更加模块化。

答案也使用而不是etoolbox,但这主要取决于个人喜好(并且这里的代码库并不十分一致:不使用,但有些和文件使用 )。\ifnumgreaterifthen\ifthenelsebiblatexbiblatex.def\ifthenelse.cbx.bbx

答案2

您可以测试列表计数:

\documentclass{article}

\usepackage[UKenglish]{babel}
\usepackage{csquotes}
\usepackage[style=authoryear,uniquename=init,giveninits]{biblatex}

\begin{filecontents}[overwrite]{\jobname.bib}
@book{3people,
  author    = {John Smith1 and Alex Smith2 and Bob Smith3},
  title     = {Some Random Thing},
  date      = {1970}
}
@book{2people,
  author    = {John Smith1 and Alex Smith2},
  title     = {Some Other Thing},
  date      = {1971}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\DeclareNameAlias{sortname}{family-given} % Make last names come before first names
% Replace "and" with "&", and add Oxford Comma
\renewcommand*\finalnamedelim{\ifthenelse{\value{listcount}>2}{\addcomma}{}\addspace\&\addspace}

\begin{document}

\parencite{2people}\par\parencite{3people}
\printbibliography

\end{document}

在此处输入图片描述

相关内容