
Я хотел бы отключить поле аннотации из файла .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
уже в вашей исходной карте: сначала вы отображаете все annote
s в 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}