
Я знаю, что могу группировать библиографии по ключевым словам. Но это не тот случай, потому что если я не использую алфавитную сортировку и нумерацию, я могу разделить библиографию по ключевым словам. Но если я хочу отсортированную библиографию и нумерацию и попытаюсь разделить ее, я нарушу нумерацию. Мне нужно, чтобы элементы 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}
Вывод:
Примечания
Нет необходимости передавать
datatype=bibtex
опцию\maps
(как это сделано в ответе moewe), посколькуbibtex
это значение опции по умолчаниюdatatype
. См. стр. 199 руководстваbiblatex
, т. 3.18b, 12 июля 2022 г.Нет необходимости заключать регулярные выражения в
\regexp
(как это сделано в ответе moewe), если только они не содержат последовательности символов, которые также являются допустимыми командами TEX. См. стр. 204 руководства.Тип данных значения специального
presort
поля интерпретируетсяbiblatex
как строка, а не как число. (См. стр. 31 руководства.) Порядок, применяемый к его значениям, является лексикографическим, а не числовым. Поэтому, по моему мнению, лучше избегать назначения чисел этому полю (как это сделано в ответе moewe), чтобы избежать неинтуитивных последствий. Например, если бы в моем примере "английский первый, русский второй" я присвоил английской записи значение ,presort
а2
русской записиpresort
значение10
, русская запись в конечном итоге оказалась бы перед английской записью в библиографии.Если явно не указано иное, поле библиографической записи
presort
автоматически устанавливается вmm
. (См. второй абзац раздела 3.6 «Параметры сортировки» на стр. 83 руководства.) Таким образом, если есть ровно три различных значения , по которымlangid
вы хотите выполнить сортировку, вам не нужно явно указыватьpresort
значение всех трех из них (как это сделано в ответе moewe). Достаточно указать явноеpresort
значение только двух из них и убедиться, что оба лексикографически меньшеmm
.Это также полезная информация, если вы хотите, чтобы определенные записи отображались в верхней части библиографии, но вас не волнует указание относительного порядка остальных записей, как я сделал в своем примере «Сначала английский, остальные — в соответствии с порядком по умолчанию».
Обратите внимание, что сопоставления источников происходят до применения любого шаблона сортировки, включая встроенные по умолчанию, описанные в приложениях C1–C3 руководства. (См. второй абзац раздела 4.5.3 «Динамическое изменение данных» на стр. 199 руководства.) Поэтому, если вы используете какой-либо из шаблонов сортировки по умолчанию, скажите,
nty
какой шаблон сортировки по умолчанию используется, если вы явно не указали какой-либо шаблон сортировки (см. раздел 3.1.2.1 «Параметры пакета/Параметры преамбулы/Общие» на стр. 48 руководства), порядок записей внутри каждойpresort
группы будет таким, как и ожидалось, т. е. как предписано шаблоном.Если расставить их разумно, количество
step
s иmap
s можно значительно сократить, а количествоfinal
s можно сократить или даже исключить. Сравните ответ moewe с моим примером "английский сначала, русский потом".Относительно семантики
final
consultэтот ответ от moewe, поскольку руководство по этому вопросу неясно и даже вводит в заблуждение.