Как отключить поле аннотации из файла .bbl в biblatex

Как отключить поле аннотации из файла .bbl в biblatex

Я хотел бы отключить поле аннотации из файла .bbl с помощью biblatex. Я часто использую поле аннотации, чтобы записывать заметки о данной статье, что может быть проблемой, если я случайно использую команду LaTeX, например % в поле аннотации. Наличие чего-то вроде % в поле аннотации не вызывает никаких проблем в файле .bib, но наличие его в файле .bbl приводит к сбою компиляции. Я попытался следовать рекомендациям вМожно ли отключить определенное поле из bibtex .bbl в biblatex?, но мне они не помогли.

Вот мой минимальный рабочий пример:

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

Это создает следующий файл .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

Как вы можете видеть, %закрывающая скобка в \field{annotation}{10 % strain}.

решение1

В MWE .bibфайл содержит поле annote, но в исходной карте шаг указан annotationкак поле. Следовательно, если в исходной карте заменить annotationна annoteполе , содержащее %будет аннулировано и не появится в bblфайле. Соответственно, \DeclareSourcemapинструкция должна выглядеть так:

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

решение2

Гвидоуже далотвечать: Вам нужно удалить annoteполе в вашей sourcemap. Но может быть интересно узнать, почему.

biblatexимеет некоторые псевдонимы полей и типов, настроенные для обратной совместимости с некоторыми популярными стилями BibTeX. Одно такое отношение псевдонимов превращает поле annoteв annotation. С Biber это отношение псевдонимов реализуется через специальныйисходная карта драйвераопределено вbiblatex.def (1305-1337 в т.3.15а)

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

Это просто говорит превратить все, annoteчто находит Бибер, в annotation. Действительно, можно сказать, что внутренне для biblatexесть только annotationи нет annoteполя. Поэтому естественно писать весь код, упоминая только annotationи не annote.

Проблема, с которой вы столкнулись, была связана с синхронизацией: эта исходная карта драйвера выполняетсяпослеваш пользовательский уровень simple \DeclareSourcemap. В частности, когда выполняется ваша sourcemap, имена полей еще не переименованы, и поле все еще называется annote.

Один из способов решения проблемы показан в ответе Гвидо: Удалите поле annote, так как оно все еще называется, когда выполняется ваша sourcemap. Вы можете захотеть удалить или не захотеть annotationтакже

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

Еще один способ обойти эту проблему — выполнить отображение annote-> annotationуже в вашей исходной карте: сначала вы отображаете все annotes в annotation, а затем удаляете annotation.

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

Обратите внимание, что в любом случае это \AtEveryBibitem{\clearfield{annotation}}не поможет, поскольку ошибка, которую вы получаете от , %уже происходит, когда данные записи считываются из .bblфайла, а не когда поле печатается/может быть напечатано в библиографии. Более того, стандартные biblatexстили (за исключением reading) в любом случае не отображаются annotation, поэтому \clearfieldне сделает ничего полезного в MWE.

решение3

Добавьте annotation=falseв настройки, например:\usepackage[style=apa,annotation=false]{biblatex}

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