カスタム Biblatex スタイルで bibstrings をサポートするフィールドを宣言する正しい方法

カスタム Biblatex スタイルで bibstrings をサポートするフィールドを宣言する正しい方法

問題

私はカスタムの biblatex スタイルを作成しており、month一般的な実装のフィールドにあるものと同様の bibstrings のサポートを望んでいました。つまり、何かを括弧 で囲むと、{something}コンテンツ がsomethingフィールドにレンダリングされます。ただし、括弧のないものは bibstring として解釈され、その定義に変換されます。

フィールドの内容が bibstring であるかどうかを\ifbibstring(および仲間) でチェックすることで、これを部分的に達成できます。ただし、これは内容が常に括弧内にある場合にのみ機能します。そうでない場合、biber はエラーを返し、フィールドをそれ以上の処理に渡しません。

例えば、以下のコードは警告メッセージを生成します。

警告 - BibTeX サブシステム: /tmp/M3YJZ8wGD7/mwe.bib_28410.utf8、行 21、警告: 未定義のマクロ "mytitle"

そして、biberはファイルにそのフィールドを作成しません.bbl。同様のエラーが見つかりましたbiblatex/biber: 1 つのファイルの文字列マクロを複数の参照セクションで使用するしかし、それは私の問題を解決しません。

ムウェ

これは私の問題を説明するための最小限の実装です。

% !BIB program = biber
\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
  @test{test1,
    title = {A},
    year = {1995},
  }

  @test{test2,
    title = {B},
    year = {1994},
  }

  @test{test3,
    title = {mytitle},
    year = {1998},
  } 

  @test{test4,
    title = mytitle,
    year = {1998},

  }
\end{filecontents}

\begin{filecontents}{test.dbx}
  \DeclareDatamodelFields[type=field, datatype=literal]{title}

  \DeclareDatamodelFields[type=field, datatype=datepart]{year}

  \DeclareDatamodelEntryfields[test]{%
    year,%
    title%
  }
\end{filecontents}

\begin{filecontents}{english-test.lbx}
  \InheritBibliographyExtras{english}

  % Bibliography strings
  \NewBibliographyString{mytitle}

  \DeclareBibliographyStrings{%
    inherit = {american},
    mytitle = {{my title}{my title}},
  }
\end{filecontents}

