自作書出フィルタ

JabRefでは、標準書出フィルタが定義されているのと同様の方法で、自分自身の書出フィルタを定義して使用することができます。書出フィルタは、一つ以上のレイアウトファイルで定義されており、組込整形ルーチン群によって、書出ファイルの書式を決定します。レイアウトファイルは、JabRef外部で、テキストエディタを使用して準備する必要があります。

自作書出フィルタを追加する

書出フィルタが有効となる唯一の条件は、拡張子.layoutのファイルがあることだけです。自作書出フィルタを新たに追加するには、ダイアログボックスオプション→自作書出の管理を開き、新規追加を押します。新しいダイアログボックスが現れるので、書出フィルタの名称(これは、ファイル→書出メニューをJabRefウィンドウから選択した時に、ファイルダイアログのファイル型ドロップダウンメニューに選択肢として現れるものです)と.layoutファイルのパス、書出フィルタの優先ファイル拡張子(これは書出フィルタを使用する際、ファイルダイアログで提案される拡張子になります)を指定します。

書出フィルタを作成する

書出フィルタの作り方の例を見るには、JabRefダウンロードページから標準書出フィルタのレイアウトファイルを含むパッケージを手に入れてください。

レイアウトファイル

HTML書出フィルタを作成しようとしているものとしましょう。書出フィルタは、.layoutファイル——ここではhtml.layoutとしましょう——が一つありさえすればよいのですが、html.begin.layouthtml.end.layoutという二つのファイルも作りたくなるでしょう。前者は出力のヘッダ部分を持ち、後者はフッタ部分です。JabRefは、書出フィルタが使用された際にこの二つのファイルを探し出し、検出されると、その内容が各項目の出力の前後に逐語的にコピーされます。

これらのファイルは、html.layoutと同じディレクトリになくてはならず、それぞれ.begin.endを名称に挿入しなくてはなりません。この書出フィルタの例では、これらのファイルは以下のようになります。

html.begin.layout:
<!DOCTYPE html>
<html>
<body style="color:#275856; font-family: Arial, sans-serif;">

html.end.layout:
</body>
</html>

html.layoutファイルは、1項目のみを書き出す時の既定のひな型となります。項目型毎に異なるひな型を用いたい場合には、項目依存の.layoutファイルを追加します。これらは、基本となるレイアウトファイルと同じディレクトリになくてはならず、基本レイアウト ファイル名に.項目型を挿入した名称を付けなくてはなりません。項目型名はすべて小文字です。ここの例では、book項目のひな型を作りたいとすると、そのファイルはhtml.book.layoutとなります。博士論文ならば、html.phdthesis.layoutなどとなるでしょう。これらのファイルは、一致する項目型のみに用いられるという点を除けば、既定レイアウトファイルと同じです。ただし、既定ファイルは、ほとんどの書出フィルタにおいて、たいていの項目型を網羅できるように、十分一般的な形で作ることが容易にできます。

レイアウトファイルの書式

レイアウトファイルは、簡単なマークアップ形式を用いて作成されており、コマンドはバックスラッシュの後に続けることで認識されます。コマンドの一部と認識されないテキストはすべて、文字通り出力ファイルにコピーされます。

フィールドコマンド

\author\editor\title\yearのような、バックスラッシュに続く単語は、いずれも対応するフィールドを参照しているものと解釈され、直接出力にコピーされます。

フィールド整形子(フォーマッタ)

往々にして、出力前にフィールド内容を事前処理する必要のあることがあります。これは、フィールド内容を操作するメソッドを一つだけ持ったjavaクラスfield formatterを用いて行われます。

フォーマッタは、\formatコマンドを挿入した後にフォーマッタ名を角括弧で続け、フィールドコマンドを波括弧で続けることで使用することができます。例:

\format[ToLowerCase]{\author}

また、コンマで区切ることで複数のフォーマッタを指定することができます。これらは左から右にシーケンシャルに呼び出されます。例えば、

\format[ToLowerCase,HTMLChars]{\author}

上記は、まずフォーマッタToLowerCaseが呼び出され、それからその結果を整形するのにHTMLCharsが呼び出されます。この方法で、好きな数のフォーマッタを列挙することができます。

波括弧で囲んだフォーマッタへの引数は、フィールドコマンドである必要はありません。代わりに通常のテキストを入れると、フィールド内容ではなく、そのテキストがフォーマッタに渡されます。これは、(後述するように)CurrentDateフォーマッタなど、いくつかのフォーマッタで有用です。

