Найти в Дзене

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

Сегодня продолжим работать с полями. Мне не нравится, что URL не начинается с новой строчки. Как-то плохо он выглядит, разорванный на две строки. Ещё хуже, когда он уходит за границы полей (а то и вообще за пределы документа). URL с новой строки можно сделать двумя способами:
1. С сохранением стиля biblatex-gost (точка и тире перед некоторыми записями). Для этого сначала поставим в опциях

Сегодня продолжим работать с полями. Мне не нравится, что URL не начинается с новой строчки. Как-то плохо он выглядит, разорванный на две строки. Ещё хуже, когда он уходит за границы полей (а то и вообще за пределы документа). URL с новой строки можно сделать двумя способами:
1. С сохранением стиля biblatex-gost (точка и тире перед некоторыми записями). Для этого сначала поставим в опциях загрузки biblatex url=false:

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

Затем изменим тип записей с Online

@Online{MWF,
  author       = {Миловидов, Владимир Фёдорович},
  title        = {О заточке клинков},
  media        = {eresource},
  url          = {https://www.youtube.com/watch?v=6ANOFS2N2xw},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

на BOOK:

@BOOK{MWF,
  author       = {Миловидов, Владимир Фёдорович},
  title        = {О заточке клинков},
  media        = {eresource},
  url          = {https://www.youtube.com/watch?v=6ANOFS2N2xw},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

Дело в том, что в записях Online поле url будет выводится по любому, хоть ты ставь в опциях загрузки biblatex url=false, хоть не ставь (а два вывода поля url совершенно ни к чему). Вывод поля url будет подавлен. После этого выведем его с новой строчки как неопределённое поле таким образом:

\renewbibmacro{finentry}{\finentry
      \iffieldundef{url}
      {}
      {\par\printfield{url}\finentry}
      }

Ставим это в преамбулу после загрузки библтографии. Компилируем и смотрим:

ЕСЛИ ВДРУГ НЕ ПОЛУЧИЛОСЬ, ПРОВЕРЬТЕ ВАШУ ПАПКУ НА СКРЫТЫЕ ФАЙЛЫ!(вот я их выделил в mc (жёлтый цвет)). УДАЛИТЬ, ПОТОМ СКОМПИЛИРОВАТЬ ВАШ ФАЙЛ .tex

-2

2. Без сохранения стиля biblatex-gost (удаляем точку и тире перед некоторыми записями, иначе они будут выводиться с новой строки перед выводом поля url).
Тип записи Online не трогаем, url=false в опции загрузки biblatex не ставим. Ставим в преамбулу после загрузки пакета biblatex вот что:

\newbibmacro*{bbx:parunit}{%
  \ifbibliography
    {\setunit{\bibpagerefpunct}\newblock
     \usebibmacro{pageref}%
     \clearlist{pageref}%
     \setunit{\adddot\par\nobreak}}
    {}}
\renewbibmacro*{doi+eprint+url}{%
  \usebibmacro{bbx:parunit}% Added
  \iftoggle{bbx:doi}
    {\printfield{doi}}
    {}%
  \iftoggle{bbx:eprint}
    {\usebibmacro{eprint}}
    {}%
  \iftoggle{bbx:url}
    {\usebibmacro{url+urldate}}
    {}}
\renewbibmacro*{eprint}{%
  \usebibmacro{bbx:parunit}% Added
  \iffieldundef{eprinttype}
    {\printfield{eprint}}
    {\printfield[eprint:\strfield{eprinttype}]{eprint}}}
\renewbibmacro*{url+urldate}{%
  \usebibmacro{bbx:parunit}% Added
  \printfield{url}%
  \iffieldundef{urlyear}
    {}
    {\setunit*{\addspace}%
     \printtext[urldate]{\printurldate}}}

С преамбулой разобрались, переходим к документу. Перед переименованием библиографии ставим команду

\nocite{*}
\renewcommand*{\addcolondelim}{\addcolon\space}
\renewcommand*{\newblockpunct}{\space\bibsentence} % убрать точку и тире перед записью
\renewcommand\bibname{Библиография}
\printbibliography

Компилируем и смотрим:

-3

Иногда хорошо сделать аннотацию к записи. Для этого есть разные способы:
1. С помощью поля addendum (о нём я уже говорил ранее). Правим запись в базе данных:

@BOOK{UzelLNS,
  author       = {Скрягин, Лев Николаевич},
  title        = {Морские узлы},
  address      = {М.},
  publisher    = {Транспорт},
  year         = {1994},
  edition      = {3},
  pagetotal    = {128~с.;~ил.},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus},
  addendum     = {Одна из лучших русскоязычных книг на тему вывязывания узлов}
}

Ставим затем в преамбулу после загрузки пакета biblatex вот что:

\DeclareFieldFormat{addendum}{{\par\smallskip\addspace# 1} % пробела между # и 1 нет; это здесь его не поставишь!

Компилируем и смотрим:

-4

2. С помощью поля annotation.

@BOOK{sait85,
  author       = {Ефимова, Евгения Григорьевна},
  title        = {Авторский раздел на сервере Самиздат},
  media        = {eresource},
  url          = {http://samlib.ru/e/efimowa_e_g/},
  annotation   = {Невероятное количество замечательных и доступных рецептов на любой вкус: как простых, так и сложных},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

В пакете biblatex-gost (да и во многих других тоже) оно не определено и не выводится.
Попробуем исправить это, поместив вывол неопределённого поля annotation

\renewbibmacro{finentry}{\finentry
      \iffieldundef{annotation}
      {}
      {\par\smallskip\printfield{annotation}\finentry}
      }

после добавления библиографии.

-5

Та-aк…  URL пропал. Значит, выводы полей конфликтуют (последующее подавляет предыдущее); чтобы этого не было, объединим их:

\renewbibmacro{finentry}{\finentry
      \iffieldundef{url}
      {}
      {\par\smallskip\printfield{url}\finentry}
      \iffieldundef{annotation}
      {}
      {\par\smallskip\printfield{annotation}\finentry}
      }

-6

Теперь всё замечательно.
3. С помощью поля abstract. Оно тоже не определено и по умолчанию не выводится. Поступаем с ним также, как с полем annotation: База данных;

@BOOK{sait85,
  author       = {Ефимова, Евгения Григорьевна},
  title        = {Авторский раздел на сервере Самиздат},
  media        = {eresource},
  url          = {http://samlib.ru/e/efimowa_e_g/},
  annotation   = {Невероятное количество замечательных и доступных рецептов на любой вкус: как простых, так и сложных},
  abstract     = {Новые рецепты появляются довольно часто},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}

Преамбула:

\renewbibmacro{finentry}{\finentry
      \iffieldundef{url}
      {}
      {\par\smallskip\printfield{url}\finentry}
      \iffieldundef{annotation}
      {}
      {\par\smallskip\printfield{annotation}\finentry}
      \iffieldundef{abstract}
      {}
      {\par\smallskip\printfield{abstract}\finentry}
      }

Абстракт-текст больше относится к резюме, чем к аннотации, но здесь его вывод выглядит сходно.

-7

Однако, 3 типа аннотаций — всё-таки перебор. Вернём полю addendum его значение (тем более, что тире перед разрывом строки выглядит не очень приятно, если его не ликвидировать) и будем использовать это поле для других целей; заменим его полем annotation.
Мы видим, что если добавить русскоязычные аннотацию и абстракт-текст к англоязычной книге,

@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},
  annotation   = {{Лучшее пособие для вывязывателей узлов всех времён и народов}},
  abstract     = {{К сожалению, русского издания нет до сих пор}}
}

то они появляться в библиографии не будут, даже если их защитить дополнительными фигурными скобками. Это можно исправить:
1. С сохранением стиля biblatex-gost:

\renewbibmacro{finentry}{\finentry
      \iffieldundef{url}
      {}
      {\par\smallskip\printfield{url}\finentry}
      \iffieldundef{annotation}
      {}
      {\selectlanguage{russian}\par\smallskip\printfield{annotation}\finentry}
      \iffieldundef{abstract}
      {}
      {\selectlanguage{russian}\par\smallskip\printfield{abstract}\finentry}
      }

После компиляции мы видим, что книга переместилась на первое место.

-8

Чтобы убрать её куда надо, сделаем так:
Запустим Pdflatex.
Запустим Biblatex.
Отредактируем получившийся файл с расширением .bbl:
Книга Клиффорда Эшли должна стоять после книги Ричарда Хопкинса. Вырежем данные, касающиеся книги с ключом Uzel2 (не забудьте избавиться от получившейся после вырезки пустой строки)

entry{Uzel2}{book}{}
      \name{author}{1}{}{%
        {{hash=0918110f8b31ee5e8e86669d6723ea88}{%
           family={Ashley\bibnamedelima Clifford},
           familyi={A\bibinitperiod\bibinitdelim C\bibinitperiod},
           given={Warren},
           giveni={W\bibinitperiod}}}%
      }
      \list{language}{1}{%
        {english}%
      }
      \list{location}{1}{%
        {New York}%
      }
      \list{publisher}{1}{%
        {Doubleday}%
      }
      \strng{namehash}{0918110f8b31ee5e8e86669d6723ea88}
      \strng{fullhash}{0918110f8b31ee5e8e86669d6723ea88}
      \strng{bibnamehash}{0918110f8b31ee5e8e86669d6723ea88}
      \strng{authorbibnamehash}{0918110f8b31ee5e8e86669d6723ea88}
      \strng{authornamehash}{0918110f8b31ee5e8e86669d6723ea88}
      \strng{authorfullhash}{0918110f8b31ee5e8e86669d6723ea88}
      \field{sortinit}{A}
      \field{sortinithash}{a3dcedd53b04d1adfd5ac303ecd5e6fa}
      \field{labelprefix}{1.}
      \field{labelnamesource}{author}
      \field{labeltitlesource}{title}
      \field{abstract}{{К сожалению, русского издания нет до сих пор}}
      \field{annotation}{{Лучшее пособие для вывязывателей узлов всех времён и народов}}
      \field{isbn}{0-385-04025-3}
      \field{langid}{russian}
      \field{origyear}{1944}
      \field{pagetotal}{620~p}
      \field{title}{The Ashley book of knots}
      \field{year}{1993}
      \true{nocite}
      \keyw{rus}
    \endentry

Поставим их после выходных данных книги Хопкинса (ключ Uzel13), сохраним файл .bbl и запустим Pdflatex ещё 2 раза. На этот раз всё получилось.

-9

2. Без сохранения стиля biblatex-gost:
Вначале немного переделаем базу данных — поставим точки явно после года, укажем явно страницы, а также изменим поле langid в книге Эшли с english на russian и добавим пустое поле presort в этой книге.

@Online{MWF,
  author       = {Миловидов, Владимир Фёдорович},
  title        = {О заточке клинков},
  media        = {eresource},
  url          = {https://www.youtube.com/watch?v=6ANOFS2N2xw},
  language     = {russian},
  langid       = {russian},
  keywords     = {int}
}
@book{Uzel2,
  author       = {Ashley Clifford, Warren},
  title        = {The Ashley book of knots},
  address      = {New York},
  publisher    = {Doubleday},
  year         = {1993.},
  origyear     = {1944},
  pagetotal    = {620~p},
  language     = {english},
  langid       = {russian},
  hyphenation  = {english},
  keywords     = {rus},
  addendum     = {По изображениям почти всё можно понять.},
  abstract     = {К сожалению, издания на русском языке нет и сейчас},
  annotation   = {Лучшее пособие для вывязывателей узлов всех времён и народов},
  presort      = {}
}
@BOOK{NozhNN,
  author       = {Наерман, Моисей Соломонович and Наерман, Яков Моисеевич},
  title        = {Руководство для подготовки шлифовщиков},
  address      = {М.},
  publisher    = {Высш.~шк.},
  year         = {1989.},
  pagetotal    = {279~с},
  language     = {russian},
  langid       = {russian},
  keywords     = {rus}
}

В преамбуле:

\usepackage[autostyle]{csquotes}
\usepackage[defernumbers=true,backend=biber,bibencoding=utf8,language=auto,autolang=other,sorting=ntvy,
babel=other,maxbibnames=999,maxcitenames=1,movenames=false,dropdates=true,style=gost-numeric]{biblatex}
\makeatletter
\renewcommand*{\newunitpunct}{\adddot}
\makeatother
\addbibresource{/home/dnt/bib/primer0fc.bib}
\makeatletter
\renewcommand*{\mkgostheading}[1]{\mkbibnormal{# 1}} 
% пробела между # и 1 нет!
\makeatother
\newbibmacro*{bbx:parunit}{%
  \ifbibliography
    {\setunit{\bibpagerefpunct}\newblock
     \usebibmacro{pageref}%
     \clearlist{pageref}%
     \setunit{\adddot\par\nobreak}}
    {}}
\renewbibmacro*{doi+eprint+url}{%
  \usebibmacro{bbx:parunit}% Added
  \iftoggle{bbx:doi}
    {\printfield{doi}}
    {}%
  \iftoggle{bbx:eprint}
    {\usebibmacro{eprint}}
    {}%
  \iftoggle{bbx:url}
    {\usebibmacro{url+urldate}}
    {}}
\renewbibmacro*{eprint}{%
  \usebibmacro{bbx:parunit}% Added
  \iffieldundef{eprinttype}
{\printfield{eprint}}
{\printfield[eprint:\strfield{eprinttype}]{eprint}}} \renewbibmacro*{url+urldate}{%
  \usebibmacro{bbx:parunit}% Added
  \printfield{url}%
  \iffieldundef{urlyear}
    {}
    {\setunit*{\addspace}%
     \printtext[urldate]{\printurldate}}}
\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldset=isbn, null]
    }
  }
}
\DeclareFieldFormat{addendum}{\selectlanguage{russian}\par\smallskip
{# 1}}
% пробела между # и 1 нет!
\renewbibmacro{finentry}{%
  \setunit{%
    \finentrypunct
    \renewcommand*{\finentry}{}%
     \par\smallskip}%
  \usebibmacro{annotation}
  \setunit{%
    \finentrypunct
    \renewcommand*{\finentry}{}%
     \par\smallskip}
  \usebibmacro{abstract}
 \finentry
}
\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]
    }
  }
}

В документе:

\clearpage
\nocite{*}
\renewcommand*{\addcolondelim}{\addcolon\space}
\renewcommand*{\newblockpunct}{\space\bibsentence}
\renewcommand\bibname{Библиография}
\printbibliography
\clearpage

Компилируем, смотрим результат:

-10

Можно регулировать параметры аннотации и абстракт-текста:

\renewbibmacro{finentry}{\finentry
      \iffieldundef{url}
      {}
      {\par\smallskip\printfield{url}\finentry}
      \iffieldundef{annotation}
      {}
      {\selectlanguage{russian}\par\smallskip\printfield{annotation}\finentry}
      \iffieldundef{abstract}
      {}
      {\selectlanguage{russian}\par\parindent=15mm\footnotesize\smallskip\printfield{abstract}\finentry}
      }

-11

На этом сегодня остановимся.