По нескольким причинам мне необходимо объявить в документе LaTeX с помощью biblatex новый драйвер с новыми полями.
Например, может быть задана следующая запись BibTeX:
\begin{filecontents}{\jobname.bib}
@aloa{chris,
fu = {Hawaii},
fubo = {Hawaiiboooo},
year = {2015}}
\end{filecontents}
Затем я хотел бы определить в документе LaTeX что-то вроде:
\DeclareBibliographyDriver{aloa}{%
\newunit\newblock
\printfield{fu}%
\newunit\newblock
\printfield{fubo}%
\newunit\newblock
\printfield{year}%
\finentry}
И затем я хотел бы процитировать запись таким образом, чтобы в списке литературы получилось следующее:
Гавайи Гавайибууу 2015
Минимальный пример может быть таким:
\documentclass{article}
\begin{filecontents}{\jobname.bib}
@aloa{chris,
fu = {Hawaii},
fubo = {Hawaiiboooo},
year = {2015}}
\end{filecontents}
\usepackage[backend=bibtex8]{biblatex}
\DeclareBibliographyDriver{aloa}{%
\newunit\newblock
\printfield{fu}%
\newunit\newblock
\printfield{fubo}%
\newunit\newblock
\printfield{year}%
\finentry}
\bibliography{\jobname.bib}
\begin{document}
\nocite{chris}
\printbibliography
\end{document}
Возможно ли это сделать только в файле LaTeX (с bibtex, а не biber)?
решение1
Можно создавать новые драйверы и новые поля ввода biblatex
даже без biber
.
Когда бэкэнд не используется biber
, для генерации файла biblatex
используется специальный .bst
файл , поэтому необходимо изменить . Вот процедура:biblatex.bst
.bbl
biblatex.bst
1) найдите biblatex.bst
и сделайте его копию, переименуйте копию (например, mybiblatex.bst
) и поместите переименованную копию в место, где bibtex
ее можно будет найти (простое решение — поместить в ту же папку/каталог, что и файл latex).
2) в локальной копии найдите ENTRY
и добавьте поля, которые вы хотите добавить:
ENTRY {
entryset
...
fu
fubo
}
это указывает bibtex
на то, что fu
и fubo
являются bibtex
полями.
3) найти в локальной копии FUNCTION {output.fields.3}
и создать новую функцию
FUNCTION {output.myfields} {
"fu" fu output:write:field
"fubo" fubo output:write:field
}
эта функция указывает bibtex
, как обрабатывать новое поле. Для каждой строки первые два аргумента — это имя нового поля (полей); для третьего аргумента можно использовать output:write:<type>
, где <type>
— одно из name
, field
, verb
, list
или year
, в зависимости от типа данных записи.
4) найдите в локальной копии функцию FUNCTION {output:entry}
. Добавьте к этой функции output.myfields
, так что это должно выглядеть так
FUNCTION {output:entry}{
...
output.fields.3
output.myfields
output.compat.1
...
}
5) для каждого нового водителя <driver>
добавьте строку
FUNCTION {<driver>} { type$ output:entry }
в примере это должно быть
FUNCTION {aloa} {type$ output:entry}
6) добавьте к источнику латекса следующее:
\makeatletter
\def\blx@auxinit@bibtex#1{%
\blx@auxwrite\blx@auxout@bibtex
{\def\do##1{,\blx@stripbib{##1}}}
{\ifx\blx@auxout@bibtex\@mainaux
\else
\blx@msg@aux
\fi
\string\bibstyle{mybiblatex}\blx@nl
\string\bibdata{%
\blx@ctrlfile@bibtex\blxauxsuffix
\ifx#1\@empty
\else
\dolistloop#1%
\fi}\blx@nl
\string\citation{biblatex-control}}}
\makeatother
это означает, что следует bibtex
использовать mybiblatex.bst
вместо значения по умолчанию biblatex.bst
.
Вот вывод на MWE