Группировка отсортированных библиографий по langid

Группировка отсортированных библиографий по langid

Я знаю, что могу группировать библиографии по ключевым словам. Но это не тот случай, потому что если я не использую алфавитную сортировку и нумерацию, я могу разделить библиографию по ключевым словам. Но если я хочу отсортированную библиографию и нумерацию и попытаюсь разделить ее, я нарушу нумерацию. Мне нужно, чтобы элементы bib одного языка были перед элементами другого языка. Пример:

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,greek,russian]{babel} % English please
\setmainfont[
BoldFont={DeJavu Serif Bold},
ItalicFont={DeJavu Serif Italic},
BoldItalicFont={DeJavu Serif BoldItalic}
]{DeJavu Serif}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@Book{AlKarapan,
author = {Καραπαναγοπούλου, Αλέξανδρος Κ.},
title = {Η Μεγάλη Σύνοδος της Ορθοδόξου Ανατολικής Εκκλησίας},
publisher = {auto-édition},
date = {1990/1998},
volumes = {6},
address = {Αθήνα},
langid={greek},
}
@Inbook{CypinIstorijaRPC,
author = {Владислав Цыпин},
title = {История Русской Церкви 1917--1997},
chapter = {VIII},
publisher = {Издательство Спасо-Преображенского Валаамского монастыря},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
url = {http://old.pravoslavie.by/podpod.asp?id=135&Session=10},
langid={russian},
}
@Inbook{authorrus,
    author = {Другой Автор},
    title = {Название},
    chapter = {VIII},
    publisher = {Издательство},
    address = {Москва},
    date = {1997},
    urldate = {2010-10-25},
    langid={russian},
}
@article{baez/article,
    author       = {Baez, John C. and Lauda, Aaron D.},
    title        = {Higher-Dimensional Algebra {V}: 2-Groups},
    journaltitle = {Theory and Applications of Categories},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    annotation   = {An \texttt{article} with \texttt{eprint} and
        \texttt{eprinttype} fields. Note that the arXiv reference is
        transformed into a clickable link if \texttt{hyperref} support
        has been enabled.  Compare \texttt{baez\slash online}, which
        is the same item given as an \texttt{online} entry},
    hyphenation={english},
}
@article{another,
    author       = {Another,Author and One more, Author},
    title        = {Title},
    journaltitle = {Journal},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    hyphenation={english},
}
\end{filecontents*}

\usepackage[russian,greek,english]{babel}
\usepackage[natbib=true,
style=numeric,
isbn=true,
url=true,
defernumbers=false,
sorting=nyt, 
firstinits=true,
backend=biber,
language=auto,  
autolang=other]{biblatex}

\addbibresource{\jobname.bib}

\begin{document}
\cite{AlKarapan,CypinIstorijaRPC,baez/article}
\nocite{*}
\printbibliography
\end{document}

вывод будет: элементы на английском, затем на греческом и на русском. Если я редактирую файл bbl, просто перемещая русские записи в начало, затем греческие записи и последнюю английскую запись ине беги Биберпросто цитируйте записи и запускайте lualatex или xelatex, все будет хорошо.

Biblatex/Biber сортирует библиографию, и я вручную перемещаю записи для заданного языка в файле bbl. Я получаю записи, отсортированные для заданного языка и в желаемом порядке языков.

Вопрос: можно ли сделать такой заказ без редактирования bbl-файла?

это то, что я пытаюсь получить библиография после перемещения записей

Я не могу использовать несколько нагрудных номеров, так как мне нужна непрерывная нумерация.

решение1

Конечно, можно просто добавить \sort{\field{langid}}в процедуру сортировки, но это отсортирует языки лексикографически, так что первым будет английский, затем греческий, а затем русский, что не совсем то, что вам нужно.

Но, кстати, если мы отсортируемнисходящийлексикографически мы получаем нужный вам порядок в MWE.

\DeclareSortingScheme{lnyt}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort[direction=descending]{\field{langid}}
  \sort{
    \field{sortname}
    \field{author}
    \field{editor}
    \field{translator}
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{sortyear}
    \field{year}
  }
  \sort{
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field[padside=left,padwidth=4,padchar=0]{volume}
    \literal{0000}
  }
}

