6/02/2008

Зачем нужен BiBTeX и как его использовать

Этот пост является частью большой статьи
"Как оформить диплом в LaTeX?",
которую написал virens,
ведущий блога "Записки дебианщика"

В этом посте уже говорилось о том, что такое BiBTeX и как его использовать. Судя по поступившим комментариям, это немного не очевидно - поэтому приведу простой пример использования единой библиографической базы BiBTeX в нескольких документах. Естественно, предполагается, что все необходимые программы (tetex, jabref, java) установлены и работают.


BiBTeX or not BiBTeX?
Чтобы ответ на этот вопрос стал более нагляден и очевиден, я приведу примеры документов с его использованием и без. Особенно ярко это проявляется тогда, когда кусок документа с цитированием литературных источников вставляется в другой документ - и это сейчас будет продемонстрировано.

BibTeX не используется
Итак, создан простенький документ, в нём несколько ссылок на литературу, причём эти ссылки должны нумероваться в порядке упоминания. Вот как выглядит исходный код документа:

\documentclass[a4paper,12pt,oneside]{article}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{amssymb,amsfonts,amsmath,mathtext,cite,enumerate,float}

\begin{document}

<.....>

Метод Голда\cite{gold} получен из метода ван Циттерта\cite{gold-cittert},
но с предположением, что действует он только для положительных чисел.
Восстанавливает по следующему алгоритму


<.....>


\newpage
\begin{thebibliography}{00} % Список литературы
\bibitem{blind}
S. M. Jefferies and J. C. Christou. Restoration of astronomical images by iterative
blind deconvolution. Astrophysical Journal, 415:862+, October 1993.
\bibitem{cittert}
Van CITTERT, P. H. : Zum Einfluss der Spaltbreite auf die
Intensittverteilung in Spektralinien II, Zeitschrift f\"ur Physik 69
(1933), 298.
\bibitem{cittert-convergence}
N.R. Hill, G.E. Ioup: J. Opt. Soc. Am. 66 (1976) 487
\bibitem{gold}
GOLD, R. : An Iterative Unfolding Method for Matrices, Tech.
Rep. ANL-6984, Argonne National Laboratory, Argonne, Illinois,
1964.
\bibitem{gold-cittert}
Journal of Electrical Engineering, Vol. 56, NO. 5-6, 2005, 141--145
Multidimensional FFT Based Positive
Definite Gold Deconvolution Algorithm
Miroslav Morh\'a\v{c} -- Vladislav Matou\v{s}ek
\bibitem{lucy}
L.B. Lucy. An iteration technique for the rectification of observed distributions.
Astronomical Journal, 79:745--754, 1974.
\bibitem{holmes}
Holmes, T.J. 1992. Blind deconvolution of
quantum-limited imagery: maximum likelihood
approach. J. Opt. Soc. Am. A 9:1052-
1061.
\bibitem{jansson}
P.A. Jansson, R.H. Hunt, and E.K. Peyler. Resolution enhancement of spectra.
Journal of the Optical Society of America, 60:596--599, 1970.
\end{thebibliography}
\end{document}
Разумеется, показан не весь документ, а лишь его часть. Ещё раз: ссылки \cite{} будут пронумерованы в том порядке, в котором они упомянуты в окружении \begin{thebibliography} .... \end{thebibliography} а не в порядке упоминания в тексте!

А вот как выглядит набранный документ:

Метод Голда [4] получен из метода ван Циттерта [5], но с предположени-ем, что действует он только для положительных чисел. Восстанавливает последующему алгоритму

<...>
Список литературы:

<...>
[4] GOLD, R. : An Iterative Unfolding Method for Matrices, Tech. Rep. ANL-
6984, Argonne National Laboratory, Argonne, Illinois, 1964.

[5] Journal of Electrical Engineering, Vol. 56, NO. 5-6, 2005, 141-
145 Multidimensional FFT Based Positive Definite Gold Deconvolution
Algorithm Miroslav Morhac - Vladislav Matousek

