Я только что начал использовать biber / biblatex и у меня возникли проблемы с пониманием некоторых его особенностей. Не могу представить, что я первый, кто столкнулся с этой проблемой, но я не смог найти дубликат вопроса.
Я цитирую несколько статей, опубликованных в одном и том же журнале. Чтобы обеспечить единообразие информации о журнале во всех ссылках, я создал отдельную запись в биб-коде, содержащую только информацию о журнале. Затем я делаю перекрестную ссылку на эту запись из записей статей. Пример references.bib
файла:
@article{myjournal,
journaltitle={Journal of Interesting Things},
publisher={Someone}
}
@article{myarticle1,
crossref={myjournal},
title={That thing},
author={Martypants, Susan},
year={2019},
}
@article{myarticle2,
crossref={myjournal},
title={That other thing},
author={Rofessor, Peter},
year={2020}
}
Теперь, когда я цитирую в своем документе и , myarticle1
и myarticle2
, список литературы содержит дополнительную строку без имени, а только информацию о журнале:
Минимальный рабочий пример, который выдает такой результат:
\documentclass{article}
\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{references.bib}
\begin{document}
\cite{myarticle1,myarticle2}
\printbibliography{}
\end{document}
Интересно, что если я цитирую только одну из двух статей, «пустая» статья журнала не появляется. (т.е. замена \cite{myarticle1,myarticle2}
на \cite{myarticle1}
приводит к получению списка литературы из одной статьи вместо трех.)
Обходные решения:Я могу скопировать-вставить информацию о журнале в каждую статью и удалить перекрестную ссылку. Однако, если я позже захочу изменить какую-то информацию о журнале (например, добавить адрес издателя), мне придется просмотреть все записи. В качестве альтернативы я могу удалить запись вручную из файла .bbl
, что также приведет к желаемому результату. Ни одно из этих решений не является для меня полностью удовлетворительным.
Вопрос:Какой предпочтительный способ структурирования статьи .bib
так, чтобы (а) мне не приходилось вводить и поддерживать дублирующуюся информацию о журнале и (б) запись в журнале не отображалась как отдельный элемент в списке литературы, если на нее явно не указано иное?
Спасибо за помощь!
решение1
Поле crossref
касается не только наследования данных. Оно также касается установления определенного отношения родитель-потомок между записями (ср. поле xref
, которое только моделирует это отношение родитель-потомок без наследования данных).
Одной из особенностей этой связи родитель-потомок является то, что родительская запись автоматически добавляется в библиографию, если на нее ссылаются определенное количество дочерних записей (даже если она не цитируется явно). Точное количество дочерних ссылок можно контролировать с помощью параметра mincrossrefs
. Его значение по умолчанию — 2
, что означает, что родительская запись добавляется в библиографию, если на нее ссылаются по крайней мере две (разные) дочерние записи. Это случай в вашем примере: myjournal
ссылается на myarticle1
и myarticle2
.
Одним из способов решения этой проблемы было бы установить mincrossrefs
более высокое (возможно, неоправданно высокое) значение, например, как 999
предложеноМануэль ВайнкауфвКомментарии.
\documentclass{article}
\usepackage[backend=biber, style=alphabetic, mincrossrefs=999]{biblatex}
\begin{filecontents}{\jobname.bib}
@article{myjournal,
journaltitle = {Journal of Interesting Things},
publisher = {Someone},
}
@article{myarticle1,
crossref = {myjournal},
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
crossref = {myjournal},
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
Альтернативой было бы сказать biblatex
, что myjournal
это всего лишь контейнер данных, а не запись, которая могла бы появиться в библиографии сама по себе. Это делается путем добавления options = {dataonly},
к записи. Это не так уж и не похоже наЦикада'sпредложениеoptions={skipbib=true},
, но немного более строгий (так как он также избежит создания меток, что в любом случае здесь не срабатывает, если быть честным). С этим решением myjournal
даже не появляется в библиографии, когда оно цитируется явно.
\documentclass{article}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\begin{filecontents}{\jobname.bib}
@article{myjournal,
journaltitle = {Journal of Interesting Things},
publisher = {Someone},
options = {dataonly},
}
@article{myarticle1,
crossref = {myjournal},
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
crossref = {myjournal},
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
Если вы не хотите устанавливать эту дополнительную связь родитель-потомок, возможно, лучше выбрать другой инструмент для этой работы:Цикадапредлагаемые @xdata
контейнеры вКомментарии.Документацияbiblatex
поясняет xdata
следующим образом (§2.2.3Специальные поля, стр. 31)
Это поле наследует данные из одной или нескольких
@xdata
записей. Концептуальноxdata
поле связано сcrossref
иxref
:crossref
устанавливает логическую связь родитель/потомок и наследует данные;xref
устанавливает как логическую связь родитель/потомок без наследования данных;xdata
наследует данные без установления связи. Значениеxdata
может быть одним ключом записи или отдельным списком ключей. Подробнее см. в §3.13.6.
И это кажется отличным вариантом: xdata
здесь crossref
нет связи между родителями и детьми, которая изначально и вызывала нежелательное поведение.
Однако следует отметить, что @xdata
записи не могут появляться в библиографии сами по себе и не могут быть цитированы с пользой. Более того, наследование полей @crossref
может учитывать типы записей родительских и дочерних записей и может устанавливать правила, например, поле title
родителя @collection
наследуется как booktitle
дочернее @incollection
. Это невозможно (и не имеет смысла) для @xdata
.
\documentclass{article}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\begin{filecontents}{\jobname.bib}
@xdata{myjournal,
journaltitle = {Journal of Interesting Things},
publisher = {Someone},
}
@article{myarticle1,
xdata = {myjournal},
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
xdata = {myjournal},
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
В этом конкретном случае все стандартные стили будут игнорировать publisher
поле для @article
s, поэтому вы наследуете только одно поле, а именно journal(title)
. Наследование по одному полю также можно смоделировать с помощью @string
записей. (Но, конечно, это не вариант, если вы хотите наследовать несколько полей одновременно.)
\documentclass{article}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\begin{filecontents}{\jobname.bib}
@string{myjournal = {Journal of Interesting Things}}
@article{myarticle1,
journal = myjournal,
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
journal = myjournal,
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
Все опубликованные примеры производят
решение2
Комментарий Мануэля Вайнкауфа действительно был решением:
\usepackage[backend=biber,style=alphabetic,mincrossrefs=99]{biblatex}
Я добавляю это как ответ, чтобы вопрос можно было закрыть.