Конечно, это происходит только потому, что нужный вам порядок сортировки совпадает с обратным лексикографическим порядком названий языков.

Использовать sorting=lnytсейчас.


Более настраиваемое, но и немного более сложное решение использует presortполе и функцию сопоставления источников Бибера.

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=langid, match=\regexp{\Arussian\Z}, final]
      \step[fieldset=presort, fieldvalue=1]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Agreek\Z}, final]
      \step[fieldset=presort, fieldvalue=2]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Aenglish\Z}, final]
      \step[fieldset=presort, fieldvalue=3]
    }
  }
}

Каждый язык просто сопоставляется с числом, которое записывается в presortполе. presortПоле рассматривается перед другими полями сортировки.

Это позволяет использовать порядки сортировки, не соответствующие никакому лексикографическому порядку.

МВЭ

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,greek,russian]{babel} % English please
\setmainfont[
BoldFont={DeJavu Serif Bold},
ItalicFont={DeJavu Serif Italic},
BoldItalicFont={DeJavu Serif BoldItalic}
]{DeJavu Serif}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@Book{AlKarapan,
author = {Καραπαναγοπούλου, Αλέξανδρος Κ.},
title = {Η Μεγάλη Σύνοδος της Ορθοδόξου Ανατολικής Εκκλησίας},
publisher = {auto-édition},
date = {1990/1998},
volumes = {6},
address = {Αθήνα},
langid={greek},
}
@Inbook{CypinIstorijaRPC,
author = {Владислав Цыпин},
title = {История Русской Церкви 1917--1997},
chapter = {VIII},
publisher = {Издательство Спасо-Преображенского Валаамского монастыря},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
url = {http://old.pravoslavie.by/podpod.asp?id=135&Session=10},
langid={russian},
}
@Inbook{authorrus,
    author = {Другой Автор},
    title = {Название},
    chapter = {VIII},
    publisher = {Издательство},
    address = {Москва},
    date = {1997},
    urldate = {2010-10-25},
    langid={russian},
}
@article{baez/article,
    author       = {Baez, John C. and Lauda, Aaron D.},
    title        = {Higher-Dimensional Algebra {V}: 2-Groups},
    journaltitle = {Theory and Applications of Categories},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    annotation   = {An \texttt{article} with \texttt{eprint} and
        \texttt{eprinttype} fields. Note that the arXiv reference is
        transformed into a clickable link if \texttt{hyperref} support
        has been enabled.  Compare \texttt{baez\slash online}, which
        is the same item given as an \texttt{online} entry},
    hyphenation={english},
}
@article{another,
    author       = {Another,Author and One more, Author},
    title        = {Title},
    journaltitle = {Journal},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    hyphenation={english},
}
\end{filecontents*}

\usepackage[russian,greek,english]{babel}
\usepackage[natbib=true,
style=numeric,
isbn=true,
url=true,
defernumbers=false,
sorting=nyt, 
firstinits=true,
backend=biber,
language=auto,  
autolang=other]{biblatex}

\addbibresource{\jobname.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=langid, match=\regexp{\Arussian\Z}, final]
      \step[fieldset=presort, fieldvalue=1]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Agreek\Z}, final]
      \step[fieldset=presort, fieldvalue=2]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Aenglish\Z}, final]
      \step[fieldset=presort, fieldvalue=3]
    }
  }
}

\begin{document}
\cite{AlKarapan,CypinIstorijaRPC,baez/article}
\nocite{*}
\printbibliography
\end{document}

введите описание изображения здесь

решение2

Ниже приведена упрощенная версия ответа Moewe.


Исходный файл BibTeX

Следующий файл BibTeX сохранен в формате ~/TestBib.bib.

