Como suprimir o campo de anotação do arquivo .bbl no biblatex

Como suprimir o campo de anotação do arquivo .bbl no biblatex

Gostaria de suprimir o campo de anotação do arquivo .bbl usando biblatex. Costumo usar o campo de anotação para fazer anotações sobre um determinado artigo, o que pode ser um problema se eu usar um comando LaTeX como % no campo de anotação. Ter algo como% no campo de anotação não causa problemas no arquivo .bib, mas tê-lo no arquivo .bbl causa falha na compilação. Tentei seguir as sugestões emÉ possível suprimir um campo específico do bibtex .bbl no biblatex?, mas isso não funcionou para mim.

Aqui está meu exemplo mínimo de trabalho:

\documentclass[12pt]{article}

\usepackage{biblatex}

\begin{filecontents*}{mwe.bib}
@article{Doe.J-1979a,
    Annote = {10 % strain},
    Author = {John Doe},
    Date-Added = {2020-08-27 10:54:17 -0600},
    Date-Modified = {2020-08-27 12:03:22 -0600},
    Journal = {Journal of LaTeX Issues},
    Title = {Problematic Reference Title},
    Year = {1979}}
\end{filecontents*}

\addbibresource{mwe.bib}

\AtEveryBibitem{\clearfield{annotation}}

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldset=annotation, null]
    }
  }
}

\begin{document}
\textcite{Doe.J-1979a}
\printbibliography
\end{document}

Isso cria o seguinte arquivo .bbl

\begingroup
\makeatletter
\@ifundefined{[email protected]}
  {\@latex@error
     {Missing 'biblatex' package}
     {The bibliography requires the 'biblatex' package.}
      \aftergroup\endinput}
  {}
\endgroup


\refsection{0}
  \datalist[entry]{nty/global//global/global}
    \entry{Doe.J-1979a}{article}{}
      \name{author}{1}{}{%
        {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{%
           family={Doe},
           familyi={D\bibinitperiod},
           given={John},
           giveni={J\bibinitperiod}}}%
      }
      \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{bibnamehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{authorbibnamehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{authornamehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{authorfullhash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \field{sortinit}{D}
      \field{sortinithash}{2ef1bd9a78cc71eb74d7231c635177b8}
      \field{labelnamesource}{author}
      \field{labeltitlesource}{title}
      \field{annotation}{10 % strain}
      \field{journaltitle}{Journal of LaTeX Issues}
      \field{title}{Problematic Reference Title}
      \field{year}{1979}
    \endentry
  \enddatalist
\endrefsection
\endinput

Como você pode ver, isso %bagunça o colchete de fechamento em \field{annotation}{10 % strain}.

Responder1

No MWE, o .bibarquivo contém o campo annote, mas no mapa de origem, a etapa especifica annotationcomo um campo. Portanto, se no mapa de origem substituirmos annotationpelo annotecampo que contém %será anulado e não aparecerá no bblarquivo. Assim, a \DeclareSourcemapinstrução deve ser semelhante a:

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldset=annote, null]
    }
  }
} 

Responder2

Guidojá deu oresponder: você precisa excluir o annotecampo em seu mapa de origem. Mas pode ser interessante saber porquê.

biblatextem alguns aliases de campo e tipo configurados para compatibilidade retroativa com alguns estilos populares do BibTeX. Uma dessas relações de alias transforma o annotecampo em annotation. Com Biber esta relação de alias é implementada através de um especialmapa de origem do driverdefinido em biblatex.def(tudo. 1305-1337 na v3.15a)

\DeclareDriverSourcemap[datatype=bibtex]{
  <...>
  \map{
    \step[fieldsource=hyphenation,   fieldtarget=langid]
    \step[fieldsource=address,       fieldtarget=location]
    \step[fieldsource=school,        fieldtarget=institution]
    \step[fieldsource=annote,        fieldtarget=annotation]
    \step[fieldsource=archiveprefix, fieldtarget=eprinttype]
    \step[fieldsource=journal,       fieldtarget=journaltitle]
    \step[fieldsource=primaryclass,  fieldtarget=eprintclass]
    \step[fieldsource=key,           fieldtarget=sortkey]
    \step[fieldsource=pdf,           fieldtarget=file]
  }
}

Isso apenas diz para transformar todas annoteas descobertas de Biber em arquivos annotation. Na verdade, você poderia dizer isso internamente, pois biblatexexiste apenas annotatione nenhum annotecampo. Portanto, é natural escrever todo o código mencionando apenas annotatione não annote.

O problema que você encontrou foi o tempo: este mapa de origem do driver é executadodepoisseu nível de usuário simples \DeclareSourcemap. Em particular, quando o seu mapa de origem é executado, nenhum nome de campo foi renomeado ainda e o campo ainda é chamado annote.

Uma maneira de resolver o problema é mostrada na resposta do Guido: Exclua o annotecampo, pois é assim que ele ainda é chamado quando seu mapa de origem é executado. Você pode ou não querer excluir annotationtambém

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldset=annote,     null]
      \step[fieldset=annotation, null]
    }
  }
}

Uma outra maneira de contornar o problema é executar o annote-> annotationmapeamento já em seu mapa de origem: então você primeiro mapeia todos annoteos s para annotatione depois exclui o annotation.

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=annote,  fieldtarget=annotation]
      \step[fieldset=annotation, null]
    }
  }
}

Observe que em qualquer caso \AtEveryBibitem{\clearfield{annotation}}não vai ajudar porque o erro que você obtém %já ocorre quando os dados de entrada são lidos do .bblarquivo e não quando o campo é/poderia ser impresso na bibliografia. Além do mais, os biblatexestilos padrão (exceto reading) não são exibidos annotationde qualquer maneira, então \clearfieldnão fariam nada de útil no MWE.

Responder3

Adicione annotation=falseàs configurações, por exemplo:\usepackage[style=apa,annotation=false]{biblatex}

informação relacionada