Сегодня продолжим работать с полями. Мне не нравится, что 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. Без сохранения стиля 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
Компилируем и смотрим:
Иногда хорошо сделать аннотацию к записи. Для этого есть разные способы:
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 нет; это здесь его не поставишь!
Компилируем и смотрим:
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}
}
после добавления библиографии.
Та-aк… URL пропал. Значит, выводы полей конфликтуют (последующее подавляет предыдущее); чтобы этого не было, объединим их:
\renewbibmacro{finentry}{\finentry
\iffieldundef{url}
{}
{\par\smallskip\printfield{url}\finentry}
\iffieldundef{annotation}
{}
{\par\smallskip\printfield{annotation}\finentry}
}
Теперь всё замечательно.
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}
}
Абстракт-текст больше относится к резюме, чем к аннотации, но здесь его вывод выглядит сходно.
Однако, 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}
}
После компиляции мы видим, что книга переместилась на первое место.
Чтобы убрать её куда надо, сделаем так:
Запустим 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 раза. На этот раз всё получилось.
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
Компилируем, смотрим результат:
Можно регулировать параметры аннотации и абстракт-текста:
\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}
}
На этом сегодня остановимся.