Найти тему

Некоторые особенности работы с Biblatex. Часть I.

Эта статья написана для тех, кто уже имеет некоторое представление о работе в системе LaTeX.
В системе должен быть установлен TeX и графические оболочки для комфортной работы. Я использую Texmaker, TeXstudio и Emacs (все мои статьи, опубликованные здесь, набраны и скомпилированы в нём). В TeXstudio после установки необходимо сделать русским интерфейс: также в программах Texmaker и TeXstudio надо настроить проверку орфографии (для настройки проверки орфографии придётся скачивать, помещать в соответствующую папку программы и подключать соответствующие словари); Emacs в Linux устанавливается легко, а вот в Windows придётся повозиться. Я работаю с классом memoir, но и для остальных классов большинству моих наработок найдётся применение.
 Одним из важнейших аспектов работы с TeX/LaTeX является умение создавать и настраивать библиографию. Её можно сделать несколькими способами:
1. С помощью окружения

\begin{thebibliography}

\end{thebibliography}

Этот подход хорош для небольших документов с уже подобранным списком литературы, так как позволяет все записи делать вручную. Однако данный метод не годится в том случае, если ссылок много, и они время от времени изменяются.
2. С помощью созданной базы данных. Я лично предпочитаю создавать её вручную, используя текстовый редактор Emacs. Кто-то привык пользоваться специальными программами вроде JabRef, Mendeley или Zotero, но от них, на мой взгляд, больше проблем, чем пользы; да и копаться в настройках нет никакого желания. Для формирования базы данных может использоваться либо BibTeX (он применяется преимущественно в случае использования кодировок CP1251 и KOI8-R), либо BibLaTeX. Он имеет преимущества перед BiBTeX в том плане, что работает с кодировкой UTF-8. Он использует для работы с .bib-файлами утилиту Biber. Необходимо указать в настройках Texmaker и TeXstudio путь к ней вот как:
Texmaker:
Настройка Настроить TexmakerКоманды и в строке Bib(la)tex написать biber %
TeXstudio:
ПараметрыКонфигурация → TeXstudio Компиляция и в строке Библиография по умолчанию выбрать txs:///biber
Вначале создаём пустой файл primer.bib и открываем его в Emacs. Начинаем заполнять базу данных:

@BOOK{NozhNN,
  author    = {Наерман, Моисей Соломонович and Наерман, Яков Моисеевич},
  title        = {Руководство для подготовки шлифовщиков},
  address      = {М.},
  publisher    = {Высш.~шк.},
  year         = {1989},
  pagetotal    = {279},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}
@BOOK{Uzel2,
  author       = {Ashley Clifford, Warren},
  title        = {The Ashley book of knots},
  address      = {New York},
  publisher    = {Doubleday},
  year         = {1993},
  isbn         = {0-385-04025-3},
  origyear     = {1944},
  pagetotal    = {620},
  language     = {english},
  langid       = {english},
  hyphenation  = {english},
  keywords     = {rus}
}
@BOOK{UzelLNS,
  author       = {Скрягин, Лев Николаевич},
  title        = {Морские узлы},
  address      = {М.},
  publisher    = {Транспорт},
  year         = {1994},
  edition      = {3},
  pagetotal    = {128~с.;~ил.},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}
@BOOK{Ximi,
  author       = {Скурихин, Игорь Михайлович and Нечаев, Алексей Петрович},
  title        = {Все о пище с точки зрения химика},
  subtitle     = {справ. издание},
address      = {М.},
  publisher    = {Высш.~шк.},
  year         = {1991},
  pagetotal    = {288},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}
@Collection{Marochnik,
  editor       = {В. Г. Сорокина},
  editortype   = {geneditor},
  title        = {Марочник сталей и сплавов},
  location     = {М.},
  publisher    = {Машиностроение},
  year         = {1989},
  pagetotal    = {640},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}
@BOOK{NozhIH,
  author   = {Ингерлейб, Михаил Борисович and Хорев, Валерий Николаевич},
  title        = {Твой нож},
  subtitle     = {Самый полный справочник},
  address      = {М.},
  publisher    = {АСТ: Астрель: Полиграфиздат},
  year         = {2010},
  series       = {Серия «Бойцовский клуб» },
  edition      = {4},
  pagetotal    = {256},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}
@BOOK{Uzel13,
  author       = {Хопкинс, Ричард},
  title        = {Искусство завязывать узлы},
  subtitle     = {100 самых надёжных верёвочных соединений для любителей и профессионалов},
  address      = {М.},
  publisher    = {Эксмо},
  year         = {2007},
  pagetotal    = {256~с.;~ил.},
  translator   = {М. Авданиной},
  origlanguage = {english},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}
