Формат австралийского диапазона дат без Babel в biblatex?

Формат австралийского диапазона дат без Babel в biblatex?

Я хочу, чтобы даты и диапазоны дат в австралийском стиле использовались в моем 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}
  • Используйте опцию biblatexalldates=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 обновлены).

Связанный контент