Теперь, если переставить местами в окружении \begin{thebibliography} .... \end{thebibliography} ссылки \bibitem{gold} и \bibitem{gold-cittert}, то в тексте ссылки будут стоять так:

Метод Голда [5] получен из метода ван Циттерта [4], но с предположением, что действует он только для положительных чисел. Восстанавливает последующему алгоритму
что не есть правильно. Особенно это будет прискорбно в большом документе и совсем грустно - в составленном из нескольких. Единственное исключение из этого правила - некоторые научные журналы (вроде Optics Letters и Optics Express), которые явно требуют вставлять библиографические ссылки в текст статьи в окружении \begin{thebibliography} .... \end{thebibliography} - их системы BiBTeX не переваривают. Обходится это очень просто: создаётся ещё один документ со статьёй, которому указывается библиографическая база данных BiBTeX. Файл компилируется, после чего берётся содержимое файла bbl и вставляется в финальную версию статьи.


Включаем BibTeX
Для этого не нужно особых телодвижений: нужно вбить источники литературы в базу через удобную графическую оболочку Jabref, кинуть на каталог базы симлинк, явно указать в документе использование BibTeX-овской базы и задать в преамбуле стиль библиографии.

Всё по порядку: вбиваем источники литературы в базу при помощи графический оболочки JabRef, копируем в каталог с документом. Теперь симлинк будет указывать на каталог, где находится база - таким образом, множество документов будут использовать одну и ту же базу.

penta4@penta4rce:~/documents/matlab/litobzor$ ls -lh
итого 512K
lrwxrwxrwx 1 penta4 penta4 40 2008-01-02 15:06 biblio -> /home/penta4/matlab/docus/topics/biblio/
-rw-r--r-- 1 penta4 penta4 49K 2007-12-05 11:23 Lit_obzor.pdf
-rw-r--r-- 1 penta4 penta4 208K 2007-12-05 11:23 Lit_obzor.ps
-rw-r--r-- 1 penta4 penta4 9,4K 2007-12-12 17:50 Lit_obzor.tex
...........
Готово, теперь поправим наш документ: вместо окружения \begin{thebibliography} .... \end{thebibliography} используем \bibliography{biblio/my} если ваша база называется my.bib (расширение не указывается). Кроме того, в преамбулу добавляем несортированный стиль библиографии (номера - в порядке упоминания в тексте) \bibliographystyle{unsrt}

Вот как это выглядит всё вместе:


\documentclass[a4paper,12pt,oneside]{article}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{amssymb,amsfonts,amsmath,mathtext,cite,enumerate,float}

\bibliographystyle{unsrt} %Стиль библиографических ссылок БибТеХа


\begin{document}

<.....>

Метод Голда\cite{gold} получен из метода ван Циттерта\cite{gold-cittert},
но с предположением, что действует он только для положительных чисел.
Восстанавливает по следующему алгоритму


<.....>

\newpage 
\bibliography{biblio/my}
\end{document}

Как и обещалось, вы работаете с текстом в ЛаТеХе, как и прежде, только вместо явного прописывания источников литературы вы заставляете этим заниматься ЛаТеХ. Машина работает, вы - отдыхаете. И это правильно.


Несколько замечаний по BiBTeX
Надеюсь, крутизна BiBTeX прочувствована и вы уже с увлечением набиваете свою библиографическую базу. Однако есть пара тонких моментов, которые мне хотелось бы осветить.

Вопрос: А где теперь мои процитированные литературные источники?
Ответ: Они теперь в файле имядокумента.bbl, который можно открыть, посмотреть и при необходимости скопировать в другой документ. В этом примере он выглядит так:

\begin{thebibliography}{1}

\bibitem{lucy}
L.B. Lucy.
\newblock An iteration technique for the rectification of observed
distributions.
\newblock {\em Astronomical Journal}, 79:745--754, 1974.

