Как сопоставить значения с непустым полем с помощью \DeclareSourcemap

Как сопоставить значения с непустым полем с помощью \DeclareSourcemap

Для моего списка публикаций я хочу создать несколько библиографий, которые автоматически различаются по статусу публикации. Для статуса публикации я использую поле 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]

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