biblatex
我希望我的样式 ( )中使用澳大利亚风格的日期和日期范围,biblatex-sbl
即使未加载 babel 或 polyglossia。当范围在一个月内时,以下代码会失败。我想要“2016 年 1 月 1 日至 5 日”,但我得到的却是“2016 年 1 月 1 日至 5 日”。有人可以帮忙吗?(FWIW,biblatex-chicago
在这种情况下也会失败。)
\documentclass{article}
\usepackage[backend=biber,dateabbrev=false]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{a,
title = {TitleA},
date = {2016-01-02}
}
@book{b,
title = {TitleB},
date = {2016-01-02/2016-02-05}
}
@book{c,
title = {TitleC},
date = {2016-01-01/2016-01-05}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\DefineBibliographyExtras{english}{%
\protected\def\mkbibdatelong#1#2#3{%
\iffieldundef{#3}
{}
{\stripzeros{\thefield{#3}}%
\iffieldundef{#2}{}{\nobreakspace}}%
\iffieldundef{#2}
{}
{\mkbibmonth{\thefield{#2}}%
\iffieldundef{#1}{}{\space}}%
\iffieldbibstring{#1}{\bibstring{\thefield{#1}}}{\stripzeros{\thefield{#1}}}}%
}
\begin{document}
\cite{a}, \cite{b}, \cite{c}
\printbibliography
\end{document}
答案1
啊,明白了。我需要这个:
\DefineBibliographyExtras{english}{%
\restorecommand\mkdaterangecomp
\restorecommand\mkdaterangecompextra
\restorecommand\mkdaterangeterse
\restorecommand\mkdaterangeterseextra
\protected\def\mkbibdatelong#1#2#3{%
\iffieldundef{#3}
{}
{\stripzeros{\thefield{#3}}%
\iffieldundef{#2}{}{\nobreakspace}}%
\iffieldundef{#2}
{}
{\mkbibmonth{\thefield{#2}}%
\iffieldundef{#1}{}{\space}}%
\iffieldbibstring{#1}{\bibstring{\thefield{#1}}}{\stripzeros{\thefield{#1}}}}%
}
编辑
实际上,以上还不够。为了给这个问题提供一个合适的答案,我实际上需要以下内容。这还考虑到了biblatex
的扩展日期/时间功能。
\DefineBibliographyExtras{english}{%
\protected\def\mkdaterangecomp{%
\mkdaterangetrunc{long}}%
\protected\def\mkdaterangeterse{%
\mkdaterangetrunc{short}}%
\protected\def\mkdaterangecompextra{%
\mkdaterangetruncextra{long}}%
\protected\def\mkdaterangeterseextra{%
\mkdaterangetruncextra{short}}%
\protected\def\mkbibdatelong#1#2#3{%
\iffieldundef{#3}
{}
{\thefield{#3}%
\iffieldundef{#2}{}{\nobreakspace}}%
\iffieldundef{#2}
{}
{\mkbibmonth{\thefield{#2}}%
\iffieldundef{#1}{}{\space}}%
\iffieldbibstring{#1}
{\bibstring{\thefield{#1}}}
{\dateeraprintpre{#1}\stripzeros{\thefield{#1}}}}%
}
答案2
有一个简单的方法(用 xelatex 和 pdflatex 测试)...
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{a,
title = {TitleA},
date = {2016-01-02}
}
@book{b,
title = {TitleB},
date = {2016-01-02/2016-02-05}
}
@book{c,
title = {TitleC},
date = {2016-01-01/2016-01-05}
}
\end{filecontents}
\usepackage[australian]{babel}
% Polyglossia variants don't quite work with biblatex at the moment
%\usepackage{polyglossia}
%\setdefaultlanguage[variant=british]{english}
\usepackage[%
%
% Basics
%
style=authoryear,
alldates=long,
dateabbrev=false,
%alldates=ymd, % ISO like, but customizable format (Recommended)
%
% Unecessary to set
%
% [default] autobib=try to get main document
% language from babel/polyglossia
%language=autobib,
%autolang=langname, % Don't worry about this.
%
% Other (new) settings you might like to play with
%
% alldatesusetime=true,
% alltimes=24h,
% seconds=true,
% timezones=true,
% datezeros=true,
% dateera=secular,
% datecirca=true,
% dateuncertain=true,
]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
Current language: \currentlang\\
\autocite{a}\\
\autocite{b}\\
\autocite{c}\\
\printbibliography
\end{document}
在参考书目/参考文献部分,结果如下:
标题 A(2016 年 1 月 2 日)。
标题 B(2016 年 1 月 2 日至 2016 年 2 月 5 日)。
标题 C(2016 年 1 月 1 日至 2016 年 1 月 5 日)。
总结一下:
- 设置
australian
为你的 babel 变体\usepackage[australian]{babel}
- 使用 biblatex 选项
alldates=long
- 根据需要设置其他选项(您已选择
dateabbrev=false
)。
这样得到的结果是“2016 年 1 月 1 日至 2016 年 1 月 5 日”,而不是“2016 年 1 月 1 日至 5 日”。但我建议前者更好,因为像“2016 年 12 月 31 日至 2016 年 1 月 5 日”这样的日期范围没有您指定的压缩和可读的等效项。
就您对@Ross 的回应而言,这似乎也给了您想要的东西。
Biblatex 对 Polyglossia 的支持目前存在问题(特别是 polyglossia 语言变体设置)。解决方案是暂时使用 babel,而不是 polyglossia。有关详细信息,请参阅http://tex.stackexchange.com > 我们如何使 Polyglossia 语言变体与 Biblatex 书目兼容?。
但是,我推荐你使用alldates=ymd
,它提供了类似 ISO 的格式(但具有 ISO 不允许的自定义选项)。在互联网时代,让你的日期在全球范围内友好是正确的。在这种情况下,当使用 时alldates=ymd
,该命令\usepackage[australian]{babel}
变得无关紧要,可以删除(出于 biblatex 目的)。这将产生:
标题 A(2016-01-02)。
标题 B(2016-01-02/2016-02-05)。
标题 C(2016-01-01/2016-01-05)。
警告:Biblatex 最近引入了大量日期时间功能,以支持使用 EDTF 输入日期(例如 2016-07-22T22:12+10:00;2016?;1875~;-0379~)。尽管发布的 biblatex 相当强大,但仍在测试中(我至少要确保您的 latex 包是最新的)。