Нежелательный элемент в списке ссылок при использовании crossref с biber

Нежелательный элемент в списке ссылок при использовании crossref с biber

Я только что начал использовать 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поле для @articles, поэтому вы наследуете только одно поле, а именно 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}

Все опубликованные примеры производят

[19 марта] Сьюзан Мартипэнтс. «Та штука». В: Журнал интересных вещей (2019).//[Rof20] Питер Рофессор. «Та другая штука». В: Журнал интересных вещей (2020).

решение2

Комментарий Мануэля Вайнкауфа действительно был решением:

\usepackage[backend=biber,style=alphabetic,mincrossrefs=99]{biblatex}

Я добавляю это как ответ, чтобы вопрос можно было закрыть.

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