Для моего списка публикаций я хочу создать несколько библиографий, которые автоматически различаются по статусу публикации. Для статуса публикации я использую поле pubstate
и по keywords= {own}
полю я отметил их в моей базе данных библиографии как мои собственные публикации (сюрприз, да?). Библиографии ограничены моими собственными публикациями с помощью опций keyword = own
.
Так как функции фильтра biblatex
работают только с некоторыми конкретными полями, среди которых pubstate
нет, я хочу сопоставить содержимое поля pubstate
с keywords
полем с помощью \DeclareSourcemap
команды. Оттуда я мог бы отфильтровать библиографию в соответствии с этим полем. К сожалению, независимо от того, использую я опцию append
или \DeclareSourcemap
нет, кажется, что в поле, которое не пустое, ничего не записано. Если вместо этого я попытаюсь сопоставить с пустым полем (закомментировать строку, начинающуюся с , fieldset=keywords
и раскомментировать строку ниже), то поле впоследствии будет содержать желаемое значение.
\begin{filecontents}{\jobname.bib}
@article{inpress,
author = {A. Uthor},
title = {Yay, they accepted my article},
keywords = {own},
pubstate = {inpress},
year = {2014},
journal = {Journal of Universal Acceptance}
}
@article{submitted,
author = {A. Uthor},
title = {Look, I've written a nice manuscript, would you publish it? Pleeease?},
keywords = {own},
pubstate = {submitted},
year = {2014},
journal = {Journal of Doubtful Acceptance}
}
\end{filecontents}
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{\jobname.bib}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=pubstate, match={inpress},
fieldset=keywords, fieldvalue={inpress}, append]
% fieldset=note, fieldvalue={inpress}, append]
}
}
}
\listfiles
\begin{document}
\nocite{*}
\printbibliography[keyword=inpress, title = {Articles in press}]
\printbibliography[keyword=own, title = {Submitted articles}]
\end{document}
Конечно, я мог бы сделать это вручную разными способами, но мне хотелось бы понять, почему это не работает так, как я ожидаю.
решение1
Проблема в том, что нужно указать overwrite
на карте. Попробуйте это:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\step[fieldsource=pubstate, match={inpress},
fieldset=keywords, fieldvalue={inpress}, append]
% fieldset=note, fieldvalue={inpress}, append]
}
}
}
НО, вам также нужно добавить comma
разделители ключевых слов, потому что приведенный выше код создает owninpress
.
Возможно, вам пригодится следующий код. Он добавляет все pubstate
в keywords
поле.
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\step[fieldsource=pubstate,final]
\step[fieldset=keywords, fieldvalue={,}, append]
\step[fieldset=keywords, origfieldval, append]
}
}
}
Приведенный выше код содержит ключевые слова: own, inpress
и own, submitted
.
решение2
Это не решение вопроса, а решение проблемы. Вместо добавления inpress
ключевого слова в keyword
поле biblatex можно определить новый bibcheck и использовать check
опцию \printbibliography
.
\defbibcheck{inpress}{
\iffieldequalstr{pubstate}{inpress}{}{\skipentry}
}
а потом
\printbibliography[check=inpress]