Como mapear valores em um campo não vazio usando \DeclareSourcemap

Como mapear valores em um campo não vazio usando \DeclareSourcemap

Para minha lista de publicações quero gerar diversas bibliografias que sejam automaticamente discriminadas pelo estado de publicação. Para o estado da publicação utilizo o pubstatecampo e pelo keywords= {own}campo marquei-os na minha base de dados bibliográficos como publicações próprias (surpresa, né?). As bibliografias ficam restritas às minhas próprias publicações pelas keyword = ownopções.

Como as funções de filtro biblatexfuncionam apenas em alguns campos específicos onde pubstatenão está entre elas, quero mapear o conteúdo do pubstatecampo para o keywordscampo por meio do \DeclareSourcemapcomando. A partir daí pude filtrar a bibliografia de acordo com esse campo. Infelizmente, não importa se eu uso ou não a appendopção \DeclareSourcemap, parece que não há nada escrito em um campo que não esteja vazio. Se, em vez disso, eu tentar mapear para um campo vazio (comente a linha que começa fieldset=keywordse descomente a linha abaixo), o campo conterá o valor desejado posteriormente.

\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}

É claro que eu poderia fazer isso manualmente de diferentes maneiras, mas gostaria de entender por que não funciona como espero.

Responder1

O problema é que você precisa especificar overwriteno mapa. Experimente isto:

\DeclareSourcemap{
    \maps[datatype=bibtex]{
        \map[overwrite]{
            \step[fieldsource=pubstate, match={inpress},
                fieldset=keywords, fieldvalue={inpress}, append]
%               fieldset=note, fieldvalue={inpress}, append]
        }
    }
}

MAS, você também precisa adicionar o commaque separa as palavras-chave, porque o código acima faz owninpress.

É possível que o código abaixo seja útil para você. Ele anexa tudo pubstateno keywordscampo.

\DeclareSourcemap{
    \maps[datatype=bibtex]{
        \map[overwrite]{
            \step[fieldsource=pubstate,final]
            \step[fieldset=keywords, fieldvalue={,}, append]
            \step[fieldset=keywords, origfieldval, append]
        }
    }
}

O código acima é composto pelas palavras-chave: own, inpresse own, submitted.

Responder2

Esta não é uma solução para a questão, mas para o problema. Em vez de adicionar a inpresspalavra-chave ao keywordcampo biblatex, pode-se definir um novo bibcheck e usar a checkopção \printbibliography.

\defbibcheck{inpress}{
  \iffieldequalstr{pubstate}{inpress}{}{\skipentry}
}  

e então

\printbibliography[check=inpress]

informação relacionada