
問題
私はカスタムの 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
.bib
test3
カスタム スタイルでこれを実現するにはどうすればよいでしょうか?
答え1
ここでは少なくとも 2 つの「文字列」の概念があります。どちらも単独では必要な機能を果たしません。2 つを組み合わせることによってのみ、必要な機能を果たすことができます。
@string
s
まず、 があります@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
異なるファイルをロードすることで変更できます。これがおよびで行われることです。 をロードすると、短縮されたジャーナル名を取得するか、完全なジャーナル名を取得します。.bib
ieeetran
IEEEabrv.bib
IEEEfull.bib
IEEEabbrv.bib
IEEEfull.bib
事実上、月文字列も同様に機能します。 は、、などjan
です。@string
1
feb
2
@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 つの方法があります。
@string
バックエンドによって解決される- (
.lbx
)bibstringsはbiblatex
どちらがより適切かは、使用例によって異なります。 は
@string
、入力の手間を省きたい場合や、複数の入力形式 (長いジャーナル名と短いジャーナル名) を切り替える方法が必要な場合に適しています。 一般に、@string
は言語やロケールに結び付けられていません。 真のローカリゼーションが必要な場合は、 Bibstrings が最適です。
あなたの質問の例からは、どちらのアプローチがあなたのユースケースでより有用であるかは、はっきりと分かりません。
ご希望のものを入手できますか?
質問で説明したスキームにこだわるのであれば、2 つのアプローチを組み合わせることでほぼ可能です。特に良いアイデアだとは思いませんが、やってみましょう。
中括弧のない可能な値ごとに、@string
置換テキストを使用して を定義する必要があります。移植可能なソリューションが必要な場合は、.bib
すべてのプロジェクトに読み込む必要がある特別なファイルでこれを行う必要があります。
@string{bracelessa = {bracelessa}}
@string{bracelessb = {bracelessb}}
次に、ビブストリングを作りますbracelessa
。bracelessb
biblatex
\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
。