Biblatex: Объявление нового драйвера с новыми полями

Biblatex: Объявление нового драйвера с новыми полями

По нескольким причинам мне необходимо объявить в документе 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.bblbiblatex.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

введите описание изображения здесь

Связанный контент