@book{shakespeare,
   author = {William Shakespeare},
   title = {Hamlet},
   year = {1600},
   langid = {english}
}
@book{homer,
   author = {Homer},
   title = {Illiad \& Oddysey},
   year = {8th century BC},
   langid = {greek}
}
@book{tolstoy,
   author = {Leo Tolstoy},
   title = {War and Peace},
   year = {1869},
   langid = {russian}
}

Простой документ LaTeX с библиографией

\documentclass{article}
\usepackage{biblatex}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

Результат бега

> cd ~
> Тест lualatex
> Тест biber
> Тест lualatex

является

Незашифрованный вывод


Сначала английский, остальные в соответствии с порядком по умолчанию

\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
   \maps {
      \map {
         \step [
            fieldsource=langid,
            match=english,
            fieldset=presort,
            fieldvalue=a
         ]
      }
   }
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

Сначала английский


Сначала английский, потом русский

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

\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
   \maps {
      \map {
         \step [
            fieldsource=langid,
            match=english,
            fieldset=presort,
            fieldvalue=a
         ]
         \step [
            fieldsource=langid,
            match=russian,
            fieldset=presort,
            fieldvalue=b
         ]
      }
   }
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

Вывод:

Сначала английский, потом русский


Примечания

  1. Нет необходимости передавать datatype=bibtexопцию \maps(как это сделано в ответе moewe), поскольку bibtexэто значение опции по умолчанию datatype. См. стр. 199 руководства biblatex, т. 3.18b, 12 июля 2022 г.

  2. Нет необходимости заключать регулярные выражения в \regexp(как это сделано в ответе moewe), если только они не содержат последовательности символов, которые также являются допустимыми командами TEX. См. стр. 204 руководства.

  3. Тип данных значения специального presortполя интерпретируется biblatexкак строка, а не как число. (См. стр. 31 руководства.) Порядок, применяемый к его значениям, является лексикографическим, а не числовым. Поэтому, по моему мнению, лучше избегать назначения чисел этому полю (как это сделано в ответе moewe), чтобы избежать неинтуитивных последствий. Например, если бы в моем примере "английский первый, русский второй" я присвоил английской записи значение , presortа 2русской записи presortзначение 10, русская запись в конечном итоге оказалась бы перед английской записью в библиографии.

  4. Если явно не указано иное, поле библиографической записи presortавтоматически устанавливается в mm. (См. второй абзац раздела 3.6 «Параметры сортировки» на стр. 83 руководства.) Таким образом, если есть ровно три различных значения , по которым langidвы хотите выполнить сортировку, вам не нужно явно указывать presortзначение всех трех из них (как это сделано в ответе moewe). Достаточно указать явное presortзначение только двух из них и убедиться, что оба лексикографически меньше mm.

    Это также полезная информация, если вы хотите, чтобы определенные записи отображались в верхней части библиографии, но вас не волнует указание относительного порядка остальных записей, как я сделал в своем примере «Сначала английский, остальные — в соответствии с порядком по умолчанию».

    Обратите внимание, что сопоставления источников происходят до применения любого шаблона сортировки, включая встроенные по умолчанию, описанные в приложениях C1–C3 руководства. (См. второй абзац раздела 4.5.3 «Динамическое изменение данных» на стр. 199 руководства.) Поэтому, если вы используете какой-либо из шаблонов сортировки по умолчанию, скажите, ntyкакой шаблон сортировки по умолчанию используется, если вы явно не указали какой-либо шаблон сортировки (см. раздел 3.1.2.1 «Параметры пакета/Параметры преамбулы/Общие» на стр. 48 руководства), порядок записей внутри каждой presortгруппы будет таким, как и ожидалось, т. е. как предписано шаблоном.

  5. Если расставить их разумно, количество steps и maps можно значительно сократить, а количество finals можно сократить или даже исключить. Сравните ответ moewe с моим примером "английский сначала, русский потом".

  6. Относительно семантики finalconsultэтот ответ от moewe, поскольку руководство по этому вопросу неясно и даже вводит в заблуждение.

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