Cómo asignar valores a un campo no vacío usando \DeclareSourcemap

Cómo asignar valores a un campo no vacío usando \DeclareSourcemap

Para mi lista de publicaciones quiero generar varias bibliografías que se discriminen automáticamente por el estado de publicación. Para el estado de publicación utilizo el pubstatecampo y por keywords= {own}campo las he marcado en mi base de datos de bibliografía como publicaciones propias (sorpresa, ¿eh?). Las bibliografías están restringidas a mis propias publicaciones por las keyword = ownopciones.

Como las funciones de filtro biblatexsolo funcionan en algunos campos específicos que pubstateno están entre ellos, quiero asignar el contenido del pubstatecampo al keywordscampo mediante el \DeclareSourcemapcomando. Desde allí podría filtrar la bibliografía según ese campo. Desafortunadamente, no importa si uso la appendopción de \DeclareSourcemapo no, parece que no hay nada escrito en un campo que no esté vacío. Si, en cambio, intento asignarlo a un campo vacío (comentar la línea que comienza fieldset=keywordsy descomentar la línea a continuación), entonces el campo contiene el valor deseado después.

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

Por supuesto, podría hacer esto manualmente de diferentes maneras, pero me gustaría entender por qué no funciona como esperaba.

Respuesta1

El problema es que hay que especificarlo overwriteen el mapa. Prueba esto:

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

PERO, también debe agregar las commaque separan las palabras clave, porque el código anterior crea owninpress.

Es posible que el siguiente código le resulte útil. Agrega todo lo que hay pubstateen el keywordscampo.

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

El código anterior incluye las palabras clave: own, inpressy own, submitted.

Respuesta2

Ésta no es una solución a la pregunta, sino al problema. En lugar de agregar la inpresspalabra clave al keywordcampo biblatex, se puede definir un nuevo bibcheck y usar la checkopción de \printbibliography.

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

y luego

\printbibliography[check=inpress]

información relacionada