
Я пытаюсь использовать biblatex для создания двух разных библиографий. Первая должна содержать только мои статьи, отсортированные в порядке появления в тексте и с каким-то специальным префиксом. Вторая библиография должна содержать общие ссылки, отсортированные в каком-то другом порядке (например, имя-название-год), и без какого-либо специального префикса.
Обратите внимание, что две библиографии НЕ ПЕРЕСЕКАЮТСЯ (т.е. не имеют общих записей).
Я использую этот MTW:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{ref.bib}
@ARTICLE{Pub1,
author = {A. R},
title = {My best paper},
year = {2013},
journal = C,
keywords = {publication}
}
@ARTICLE{Pub2,
author = {A. R},
title = {My second best paper},
year = {2013},
journal = C,
keywords = {publication}
}
@ARTICLE{Nopub1,
author = {A. R},
title = {Not my paper 1},
year = {2012},
journal = I,
keywords = {general}
}
@ARTICLE{Nopub2,
author = {A. R},
title = {Not my paper 2},
year = {2012},
journal = I,
keywords = {general}
}
\end{filecontents}
\usepackage[style=numeric, sorting=none, defernumbers=true, backend=biber]{biblatex}
\addbibresource{ref.bib}
\pagestyle{empty}
\begin{document}
This is my first publication : \cite{Pub1}
These are not my publications: \cite{Nopub1,Nopub2}
This is my second publication: \cite{Pub2}
\printbibliography[keyword=publication, prefixnumbers=R, title=My papers]
\begin{refcontext}[sorting=nty]
\printbibliography[notkeyword=publication, prefixnumbers=, title=Not my papers]
\end{refcontext}
\end{document}
ВЫХОД (после pdflatex + biber + pdflatex + pdflatex):
Обе библиографии напечатаны правильно и хорошо упорядочены, но текстовые цитаты, ссылающиеся на вторую библиографию, неверны (все они [0]). Я пытался проверить другие связанные посты, но никто не упомянул об этой конкретной проблеме.
Спасибо!
решение1
Я не думаю, что в настоящее время есть хорошее решение. Но я попытаюсь объяснить некоторые предпосылки. В вашем примере желаемый вывод выглядит очевидным, поскольку ваши две библиографии не пересекаются. Но это не обязательно так. В разных рефконтекстах записи могут повторяться. Давайте посмотрим, что произойдет, если вы удалите фильтры:
\documentclass{article}
\usepackage[style=numeric, sorting=none, backend=biber]{biblatex}
\addbibresource{ref.bib}
\pagestyle{empty}
\begin{document}
This is my first publication : \cite{Pub1}
These are not my publications: \cite{Nopub1,Nopub2}
This is my second publication: \cite{Pub2}
\printbibliography[title=Not my papers]
\newrefcontext[sorting=nty]
This is my first publication: \cite{Pub1}
These are not my publications: \cite{Nopub1,Nopub2}
This is my second publication: \cite{Pub2}
\printbibliography[prefixnumbers=R,title=My papers]
\end{document}
Как вы видите, у каждого bibentry есть две метки, и biblatex должен выбрать, какую из них использовать. Разумно, что для первого блока цитат используются метки из первого (по умолчанию) refcontext, а для второго блока — метки из второго блока.
Это объясняет, почему вы получаете нули: в первом блоке у cites нет метки, и у biblatex нет шансов догадаться, что вы хотите использовать метку из другого рефконтекста в качестве запасного варианта — в конце концов, подходящих меток может быть несколько.
Метка, которую biblatex будет использовать для цитирования, зависит от текущего значения \blx@refcontext@sorting
. Таким образом, вы можете локально заставить biblatex использовать метки из другого refcontext, выполнив
{
\makeatletter\def\blx@refcontext@sorting{nty}
These are not my publications: \cite{Nopub1,Nopub2}
}
Тогда у вас может получиться что-то вроде этого:
Но это решение не будет работать для смешанных сайтов, таких как \cite{Nopub1,pub1}
. И "логическое" решение
\AtEveryCitekey{\ifkeyword{puplication}{}{\def\blx@refcontext@sorting{nty}}}
тоже не работает, так как код для refcontext выполняется до того, как \AtEveryCitekey сможет сработать. Так что, вероятно, вам придется сделать запрос на функцию ...
Редактировать
Вы можете попробовать это. Но будьте осторожны: это хак, и вполне возможно, что он запутает biblatex. Поэтому тестируйте и проверяйте тщательно с большим количеством данных.
\documentclass{article}
\usepackage[style=numeric, sorting=none, defernumbers, backend=biber]{biblatex}
\addbibresource{ref.bib}
\pagestyle{empty}
\makeatletter
\AtEveryCitekey{\ifkeyword{publication}{}{\def\blx@refcontext@sorting{nty}%
\csname blx@data@\the \c@refsection @\blx@refcontext@sorting @\abx@field@entrykey\endcsname}}
\makeatother
\begin{document}
This is my first publication : \cite{Pub1}
These are not my publications: \cite{Nopub1,Nopub2}
This is my second publication: \cite{Pub2}
\printbibliography[keyword=publication, prefixnumbers=R, title=My papers]
\begin{refcontext}[sorting=nty]
\printbibliography[notkeyword=publication, prefixnumbers=, title=Not my papers]
\end{refcontext}
\end{document}
решение2
Для таких случаев были введены рефконтексты — команды цитирования в рефконтекстах разделяют контекст, поэтому поместите ссылку «Это не мои публикации:» в тот же рефконтекст.
\assignrefcontextentries[sorting=nty]{Nopub1,Nopub2}
\begin{document}
This is my first publication: \cite{Pub1}
These are not my publications: \cite{Nopub1,Nopub2}
This is my second publication: \cite{Pub2}
\printbibliography[keyword=publication, prefixnumbers=R, title=My papers]
\begin{refcontext}[sorting=nty]
\printbibliography[notkeyword=publication, title=Not my papers]
\end{refcontext}
\end{document}
Для этого требуется biblatex 3.3
решение3
Проблема возникает из-за использования другого refcontext
. Если вы удалите refcontext
окружение вокруг второго printbibliography
, вы получите желаемый результат.