フォーマッタによっては、追加的な引数を取るものがあり、これはフォーマッタ名の直後に丸括弧に入れて与えます。引数は引用符で囲むことができ、これは引数に括弧文字が含まれる場合には必要です。例えば、\format[Replace("\s,_")]{\journal}は、Replaceフォーマッタを引数\s,_とともに呼び出します(これは、すべての空白をアンダースコアで置換した「journal」フィールドを返します)。

組込書出フォーマッタの一覧は、下記をご覧ください。

条件付き出力

静的出力の中には、特定のフィールドが設定されて初めて意味を持つものがあります。例えば、編集者名の後に(Ed.)という文字列を付けたいものとしましょう。これは、以下のテキストで実現できます。

\format[HTMLChars,AuthorFirstFirst]{\editor} (Ed.)

しかしながら、もしeditorフィールドが設定されていなければ——書き出す項目によっては、そもそもこのフィールドは意味を持たないかもしれません——、(Ed.)は宙ぶらりんで残されてしまいます。これは、下記のように、代わりに\beginおよび\endコマンドを使うと、回避できます。

\begin{editor}
\format[HTMLChars,AuthorFirstFirst]{\editor} (Ed.)
\end{editor}

\beginおよび\endコマンドは、書き出す項目について、波括弧で参照されているフィールドが定義されている場合に限り、その間の文字列が出力されるようにするものです。

条件付きブロックは、二つ以上のフィールドに依存させることもでき、簡単な二値条件が満たされた時のみ、内容が出力されます。二値演算子は下記の二つが用意されています。

yearmonthの両方が設定されている時のみ文字列を出力したい場合には、下記のようなブロックを使用してください。

\begin{year&&month}Month: \format[HTMLChars]{\month}\end{year&&month}

これはyearフィールドも定義されている時のみ、「Month:」とmonthフィールドの内容を出力します。

《註》様々な項目型でうまく動作するレイアウトファイルを作る上では、\beginコマンドと\endコマンドを使うことが鍵となります。

グループ化出力

特定のフィールドに基づいて項目をグループ化したい場合、グループ化出力コマンドを使用してください。グループ化出力は、波括弧で参照されているフィールドの値が変化した時のみ、間の文字列が出力されるという点を除いては、条件付き出力に非常に類似したものです。

例えば、キーワードでグループを作りたいとしましょう。ファイルを書き出す前に、項目をキーワードで整序して保管したことを確認してください。キーワードでグループ化するには、以下のコマンドを使用します。

\begingroup{keywords}New Category: \format[HTMLChars]{\keywords}
\endgroup{keywords}

作業の共有

外部レイアウトファイルを使用すれば、ユーザー間で自作書出形式を共有することは、たいへん容易です。JabRefでサポートされていない書式の書出フィルタを書いたり、既存のフィルタを改善した場合、その成果をぜひSourceForge.netページに投稿してください。自作されたフォーマッタクラスについても同様です。喜んで、投稿されたレイアウトファイルのコレクションを配布したり、標準書出フィルタと標準フォーマッタのセレクションに追加したりしたいと思います。

JabRef 2.4版以降、自作のExportFormatとLayoutFormatterをプラグインとしてパッケージ化することもできるようになりました。その場合、単一のzipファイルを他のユーザーに提供して、自作のExportFormatを利用できるようにすることができます。例を見るには、JabRefソースリリースをダウンロードして、src/plugins/ディレクトリをご覧ください。まだ充分な文書化がされていませんので、SourceForgeのフォーラムを自由にご利用ください。

組込書出フォーマッタ

JabRefは、以下のフォーマッタを提供しています。

Authorsフォーマッタ

様々な引用様式を可能にするために、Authorsフォーマッタは、著者リストのレイアウトを自由に制御できるようになっています。このフォーマッタは、コンマ区切りのオプション列を取り、これによって既定値を上書きできます。現在、以下のオプション・値の組が利用できます。既定値は波括弧で表示されています。