\begin{filecontents}{test.bbx}
  \RequireBibliographyStyle{standard}

  % map language
  \DeclareLanguageMapping{english}{english-test}

  % Dummy driver for testing
  \DeclareBibliographyDriver{test}{%
    \usebibmacro{begentry}%
    \printfield{title}%
    \newunit%
    \printfield{year}%
    \newunit%
    \usebibmacro{finentry}%
  }

  \DeclareFieldFormat[test]{title}{%
    \ifbibstring{#1}{\bibstring{#1}}{#1}%
  }
\end{filecontents}

\usepackage[backend=biber, bibstyle=test]{biblatex}
\addbibresource{\jobname.bib}


\begin{document}

  \nocite{*}
  \printbibliography

\end{document}

現在の出力:

ここに画像の説明を入力してください

期待される出力:

ここに画像の説明を入力してください

質問

のような bibstrings でも同じ動作が期待されることに注意してください。 のエントリの場合のように、括弧monthのないフィールドがある場合、bibstring の定義を使用して変換する必要があります。ただし、 のように括弧付きの同じ定義がある場合、代わりにコンテンツが印刷される必要があります。test4.bibtest3

カスタム スタイルでこれを実現するにはどうすればよいでしょうか?

答え1

ここでは少なくとも 2 つの「文字列」の概念があります。どちらも単独では必要な機能を果たしません。2 つを組み合わせることによってのみ、必要な機能を果たすことができます。

@strings

まず、 があります@string。これは、毎回テキスト全体を再入力することなく、@string同じテキストを複数のエントリに挿入する方法です。この機能は完全にファイル レベルで動作します。.bib.bib

エントリ@stringには ID (通常の.bibエントリのエントリ キーと同じ) があり、その名前で呼び出すことができます。

@string{brontostring = {On the Theory of Brontosauruses}}

@string文字列IDをフィールド値として与えることで、aの内容を使用できます。それなし中括弧。

@book{foo,
  author = {Anne Elk},
  title  = brontostring,
  date   = {1970},
}

Biber (または BibTeX) は、.bibファイルを読むときにこれらの文字列を即座に解決します。1 つの注意点は、@stringは使用する前に定義する必要があることです。特に、括弧なしで任意のテキストを使用することはできず、既知の のみが@string機能します。次に、

@book{foo,
  author = {Anne Elk},
  title  = {On the Theory of Brontosauruses},
  date   = {1970},
}

エントリをさらに処理すると、テキストが に由来することを示す表示は残りません@string

これにより、エントリに任意のテキストを挿入できるようになります。テキストは では変更できませんが、同じ文字列に対して異なる定義を持つbiblatex異なるファイルをロードすることで変更できます。これがおよびで行われることです。 をロードすると、短縮されたジャーナル名を取得するか、完全なジャーナル名を取得します。.bibieeetranIEEEabrv.bibIEEEfull.bibIEEEabbrv.bibIEEEfull.bib

事実上、月文字列も同様に機能します。 は、、などjanです。@string1feb2

@string.bibフィールド値として使用する場合、ファイル内で中括弧は使用しません。

参考文献の文字列

次に、まったく関係のない 2 番目の「文字列」の概念、つまり bibstring があります。これらは、、および で参照するものです\ifbibstring。bibstring\bibstringはのローカリゼーション機能\NewBibliographyStringの一部でありbiblatex、特定の用語を他の言語に翻訳できます。通常、これらは ファイルで定義されます.lbxが、その値はプリアンブルで上書きすることもできます。

bibstrings は で使用できます。\bibstring{<bibstringid>}ここで<bibstringid>は で定義された bibstring の名前です\NewBibliographyString。理想的には はファイル<bibstringid>内で値も受け取っています.lbxが、そうでない場合は は<bibstringid>太字で印刷されます。

日付の処理全体ははるかに複雑ですが、この回答では、には 1 を に、2 をなどにマップするbiblatexという関数があると想定できます。が呼び出されると、となり、アクティブな言語が英語の場合は「July」がドキュメントに印刷され、アクティブな言語がドイツ語の場合は「Juli」がドキュメントに印刷されます。\mkbibmonth\bibstring{january}\bibstring{february}\mkbibmonth{7}\bibstring{july}

bibstringsのより単純でより典型的な例はフィールドですpubstate。フィールドのフォーマットpubstate

\DeclareFieldFormat{pubstate}{\ifbibstring{#1}{\bibstring{#1}}{#1}}

フィールドに使用できる定義済みの文字列がいくつかありますpubstate。たとえば inpress、、などです。これらのいずれかを使用する場合、forthcomingつまりsubmitted

pubstate = {inpress},

エントリの 1 つに「inpress」と.bib入力すると、biblatexドキュメントに「inpress」は印刷されず、代わりに bibstring で指定されたその用語の翻訳が使用されます。(もちろん、biblatex他の bibstring も使用して問題pubstate = {january}なく動作します。) その名前の bibstring がない場合、フィールドはそのまま印刷されるため、pubstate = {foonostring}単に「foonostring」が印刷されます。

bibstringsファイル内の入力には.bib常に中括弧が含まれます。

2つの文字列タイプの比較

私の知る限り、@stringsと bibstrings の組み合わせでbiblatexまったく同じように機能するものは他にありません。 month は@string下位互換性の理由からのみ実装されたのではないかと強く疑っています。

これまで見てきたように、コンテキスト依存の出力を作成するには、一般的に 2 つの方法があります。

  1. @stringバックエンドによって解決される
  2. .lbx)bibstringsはbiblatex

どちらがより適切かは、使用例によって異なります。 は @string、入力の手間を省きたい場合や、複数の入力形式 (長いジャーナル名と短いジャーナル名) を切り替える方法が必要な場合に適しています。 一般に、@stringは言語やロケールに結び付けられていません。 真のローカリゼーションが必要な場合は、 Bibstrings が最適です。

あなたの質問の例からは、どちらのアプローチがあなたのユースケースでより有用であるかは、はっきりと分かりません。

ご希望のものを入手できますか?

質問で説明したスキームにこだわるのであれば、2 つのアプローチを組み合わせることでほぼ可能です。特に良いアイデアだとは思いませんが、やってみましょう。

中括弧のない可能な値ごとに、@string置換テキストを使用して を定義する必要があります。移植可能なソリューションが必要な場合は、.bibすべてのプロジェクトに読み込む必要がある特別なファイルでこれを行う必要があります。

@string{bracelessa = {bracelessa}}
@string{bracelessb = {bracelessb}}

次に、ビブストリングを作りますbracelessabracelessbbiblatex

\NewBibliographyString{bracelessa}
\NewBibliographyString{bracelessb}

そしてそれらを定義する

\DeclareBibliographyStrings{%
  inherit = {american},
  bracelessa = {{A title}{A t\addddot}},
  bracelessb = {{B title}{B t\addddot}},
}

次にフィールドフォーマットを使用します

\DeclareFieldFormat[test]{title}{\ifbibstring{#1}{\bibstring{#1}}{#1}}

問題の分野について。

title = bracelessa,

文書に「タイトル」が印刷されます。

なぜそれがあなたが説明した通りの結果にならないのですか?

まず、括弧なしの入力は任意ではありません。@stringと適切な の両方を定義する必要がありますbibstring。次に、title = {something}は常に をレンダリングするわけではありませんsomething。 'A title' と書くと、title = {bracelessa}代わりに が表示されます。 bibstrings にもっとばかげた名前を選択すれば衝突は起こりにくくなりますが、フィールド値が直接指定されたのか を介して指定されたのかを調べる方法がないため、衝突は常に起こり得ます@string

関連情報