
Я хочу, чтобы даты и диапазоны дат в австралийском стиле использовались в моем biblatex
стиле ( biblatex-sbl
), даже если babel или polyglossia не загружены. Следующий код не работает в случаях, когда диапазон находится в пределах месяца. Я хочу «1–5 января 2016», но вместо этого получаю «1 января–52016». Может ли кто-нибудь помочь? (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}
В результате в разделе библиографии/ссылок получаем:
TitleA (2 января 2016 г.).
TitleB (2 января 2016 г. - 5 февраля 2016 г.).
TitleC (1 января 2016 г. - 5 января 2016 г.).
Подводя итог, вы:
- Установить
australian
как вариант Babel\usepackage[australian]{babel}
- Используйте опцию biblatex
alldates=long
- Установите другие параметры по желанию (вы выбрали
dateabbrev=false
).
Это даст вам "1 января 2016-5 января 2016" вместо "1–5 января 2016". Но я бы предположил, что первый вариант лучше, учитывая, что диапазон дат вроде "31 декабря 2016-5 января 2016" не будет иметь сжатого и читаемого эквивалента того типа, который вы указали.
Похоже, это также дает вам то, что вы хотели сказать в ответе @Ross.
Поддержка Biblatex для Polyglossia в настоящее время является проблемой (особенно для настройки языкового варианта polyglossia). Решением является использование babel, а не polyglossia, на данный момент. Подробности см.http://tex.stackexchange.com > Как заставить языковые варианты Polyglossia работать с библиографиями Biblatex?.
Однако я бы рекомендовал вам, alldates=ymd
что дает вам формат, похожий на ISO (но с возможностями настройки, которые ISO не позволяет). В эпоху Интернета правильно делать ваши даты глобально дружественными. В этом случае, при использовании alldates=ymd
, команда \usepackage[australian]{babel}
становится неактуальной и может быть удалена (для целей biblatex). Это даст:
TitleA (2016-01-02).
TitleB (2016-01-02/2016-02-05).
TitleC (2016-01-01/2016-01-05).
Предупреждение, что Biblatex недавно представил ряд функций datetime для поддержки EDTF для ввода дат (например, 2016-07-22T22:12+10:00; 2016?; 1875~; -0379~). Хотя выпущенный biblatex довольно надежен, он все еще проходит тестирование (я бы по крайней мере убедился, что ваши пакеты latex обновлены).