AuthorSort = [ {FirstFirst} | LastFirst | LastFirstFirstFirst ]
著者名が整形される順序を指定します。
AuthorAbbr = [ FullName | LastName | {Initials} | InitialsNoSpace | FirstInitial | MiddleInitial ]
著者名の短縮のしかたを指定します。
AuthorPunc = [ {FullPunc} | NoPunc | NoComma | NoPeriod ]
AuthorAbbrを用いる際、著者リストでの句読点の付け方を指定します。
AuthorSep = [ {Comma} | And | Colon | Semicolon | Sep=<文字列> ]
著者の間の区切り文字を指定します。Sep=<文字列>オプションを用いれば、任意の区切り文字を使用することができます。文字列の前後には余白を適宜入れる必要があることに注意してください。
AuthorLastSep = [ Comma | {And} | Colon | Semicolon | Amp | Oxford | LastSep=<文字列> ]
著者リスト中の最後の区切り文字を指定します。Sep=<文字列>オプションを用いれば、任意の区切り文字を使用することができます。文字列の前後には余白を適宜入れる必要があることに注意してください。
AuthorNumber = [ {inf} | <整数> ]
出力する著者の数を指定します。著者数がここで指定した最大値を超えた場合、著者リストは、第一著者(あるいはAuthorNumberEtAlで指定した数の著者)の後にEtAlStringを付けたものに置き換えられます。
AuthorNumberEtAl = [ {1} | <整数> ]
著者の全数がAuthorNumberを超えた場合、出力する著者数を指定します。この引数は、AuthorNumberが既に指定されている場合のみ、指定することができます。
EtAlString = [ { et al.} | EtAl=<文字列> ]
複数の著者を置き換える文字列を指定します。EtAl=<文字列>を用いれば、任意の文字列を与えることができます。

オプションを指定しなければ、既定値(上記において波括弧で表記されているもの)が用いられます。したがって、既定値と異なるレイアウトオプション以外は指定する必要がありません。オプションの定義順は(ほぼ)関係ありません。したがって、例えば

\format[Authors(Initials,Oxford)]{\author}

は、

\format[Authors(Oxford,Initials)]{\author}

と等価です。このように、オプションを指定する順序は無関係です。一つ、曖昧さが残る可能性があるのは、AuthorSepAuthorLastSepの両方を指定する場合です。この場合、最初に遭遇した適用可能な値がAuthorSep用と解釈され、二番目はAuthorLastSepに用いられます。既定値を変更する際には、曖昧さを避けるために両方する様にした方が良いでしょう。

用例

著者名として「Joe James Doe and Mary Jane and Bruce Bar and Arthur Kay」が与えられた場合、Authorsフォーマッタは、以下のような結果を返します。

Authors()もしくはそれと同等なAuthors(FirstFirst,Initials,FullPunc,Comma,And,inf,EtAl= et al.)の場合
J. J. Doe, M. Jane, B. Bar and A. Kay
Authors(LastFirstFirstFirst,MiddleInitial,Semicolon)の場合
Doe, Joe J.; Mary Jane; Bruce Bar and Arthur Kay
Authors(LastFirst,InitialsNoSpace,NoPunc,Oxford)の場合
Doe JJ, Jane M, Bar B, and Kay A
Authors(2,EtAl= and others)の場合
J. J. Doe and others

通常使用される引用書式は、ほとんどこのフォーマッタで実現できるはずです。もっと詳細なオプションについては、後述の自作フォーマッタを使うことをご考慮ください。

WrapFileLinksフォーマッタ

このフォーマッタは、すべてのファイルリンクもしくは指定した型のすべてのファイルリンクに対して、第一引数で与えられた整形文字列を反復出力します。整形文字列には、文字列にファイルリンク情報を挿入するためのエスケープシークエンスを複数入れることができます。

このフォーマッタは、非必須の第二引数としてファイル型名を指定することができます。これを指定した場合には、その型名に一致する(大文字小文字の区別無し)ファイル型に対してのみ反復を行います。空の引数を与えると、すべてのファイルリンクを対象とします。

第二引数の後には、さらに引数の対を追加することができ、挿入したリンク情報を出力文字列に埋め込む前に、リンク情報に対して行う正規表現置換を指定します。対になっていない引数は無視されます。ファイル型のフィルタをかけること無しに置換を指定するには、第二引数は空にしてください。

情報を埋め込むエスケープシークエンスは以下の通りです。

例えば、「John's final report」という説明が入った「PDF」型のファイル「/home/john/report.pdf」へのファイルリンクが入った項目があるとしましょう。以下のような引数を持つWrapFileLinksフォーマッタを使うと、

\format[WrapFileLinks(\i. \d (\p))]{\file}

以下のような出力を得ます。

    1. John's final report (/home/john/report.pdf)

項目に二つめのファイルリンクとして、「An early "draft"」という説明のついた「テキスト」ファイル「/home/john/draft.txt」へのファイルリンクがあったとすると、出力は以下のようになります。

    1. John's final report (/home/john/report.pdf)
    2. An early "draft" (/home/john/draft.txt)

