biblatex の .bbl ファイルから注釈フィールドを抑制する方法

biblatex の .bbl ファイルから注釈フィールドを抑制する方法

biblatex を使用して .bbl ファイルから注釈フィールドを抑制したいと思います。私は、特定の論文に関するメモを書き留めるために注釈フィールドをよく使用しますが、注釈フィールドで % などの LaTeX コマンドを使用すると問題が発生することがあります。注釈フィールドに % のようなものがあっても、.bib ファイルでは問題は発生しませんが、.bbl ファイルではコンパイルに失敗します。biblatex の bibtex .bbl から特定のフィールドを抑制することは可能ですか?しかし、これらは私には効果がありませんでした。

以下に私の最小限の動作例を示します。

\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。しかし、その理由を知ることは興味深いかもしれません。

biblatexには、いくつかの一般的なBibTeXスタイルとの下位互換性のために、フィールドと型のエイリアスが設定されています。そのようなエイリアス関係の1つは、フィールドannoteを に変換しますannotation。Biberでは、このエイリアス関係は特別なドライバーソースマップbiblatex.def(で定義されるv3.15a の ll. 1305-1337

\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これは、すべてのBiber が を見つける を に変換することを意味しています。実際、 の内部ではのみが存在し、フィールドは存在しないannotationと言えます。したがって、 のみに言及し、 は言及しないすべてのコードを記述するのが自然です。biblatexannotationannoteannotationannote

遭遇した問題はタイミングでした: このドライバーソースマップは実行されますユーザーレベルの単純な\DeclareSourcemap。特に、ソースマップが実行されると、フィールド名はまだ変更されておらず、フィールドは と呼ばれ続けますannote

問題を解決する方法の1つは、Guidoの回答に示されています。ソースマップが実行されたときにまだ呼び出されているフィールドを削除します。削除することもannote、削除しないこともできます。annotation

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

この問題を回避するもう 1 つの方法は、ソースマップ内にすでにあるannote->マッピングを実行することです。つまり、最初にすべての を にマッピングし、次に を削除します。annotationannoteannotationannotation

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

いずれの場合も は\AtEveryBibitem{\clearfield{annotation}}役に立たないことに注意してください。 から取得するエラーは、%エントリ データがファイルから読み取られるときに既に発生しており.bbl、フィールドが参考文献に印刷されるときや印刷される可能性があるときには発生していないためです。 さらに、標準biblatexスタイル ( を除くreading) はいずれにしても表示されないannotationため、 は\clearfieldMWE で何の役にも立ちません。

答え3

annotation=false設定に追加します。例:\usepackage[style=apa,annotation=false]{biblatex}

関連情報