\bibitem{cittert}
Van~Cittert P.H.
\newblock Zum einfluss der spaltbreite auf die intensittverteilung.
\newblock {\em Spektralinien II, Zeitschrift f\"ur Physik}, 69:298, 1933.

\bibitem{cittert-convergence}
N.R. Hill.
\newblock G.e. ioup.
\newblock {\em J. Opt. Soc. Am.}, 66:487, 1976.

\bibitem{jansson}
E.K.~Plyler P.A.~Jansson, R.H.~Hunt.
\newblock {\em J. Opt. Soc. Am.}, 60:596, 1970.

\bibitem{gold}
R.~GOLD.
\newblock An iterative unfolding method for matrices.
\newblock {\em Tech.Rep. ANL-6984, Argonne National Laboratory, Argonne,
Illinois,}, 1964.

\bibitem{gold-cittert}
{Miroslav Morh\'a\v{c}} and {Vladislav Matou\v{s}ek}.
\newblock Multidimensional fft based positive definite gold deconvolution
algorithm.
\newblock {\em Journal of Electrical Engineering}, Vol. 56, \No. 5-6:141--145,
2005.

\bibitem{holmes}
{T.J.~Holmes}.
\newblock Blind deconvolution of quantum-limited imagery: maximum likelihood
approach.
\newblock {\em J. Opt. Soc. Am. A}, 9:1052--1061, 1992.

\end{thebibliography}

Вопрос: Как переопределить в преамбуле, чтобы список литературы был через точку?
Ответ: Для этого в преамбуле (до \begin{document}) прописываем:
\makeatletter
\bibliographystyle{unsrt}
\renewcommand{\@biblabel}[1]{#1.}
\makeatother
И всё, теперь в списке литературы источники будут идти как 1. 2. ... N.


Вопрос: Можно ли в одном документе использовать не одну базу, а несколько?
Ответ: Да, можно, тогда их имена указываются через запятую без пробелов. Например, так: \bibliography{biblio/my,biblio/filosofy}

В следующем посте приведу пример использования стилей оформления литературы в BiBTeX.

22 комментария:

  1. А как в бибтехе обстоят дела с поддержкой кириллицы? Мне несколько лет назад, когда я набирал диссертацию, пришлось прикручивать кодировку cp1251 к бибтеху самостоятельно.

    Миша.

    ОтветитьУдалить
  2. 2 Миша
    А как в бибтехе обстоят дела с поддержкой кириллицы?
    Превосходно они обстоят, никогда проблем не испытывал.

    Мне несколько лет назад, когда я набирал диссертацию, пришлось прикручивать кодировку cp1251
    У меня КОИ8, и всё работает на ура. Даже не слышал о проблемах с кириллицей.

    ОтветитьУдалить
  3. Из рассмотренных оболочек (jabref,kbibtex,kbib) мне больше всего понравился kbib -- нативное kde приложение, в последних версиях умеет делать поиск по библ. базам журналов и google scholar
    Хотя, конечно, это дело вкуса

    ОтветитьУдалить
  4. 2 unixfun пишет...

    Из рассмотренных оболочек (jabref,kbibtex,kbib) мне больше всего понравился kbib
    Да, но в стейбле его нет, а при сборке он просит поставить кучу библиотек и хидеров :-)

    jabref использую исключительно из инерционных соображений (попробовал - устраивает - ну и ладно :-))

    умеет делать поиск по библ. базам журналов и google scholar
    Обычно нужно просто добавить или найти библиографическую ссылку.

    Хотя, конечно, это дело вкуса
    Кстати, о kbib я не знал. Так что спасибо, что зашли и поделились.

    ОтветитьУдалить
  5. referencer тоже приятная утилита.

    ОтветитьУдалить
  6. А насколько это вобще оправдано. Пока будешь все это настраивать, статью можно написать.

    ОтветитьУдалить
  7. Очень оправданно.
    Для создания bib файлов я пользуюсь каталогизатором Tellico, из категории kde-misc(gentoo). Суть полезной для меня части данного приложения: после прочтения (ознакомления) статьи добавляю её в базу (занимает меньше минуты), добавляю какие-то свои комментарии, если надо. В итоге когда надо обратиться к статье под руками база в достаточно удобном виде с достаточно мощным поиском по ней. А при необходимости командой file->export создаётся bib файл.
    О том, как просто можно вставить его в TeX документ уважаемый virens уже написал.

    Борис

    ОтветитьУдалить
  8. Молодец, что jabref упомянул!

    Недавно его попробовал — классная штука. До этого набирал .bib-файлы вручную. Большая разница.

    ОтветитьУдалить
  9. Только один вопрос: случайно не знаешь способа «подружить» BiBTeX с UTF-8?

    Именно из-за того, что bibtex с utf-8 нормально не работал, мне пришлось набирать в своё время диссер в однобайтной кодироке…

    Может уже починили?

    ОтветитьУдалить
  10. 2 Alexey пишет...
    referencer тоже приятная утилита.
    Спасибо, глянем.

    2 Анонимный пишет...
    А насколько это вобще оправдано.
    Для документов больше 10-15 страниц со ссылками на литературу - BibTeX это стандарт. Иначе сразу в петлю.

    Пока будешь все это настраивать, статью можно написать.
    Так ничего настраивать не нужно. Читаем это до просветления.

    2 Борис пишет...
    Для создания bib файлов я пользуюсь каталогизатором Tellico
    Надо тоже будет посмотреть. А то JabRef со своей явой уже надоедает тормозить :-)

    В итоге когда надо обратиться к статье под руками база в достаточно удобном виде с достаточно мощным поиском по ней.
    Вот они, золотые слова для техоненавистников :-)

    2 sovety пишет...
    Молодец, что jabref упомянул!
    Так я ж им только и пользуюсь. Хотя вот выше в комментариях упоминают другие утилиты. Надо будет их попробовать на досуге.

    До этого набирал .bib-файлы вручную. Большая разница.
    Это сурово :-) Хотя и не намного, но набивать базу в программе быстрее. И куда удобнее.

    Только один вопрос: случайно не знаешь способа «подружить» BiBTeX с UTF-8?
    Не знаю. Я придерживаюсь старой поговорки "не сломалось - не чини". У меня исторически везде КОИ8, и менять пока не собираюсь.

    Может уже починили?
    Дебианщики клялись, что Этч весь в доску ЮТФ8. Скорее всего, в texlive починили. Но я до сих пор сижу в танк.. на tetex и потому не в курсе :-)

    ОтветитьУдалить
  11. В России всё же `\bibliographystyle{gost71s}` :-)

    С UTF-8 там можно сработать — `bibtex8 -B ${DOCNAME}`

    ОтветитьУдалить
  12. 2virens

    Настоятельнейшим образом советую попробовать http://www.citeulike.org. Это место для хранения ссылок в онлайне. Причём не только ссылок но и пдэфок статей. Для импорта и экспорта записей используется бибтексовский формат.
    Очень радует способ добавления статей в базу - переходишь на сайт издателя, выбираешь статью и жмёшь на букмарклет для файрфокса - статья в твоей базе :)

    ОтветитьУдалить
  13. После того как ссылки написаны в BiBTeX формате, есть куча приложений как их можно использрвать. Нароимер для Wordpress-а и для Dokuwiki есть замечательные плагины, которые я использую так http://simon.zambrovski.org/research/

    ОтветитьУдалить
  14. Кажется, gost71u не работает с UTF-8: в bbl-файле получается \BibEmph{Фамилия~[не UTF-8 символ вместо инициалов]}; с KOI8-R все нормально. Может кто-нибудь знает, где взять исправленную версию (желательно под Debian/Ubuntu)?

    Не подскажете, как unsrt заставить печатать "стр." вместо "pages" (в bib-файле pages = {1-101}, language={russian}, но проверки языка в unsrt.bst просто нет)?

    Кстати, а можно ли как-нибудь самостоятельно использовать bibitem? Cкажем, сделать свой маленький независимый список "Рекомендуются для подробного изучения" внутри статьи?

    ОтветитьУдалить
  15. Отвечаю на первый свой вопрос (gost71u не работает с UTF-8) - вот такой патч позволяет работать с UTF-8:
    --- gost71u.bst 2006-01-09 06:33:43.000000000 +0600
    +++ gost71u-utf8.bst 2008-08-03 16:34:40.000000000 +0700
    @@ -525,7 +525,7 @@
    numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
    - "{vv~}{ll}{~jj}{~f.}" format.name$ 't :=
    + "{vv~}{ll}{~jj}{~ff}" format.name$ 't :=
    nameptr #1 >
    {
    nameptr #4 =
    @@ -562,12 +562,12 @@
    numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
    - "{f.}{~vv}{~ll}{, jj}"
    + "{ff}{~vv}{~ll}{, jj}"
    format.name$ 't :=
    nameptr #1 >
    {
    nameptr #4 =

    ОтветитьУдалить
  16. давно в восторге от БибТеха. Единственное, что до сих пор не смог понять - есть ли "обновленные" стандартные типы записей. Лично мне не хватало типов "патент" и "электронный ресурс" - пришлось их под себя самому писать. И, естественно, обозначения элементов я вводил свои, соответственно, поделиться своей базой я уже с коллегами могу только вместе со стилевым файлом.

    Может я заизобретался "велосипедов"?

    ОтветитьУдалить
  17. Есть вопрос, напрямую к БиБТеху не относящемуся.

    Есть ссылка. Одна ссылка.

    Когда пишу в русский журнал, выглядит так:
    Пупкин. Статья. Журнал1.

    А в иностранный:
    Pupkin. Article. Journal1.

    Так вот: как отразить такое. Вести разные базы. И подрубать одну для русских публикаций, а вторую для иностранных? Или можно в БиБТехе сделать title_en, title_ru, а при вставки библиографии флагами задавать, какой вариант использовать???

    ОтветитьУдалить
  18. Начал использовать BibTeX. Для диплома библиография должна быть по ГОСТу. В gost71u нет правил для оформления патентов. Можно ли как-то решить эту проблему (другой стиль, допилить этот)?

    ОтветитьУдалить
  19. может кто встречался со следующей проблемой: в скомпонованном файле меняется порядок авторов статьи. Как с таким бороться? Спасибо.

    ОтветитьУдалить
  20. Доброе время суток! Проблема в следующем:
    1. база данных библиографии набрана в UTF-8 (почти всё кириллица - русский+украинский);
    2. стилевой файл библиографии - gost780uv с одной удалённой литерой "f" для правильного отображения инициалов авторов (база набиралась специально под этот стиль);
    3. при компиляции ЛаТеХ-кода в PDF bibtex добавляет перед длинными тире в библиографии двойные кавычки

    Система - Debian, версия ЛаТеХа - TeX Live 2009/Debian

    ОтветитьУдалить
  21. Спасибо! Часто пользуюсь тем, что выучил на Вашем блоге и часто забываю поблагодарить! Спасибо за Ваш труд!

    ОтветитьУдалить
  22. У меня была проблема с кириллицей при использовании класса G7-32, BiBTex вылетал с ошибкой. Решилось введением параметра language={russian} в bib-файле, тогда в bbl получалось поле \selectlanguageifdefined{russian} и все проходило. Кодировку надо действительно koi8-r.
    Я использую не JabRef, а отличнейшую программу Citavi. Там можно комменты писать к статьям, да и не только. Ставится под wine, у меня осталась с винды подаренная лицензия, но есть и бесплатная, с ограничением на 100 источников, что ИМХО очень много.

    virens, спасибо и будьте здоровы!

    ОтветитьУдалить