@Collection{trk,
title          = {Традиционная русская кухня},
editor         = {Т. М. Воробьева and Т. А. Гаврилова},
editortype     = {{авт-сост.}},
year           = {2008},
publisher      = {Эксмо},
pagetotal      = {528},
location       = {М.},
language       = {russian},
langid         = {russian},
keywords       = {rus}
}
@Online{INozhForma,
  title        = {Особенности заточки ножей},
  media        = {eresource},
  url          = {http://knifehacker.ru/osobennosti-zatochki-nozha/},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}
@Online{MWF,
  author       = {Миловидов, Владимир Фёдорович},
  title        = {О заточке клинков},
  media        = {eresource},
  url          = {https://www.youtube.com/watch?v=6ANOFS2N2xw},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}
@Online{IMorusel,
  title        = {Морские узлы},
  media        = {eresource},
  url          = {https://морякам.рф/practice/53-morskie-uzly.html},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

После записи последнего поля запятую, как правило, не ставят, но я никакой разницы в поведении biblatex не заметил: что она есть, что её нет. Некоторые делают одну большую БД на все случаи жизни; другие предпочитают использовать несколько мелких для разных документов. Ключи лучше давать с осмысленными названиями; одинаковых ключей быть НЕ ДОЛЖНО! О типах записей и полях смотрите подробнее документацию (ссылка ниже); отмечу только две вещи — если издательств несколько, перечисляем их через двоеточие и поля, нуждающиеся в защите от автоматического исправления, заключаем в фигурные скобки:

publisher    = {АСТ: Астрель: Полиграфиздат},
editortype  = {{авт-сост.}},

Пакет cite был загружен ещё до этого:

\usepackage{cite}

Теперь в преамбуле исходника загружаем пакет csquotes для оформления сложных блоков цитирования:

\usepackage[autostyle]{csquotes}

После него пакет biblatex с необходимыми опциями:

\usepackage[backend=biber,bibencoding=utf8,language=auto,autolang=other,sorting=ntvy,babel=other,maxbibnames=99,maxcitenames=2,sorting=ntvy, style=gost-numeric]{biblatex}

и добавляем путь ка базе данных:

\addbibresource{/home/dnt/bib/primer.bib}

Значение параметров загрузки biblatex:
backend=biber (движок)
bibencoding=utf8 (кодировка bib файла)
sorting=ntvy (настройка сортировки списка литературы — имя, заглавие, том/книга/часть/выпуск, год); в стиле gost-numeric эта опция и так включена по умолчанию, но на всякий случай лучше пусть будет;
language=auto (получение языка из babel/polyglossia)
autolang=other (многоязычная библиография)
maxbibnames=99 (печатает полный список имён)
maxcitenames=2 (количество авторов в цитатах)
style=gost-numeric (стиль цитирования и библиографии (по ГОСТ)). Наиболее подходящий для российских стандартов. Разрабатывается Олегом Домановым. Документация находится в пакете, установленном в дистриве, либо на сайте CTAN:
https://www.ctan.org/pkg/biblatex-gost
На GitHub можно найти небольшую, но очень полезную вики с советами:
https://github.com/odomanov/biblatex-gost/wiki/
С преамбулой разобрались (пока что), переходим к документу. Там, где нужно, начинаем библиографию с новой страницы:

\clearpage
\nocite{*}
\printbibliography

Команда nocite* выводит все записи из базы данных primer.bib; можно также вывести отдельные записи, перечисляя их ключи через запятую в скобках вместо звёздочки. Если этой команды нет, то выводятся только книги, на которые имеются ссылки в документе:

\cite{key}
\cite{key1,key2}

Проводим компиляцию:
1 Pdflatex
2 Biblatex
3 Pdflatex
4 Pdflatex
Возможно, понадобится запустить Pdflatex ещё один раз. Смотрим, что получилось:

Выглядит не очень презентабельно. Мне не нравятся следующие вещи:
1) Перед разделяющим двоеточием пробел. Ну и кому понадобилось так испортить ГОСТ? Пора бы уже законодательно запретить такие действия.
2) ФИО авторов курсивом;
3) Книги на английском стоят перед книгами на русском;
4) URL печатается моноширинным шрифтом
5) URL, содержащий в названии кириллицу (5. Морские узлы…), испорчен;
6) ISBN в первой записи, который здесь не нужен;
7) Ссылки на электронные ресурсы расположены вперемешку с книгами:
8) Заголовок по умолчанию не очень хорош;
9) При открытии библиографии из содержания или панели закладок открывается не заголовок, а первая строка;
10) URL разорван и располагается на двух строчках.

ПЕРЕД КАЖДЫМ ИЗМЕНЕНИЕМ БИБЛИОГРАФИИ НЕОБХОДИМО УДАЛИТЬ ВСЁ ИЗ ПАПКИ ПРОЕКТА! ОСТАВЛЯЕМ ТОЛЬКО ИСХОДНИК (наш файл в формате .tex), НУ И ПАПКУ С ГРАФИКОЙ. ТАКЖЕ ПРОВЕРЬТЕ ПАПКУ НА ПРИСУТСТВИЕ СКРЫТЫХ ФАЙЛОВ (вроде .tex с тильдой в конце расширения); УДАЛИТЕ ТОЖЕ! (понятно, что весь процесс компиляции приходится проводить с самого начала).