フォーマッタが第二引数を付けて呼ばれると、リストにはフィルタがかけられます。例えば、

\format[WrapFileLinks(\i. \d (\p),,text file)]{\file}

は、以下のようにテキストファイルだけを表示します。

    1. An early "draft" (/home/john/draft.txt)

この出力をXML様式出力の一部としたい場合には、ファイル説明の引用符は問題を引き起こし得ます。以下のように、さらに引数を二つ加えて、引用符をXML文字に変換すると、この問題を解決できます。

\format[WrapFileLinks(\i. \d (\p),,text file,",&quot;)]{\file}

これは以下のような出力を得ます。

    1. An early "draft" (/home/john/draft.txt)

置換の対は、もっと付け加えることもできます。

自作フォーマッタ

もし用意されたフォーマッタでは、あなたが実現したいことをできない場合には、net.sf.jabref.export.layout.LayoutFormatterインタフェースを実装することによって、自分自身のフォーマッタを追加することができます。自作のクラスをnet.sf.jabref.export.layout.formatパッケージに挿入すれば、標準フォーマッタと同様に、自作フォーマッタをそのクラス名のみで呼び出すことができます。このようにしない場合には、自作フォーマッタは、完全修飾名(パッケージ名を含む)で呼び出さなくてはなりません。いずれにしても、JabRef実行時には、フォーマッタはクラスパス上になくてはなりません。

自作名前フォーマッタを使う

JabRef第2.2版以降、BibTeXのstyファイルで用いられる文法を使って、自作の名前フォーマッタを定義することができます。これは究極の柔軟性をもたらしますが、他方、書くことは非常に面倒です。

自作フォーマッタは、設定タブの「名前の整形」で以下の書式を使って定義することができるので、他のフォーマッタと同じように、それに付与した名称を呼び出して使用してください。

<場合1>@<範囲11>@<書式>@<範囲12>@<書式>@<範囲13>...@@
<場合2>@<範囲21>@... 等々

この書式は、著者リストを整形するために、まず著者が何人いるかによってタスクを場合分けします(著者が何人かによって、書式が異なる場合があるからです)。それぞれの場合は@@で区切られ、それぞれの場合について各著者をどう整形するかの指示を書き込みます。これらの指示は@で区切られます。

それぞれの場合は、整数(1, 2, 3など)か*文字(任意の数の著者に一致)で認識され、与えられた数以下の著者しかいない場合、以下の指示を適用するようにフォーマッタに命令します。

範囲は、与えられた著者リストから作られた、1から始まるインデックスを使用して、<整数>..<整数>の形か<整数>あるいは*文字で表されます。リストの最後から始まる順序を示すために、インデックスには負の値を用いることができ、-1は最後の著者を表します。

例えば「Joe Doe and Mary Jane and Bruce Bar and Arthur Kay」という著者リストにを用いると、

<書式>部分の文字列は、以下のようにBibTeXフォーマッタの書式を用います。

v/f/l/jの4文字は、波括弧の中で用いられ、名前の「von」/名/姓/「jr」の部分を表します。v/f/l/jを単一文字で使うと、対応する名前部分の短縮形を表します。これらの文字や文字の組に遭遇すると、JabRefは、対応する名前部分をすべて(場合によって短縮形で)出力しますが、波括弧内の表現は、その名前部分が存在する時のみ出力されます。

例えば、書式が「{ll} {vv {von Part}} {ff}」で著者名が「Mary Kay and John von Neumann」ならば、JabRefは「Kay Mary」(姓名間に空白二つ)と「Neuman von von Part John」を出力します。

二つの例を示しますが、できればBibTeXの文書を参照されることをお勧めします。

短い例: "{ll}, {f.}"は「Joe Doe」を「Doe, J.」と返します。

長い例:

以下の名前

Joe Doe and Mary Jane and Bruce Bar and Arthur Kay

Doe, J., Jane, M., Bar, B. and Kay, A.

と返すには、

1@*@{ll}, {f}.@@2@1@{ll}, {f}.@2@ and {ll}, {f}.@@*@1..-3@{ll}, {f}., @-2@{ll}, {f}.@-1@ and {ll}, {f}.

と指定します。

このトピックについて、もっと良いチュートリアルを書いてくれる人がおられましたら、JabRefメーリングリストのどれかにメールを送ってください。