Основной текст и библиография на двух языках, но с альтернативным форматом даты

Основной текст и библиография на двух языках, но с альтернативным форматом даты

Я пишу текст на американском английском и немецком языках (новая орфография), поэтому я использую \usepackage[ngerman,USenglish]{babel}. Библиография biblatex также содержит ссылки на английском и немецком языках. Мне нужны правила переноса слов для каждого языка в библиографии, поэтому я использую , \usepackage[backend=biber,language=autobib,autolang=hyphen]{biblatex}а затем указываю язык отдельных записей библиографии следующим образом: langid = {ngerman}.

Однако я хотел бы, чтобы все даты были в австралийском формате (dd Mon. YYYY). Как мне получить этот формат дат (особенно в библиографии)?

(Если бы мне не нужны были правила расстановки переносов на немецком языке в библиографии, я бы просто удалил autolangи langidи использовал \usepackage[backend=biber,language=australian{biblatex}, хотя это также изменило бы стиль расстановки переносов, кавычек, запятых и т. д. в библиографии на australianстиль .)

решение1

Я не знаю простого способа привести все даты во всем документе к австралийскому формату, но я знаю, как применить австралийский формат дат к библиографии, не влияя на стиль переносов.

Вы можете добавить australianв babel, а затем переключить язык на australianперед печатью библиографии. Тогда все даты в библиографии будут в австралийском стиле.

Имейте в виду, что это решение также влияет на другие факторы стиля в библиографии, такие как серийные запятые (как описано здесь) и форматирование кавычек. Например, ссылки на статьи, напечатанные в USenglishформате, используют двойные кавычки и оставляют конечную пунктуацию внутри кавычек, в то время как ссылки на статьи, напечатанные в australianформате, используют одинарные кавычки и оставляют конечную пунктуацию вне кавычек:

«Название статьи на американском английском».
«Название статьи на австралийском английском».

Следующий код иллюстрирует результат:

\documentclass{article}
\usepackage[ngerman,australian,USenglish]{babel}
\usepackage[autostyle]{csquotes}
\usepackage[backend=biber,language=autobib,autolang=hyphen,sorting=none]{biblatex}
\addbibresource{testbib.bib}

\begin{filecontents}{testbib.bib}
@article{default2014,
  author = {Vorname Nachname},
  title = {The German Rindfleischetikettierungs\"uberwachungsaufgaben\"ubertragungsgesetz},
  journaltitle = {Default Journal of Gastroenterology},
  date = {2014-03-20},
}
@article{au2014,
  author = {Vorname Nachname},
  title = {The German Rindfleischetikettierungs\"uberwachungsaufgaben\"ubertragungsgesetz},
  journaltitle = {Australian Journal of Gastroenterology},
  date = {2014-03-20},
  langid = {australian},
}
@article{us2014,
  author = {Vorname Nachname},
  title = {The German Rindfleischetikettierungs\"uberwachungsaufgaben\"ubertragungsgesetz},
  journaltitle = {American Journal of Gastroenterology},
  date = {2014-03-20},
  langid = {USenglish},
}
@article{de2014,
  author = {Vorname Nachname},
  title = {Das deutsche Rindfleischetikettierungs\"uberwachungsaufgaben\"ubertragungsgesetz},
  journaltitle = {Zeitschrift f\"ur Gastroenterologie},
  date = {2014-03-20},
  langid = {ngerman},
}
\end{filecontents}

\begin{document}
% main text here in USenglish (switch to ngerman when necessary)
The hyphenation rules of Australian English, American English, and German are\
different~\cite{default2014,au2014,us2014,de2014}.

\selectlanguage{australian} % for proper day/month order
\printbibliography
\end{document}

Запись на английском языке следует английским правилам переноса. Запись на немецком языке следует немецким правилам переноса. Обе записи следуют австралийскому формату даты.

Если langidполе пропущено, стиль переноса по умолчанию соответствует выбранному в данный момент языку (в данном примере australian).

решение2

Благодаряответ moewe здесь, я смог выяснить, как изменитьвсе длинные даты во всем документев австралийский формат. Затем я понял, как отобразитьвсе короткие датыв формате d/m/y (используя код, найденный в british.lbx, откуда australian.lbxнаследует свой короткий формат даты). Этот ответ изменяет форматы даты (как короткие, так и длинные)и ничего больше. Он применяет стиль «день перед месяцем» ко всему документу, написанному на американском английском.

Самый простой способ — вставить это в преамбулу:

\DefineBibliographyExtras{USenglish}{%

  % d-m-y format for long dates
  \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}}}}%

  % d-m-y format for short dates
  \protected\def\mkbibdateshort#1#2#3{%
    \iffieldundef{#3}
      {}
      {\mkdatezeros{\thefield{#3}}%
       \iffieldundef{#2}{}{/}}%
    \iffieldundef{#2}
      {}
      {\mkdatezeros{\thefield{#2}}%
       \iffieldundef{#1}{}{/}}%
    \iffieldbibstring{#1}{\bibstring{\thefield{#1}}}{\mkdatezeros{\thefield{#1}}}}%
}

Я написал код с псевдонимом USenglish, но вы можете заменить его на , americanесли захотите. Это два имени для одного и того же стиля. \usepackage{babel}Однако вам нужно убедиться, что это тот же псевдоним, который используется при вызове . (Если вы измените свойства USenglish, не ожидайте, что изменения будут перенесены на american!)

Более элегантное решение — создать файл .lbx, чтобы оставаться более организованным и сделать этот стиль легкодоступным в будущих документах. Код отличается только в начале и в конце. Вам нужно добавить \ProvidesFileв начало и \endinputв конец. Затем добавьте две \Inherit...команды и измените любые \Define...команды на Declare...команды.

\ProvidesFile{USenglish-dmy.lbx}[USenglish localization with d-m-y format for dates]

\InheritBibliographyExtras{USenglish}
\DeclareBibliographyExtras{%

  % d-m-y format for long dates
  \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}}}}%

  % d-m-y format for short dates
  \protected\def\mkbibdateshort#1#2#3{%
    \iffieldundef{#3}
      {}
      {\mkdatezeros{\thefield{#3}}%
       \iffieldundef{#2}{}{/}}%
    \iffieldundef{#2}
      {}
      {\mkdatezeros{\thefield{#2}}%
       \iffieldundef{#1}{}{/}}%
    \iffieldbibstring{#1}{\bibstring{\thefield{#1}}}{\mkdatezeros{\thefield{#1}}}}%
}

\InheritBibliographyStrings{USenglish}
\endinput

Сохраните это как USenglish-dmy.lbxи добавьте это в преамбулу: \DeclareLanguageMapping{USenglish}{USenglish-dmy}. Вот и все! Теперь все даты должны иметь день перед месяцем, и больше ничего (например, переносы или стили кавычек) не затронуто.

решение3

Пришлось использовать \DefineBibliographyExtras{english}этот обходной путь для моей настройки (Biblatex + Polyglossia).

Полиглоссия, посредством обработки вариантов, понимает австралийский язык как вариант английского языка,

\setmainlanguage[variant=australian,ordinalmonthday=true]{english}

но это ничего не меняет. Вариант не попадает в Biblatex и, к сожалению, gloss-english.ldfфайл определения языка устанавливается \english@ordinalmonthdayв false (и также \if@british@localeявляется false, поэтому он \todayпереопределяется как американский формат).

В любом случае Biblatex рассматривается englishкак язык полиглоссии, поэтому даты в цитатах и ​​ссылках отображаются в американском формате (который является стандартным для english).

Biblatex самостоятельно, без полиглоссии, понимает австралийские даты.

Итак: поскольку набор текста на языке, в конечном счете, представляет собой набор пользовательских опций или вариантов дизайна, таких как «стиль» или «тема» (шаблоны переносов, названия месяцев и частей документа, кавычки и знаки препинания, геометрия страницы), и поскольку документация Biblatex считает, что австралийский язык — это язык («известный Polyglossia»), почему бы не сделать его таковым?

gloss-australian.ldf, который представляет собой всего лишь gloss-english.ldfнесколько незначительных изменений:

\ProvidesFile{gloss-australian.ldf}[polyglossia: module for australian english]%<=== changed for australian
\PolyglossiaSetup{australian}{%<=== changed for australian
  hyphennames={english,australian,american,usenglish,USenglish},%<=== changed for australian
  hyphenmins={2,3},
  fontsetup=true,
}

\newif\if@british@locale
\@british@localetrue %<=== changed for australian
\providebool{@british@hyphen}
\providebool{english@ordinalmonthday}

\define@boolkey{english}[english@]{ordinalmonthday}[true]{}

%% English is a special case in that \l@english is reserved for US English, so
%% we need to handle it differently
\define@key{english}{variant}{%
  %needs to be reset for loop over hyphennames below:
  \def\do##1{%
      \xpg@ifdefined{#1}%
        {\csletcs{l@english}{l@#1}\listbreak}%
        {}%
  }%
  \ifstrequal{#1}{uk}%
    {\@british@localetrue
     \xpg@info{Option: english variant=british}}%
    {\ifstrequal{#1}{british}%
      {\@british@localetrue
      \xpg@info{Option: english variant=british}}%
        {\ifstrequal{#1}{us}% these patterns are the default so we don't need to reset them
          {\@british@hyphenfalse\english@ordinalmonthdayfalse
           \xpg@info{Option: english variant=american}}%
          {\ifstrequal{#1}{american}%
            {\@british@hyphenfalse\english@ordinalmonthdayfalse
            \xpg@info{Option: english variant=american}}%
            {\ifstrequal{#1}{usmax}%
              {\@british@hyphenfalse\english@ordinalmonthdayfalse
                \ifluatex\else\setkeys[xpg@setup]{english}{hyphennames={usenglishmax}}\fi
                \xpg@info{Option: english variant=american (with additional patterns)}%
                \xpg@ifdefined{usenglishmax}{}%
                  {\xpg@warning{No hyphenation patterns were loaded for "US English Max"\MessageBreak
                    I will use the standard patterns for US English instead}%
                  \adddialect\l@usenglishmax\l@english\relax}%
                \gdef\english@language{\language=\l@usenglishmax}}%
                {\ifstrequal{#1}{australian}%
                  {\@british@hyphentrue\english@ordinalmonthdaytrue %<=== changed for australian
                  \xpg@info{Option: english variant=australian}}%
                  {\ifstrequal{#1}{newzealand}%
                    {\@british@hyphentrue\english@ordinalmonthdayfalse
                      \xpg@info{Option: english variant=newzealand}}%
                      {\xpg@warning{Unknown English variant `#1'}}%
  }}}}}}%
  \if@british@locale\@british@hyphentrue\english@ordinalmonthdaytrue\fi
  \if@british@hyphen
    \ifluatex\else\setkeys[xpg@setup]{english}{hyphennames={ukenglish,british,UKenglish}}\fi
    \xpg@ifdefined{ukenglish}{}%
      {\xpg@warning{No hyphenation patterns were loaded for British English\MessageBreak
         I will use the patterns for US English instead}%
       \adddialect\l@ukenglish\l@english\relax}%
    \gdef\english@language{\language=\l@ukenglish\xpg@set@language@luatex@ii{ukenglish}}%
  \fi
  % and we reset \do to its previous definition here:
  \def\do##1{\setotherlanguage{#1}}%
}

\def\captionsenglish{%
   \def\prefacename{Preface}%
   \def\refname{References}%
   \def\abstractname{Abstract}%
   \def\bibname{Bibliography}%
   \def\chaptername{Chapter}%
   \def\appendixname{Appendix}%
   \def\contentsname{Contents}%
   \def\listfigurename{List of Figures}%
   \def\listtablename{List of Tables}%
   \def\indexname{Index}%
   \def\figurename{Figure}%
   \def\tablename{Table}%
   \def\partname{Part}%
   \def\enclname{encl}%
   \def\ccname{cc}%
   \def\headtoname{To}%
   \def\pagename{Page}%
   \def\seename{see}%
   \def\alsoname{see also}%
   \def\proofname{Proof}%
}
\def\dateenglish{%
   \def\english@day{%
     \ifenglish@ordinalmonthday
       \ifcase\day\or
        1st\or 2nd\or 3rd\or 4th\or 5th\or
        6th\or 7th\or 8th\or 9th\or 10th\or
        11th\or 12th\or 13th\or 14th\or 15th\or
        16th\or 17th\or 18th\or 19th\or 20th\or
        21st\or 22nd\or 23rd\or 24th\or 25th\or
        26th\or 27th\or 28th\or 29th\or 30th\or
        31st\fi
     \else\number\day\fi}%
     \def\english@month{\ifcase\month\or
      January\or February\or March\or April\or May\or June\or
      July\or August\or September\or October\or November\or December\fi}%
   \def\today{%
    \if@british@locale
      \english@day\space\english@month\space\number\year
    \else
    \ifenglish@ordinalmonthday%<=== inserted for australian
        \english@day\space\english@month\space\number\year%<=== inserted for australian
    \else%<=== inserted for australian
      \english@month\space\english@day,\space\number\year
    \fi%<=== inserted for australian
    \fi}%
}

\endinput

MWE, язык, установленный australianв Polyglossia, дающий формат DMY в Biblatex, с datetime2пакетом для возврата \todayк тому, каким он должен быть (для заголовка), и csquotesпакетом для кавычек.

\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@periodical{jtest,journaltitle={The Martian Chronicle},location={Mars},date={2148-03-26},}
@article{atest,author={AI Author},title={Human professor explores Olympus},crossref={jtest},pages={para 9},}
\end{filecontents*}

\documentclass[12pt]{article}

% SETTINGS
%  ===================================
\newcommand\mytitle{A Title}
\newcommand\myauthorname{An Author}
\newcommand\mybibfilename{\jobname.bib}
%  ===================================
\usepackage{fontspec}
\setmainfont{Noto Serif} %arbitrary font
\usepackage{polyglossia}
\setmainlanguage{australian}
\usepackage[british]{datetime2} % for date formatting of \today: put after polyglossia

\usepackage[style=british]{csquotes}
\usepackage[style=oxnotes,    citereset=section, 
ibidtracker=true,    
sortlocale=en_AU,
scnames=true, 
%annotation = true,
indexing=cite,     
mincrossrefs=20,    
backend=biber, 
isbn=false,       
%backref=true,
language=australian,
abbreviate=true,
date=long,
%babel=hyphen
%autolang=true
]{biblatex}

\addbibresource{\mybibfilename}

\title{\mytitle} % provide title info
\author{\myauthorname}          % provide author info
\date{\today}           % provide date

\begin{document}
\maketitle 
Text\cite{atest}.
\printbibliography
\end{document}

Результат: австралийские даты

Изменение языка на englishдает формат cite/bib MDY

\setmainlanguage{english}

английский по умолчанию американский

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