Начнём ликвидировать эти недочёты:
1. Сделаем ФИО прямым шрифтом — поставим в преамбуле после добавления библиографии следующее:

\makeatletter
\renewcommand*{\mkgostheading}[1]{\mkbibnormal{# 1}} %
# и 1 пишем без пробела, это здесь у меня написать не получается.
\makeatother

-2

2. Поставим русскоязычные записи перед англоязычными:

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldset=langid, fieldvalue={tempruorder}]
    }
    \map[overwrite]{
      \step[fieldsource=langid, match=russian, final]
      \step[fieldsource=presort, match=\regexp{(.+)}, replace=\regexp{aa$1}]  %$
    }
    \map{
      \step[fieldsource=langid, match=russian, final]
      \step[fieldset=presort, fieldvalue={az}]
    }
    \map[overwrite]{
      \step[fieldsource=langid, notmatch=russian, final]
      \step[fieldsource=presort, match=\regexp{(.+)}, replace=\regexp{za$1}]  %$
    }
    \map{
      \step[fieldsource=langid, notmatch=russian, final]
    }
    \map{
      \step[fieldsource=langid, match={tempruorder}, final]
      \step[fieldset=langid, null]
    }
  }
}

-3

3. Сделаем ссылки URL нормальным шрифтом (загрузим пакет url перед пакетом csquotes и изменим шрифт):

\usepackage{url}
\renewcommand\UrlFont{\rmfamily}

-4

4. Уберём ISBN:
Это можно сделать двумя способами:
4.1. При загрузке biblatex добавить опцию isbn=false;

\usepackage[backend=biber,bibencoding=utf8,language=auto,autolang=other,babel=other,maxbibnames=999,maxcitenames=2,sorting=ntvy,isbn=false, style=gost-numeric]{biblatex}

4.2. Более жестокий вариант — поставим в преамбуле после добавления библиографии вот что:

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldset=isbn, null]
    }
  }
}

-5

В обоих случаях результат один и тот же.
5. Уберём пробел перед разделяющим двоеточием.
5.1. Первый способ — вставим в документе перед командой

\printbibliography

следующую строку:

\renewcommand*{\addcolondelim}{\addcolon\space}

5.2. Второй способ — вставим в преамбуле после подключения библиографии вот что:

\makeatletter
    \renewcommand*{\addcolondelim}{%
     \begingroup%
      \def\abx@colon{%
        \ifdim\lastkern>\z@\unkern\fi%
        \abx@puncthook{:}\space}%
      \addcolon%
      \endgroup}
    \renewcommand*{\addsemicolondelim}{%
     \begingroup%
      \def\abx@semicolon{%
        \ifdim\lastkern>\z@\unkern\fi%
        \abx@puncthook{;}\space}%
      \addsemicolon%
      \endgroup}
      {}
\makeatother

Этот макрос удаляет пробел перед разделяющим двоеточием (или перед точкой с запятой). О данном способе я узнал, загрузив архив проекта со страницы на GitHub:
https://github.com/AndreyAkinshin/Russian-Phd-LaTeX-Dissertation-Template
Автор — Андрей Акиньшин. Нужный нам файл biblatex.tex находится в папке biblio (взятый оттуда вышеприведённый макрос я слегка переделал, так как он был в черновом варианте — на титульном листе слева вверху вылезало вот что: =0). Кроме этого, там много и других полезных сведений.

-6

6. Переименуем библиографию — вставим в документе перед командой

\printbibliography

следующую конструкцию:

\renewcommand\bibname{Библиография}

-7

7. Сделаем кириллические ссылки читабельными. Для этого изменим запись

@Online{IMorusel,
  title        = {Морские узлы},
  media        = {eresource},
  url          = {https://морякам.рф/practice/53-morskie-uzly.html},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

вот так:

@Online{IMorusel,
  title        = {Морские узлы},
  media        = {eresource},
  addendum     = {{URL: \url{https://морякам.рф/practice/53-morskie-uzly.html}}},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

Поле addendum нам ещё будет достаточно интересно. Оно в библиографической записи выводится последним и может использоваться для различных комментариев, а также для других действий, с которыми мы ещё ознакомимся. Близко к нему по функциям поле note, но оно последним не выводится. После этого изменим преамбулу для использования движка Xelatex вместо Pdflatex и проведём компиляцию:
1 Xelatex
2 Biblatex
3 Xelatex
4 Xelatex
Возможно, понадобится запустить Xelatex ещё один раз. Смотрим, что получилось:

-8

А вообще лучше избегать таких записей в библиографии. Способ работы я показал, а в дальнейшем я эту запись удалю: Xelatex компилирует документ намного медленнее, чем Pdflatex, и тратить время мне не сильно хочется.

Пока достаточно. Продолжим позже.