JabRefでは、標準書出フィルタが定義されているのと同様の方法で、自分自身の書出フィルタを定義して使用することができます。書出フィルタは、一つ以上のレイアウトファイルで定義されており、組込整形ルーチン群によって、書出ファイルの書式を決定します。レイアウトファイルは、JabRef外部で、テキストエディタを使用して準備する必要があります。
書出フィルタが有効となる唯一の条件は、拡張子.layoutのファイルがあることだけです。自作書出フィルタを新たに追加するには、ダイアログボックスオプション→自作書出の管理を開き、新規追加を押します。新しいダイアログボックスが現れるので、書出フィルタの名称(これは、ファイル→書出メニューをJabRefウィンドウから選択した時に、ファイルダイアログのファイル型ドロップダウンメニューに選択肢として現れるものです)と.layoutファイルのパス、書出フィルタの優先ファイル拡張子(これは書出フィルタを使用する際、ファイルダイアログで提案される拡張子になります)を指定します。
書出フィルタの作り方の例を見るには、JabRefダウンロードページから標準書出フィルタのレイアウトファイルを含むパッケージを手に入れてください。
HTML書出フィルタを作成しようとしているものとしましょう。書出フィルタは、.layoutファイル——ここではhtml.layoutとしましょう——が一つありさえすればよいのですが、html.begin.layoutとhtml.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
コマンドは、書き出す項目について、波括弧で参照されているフィールドが定義されている場合に限り、その間の文字列が出力されるようにするものです。
条件付きブロックは、二つ以上のフィールドに依存させることもでき、簡単な二値条件が満たされた時のみ、内容が出力されます。二値演算子は下記の二つが用意されています。
&
, &&
|
, ||
year
とmonth
の両方が設定されている時のみ文字列を出力したい場合には、下記のようなブロックを使用してください。
\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
: このフォーマッタは、authorおよびeditorフィールドの整形オプションを提供します。詳細な情報については後述部分をご覧ください。これは、JabRef2.7版以前に提供されていた多くの旧フォーマッタを置き換えるものです。CreateBibORDFAuthors
: Bibliographic Ontology (bibo)の要件を満たすようにauthorフィールドを整形します。CreateDocBookAuthors
: authorフィールドをDocBook様式で整形します。CreateDocBookEditors
: editorフィールドをDocBook様式で整形します。CurrentDate
: 現在の日付を出力します。引数を与えなければ、このフォーマッタは、現在の日付と時刻を「yyyy.MM.dd hh:mm:ss z」(日付と時刻とタイムゾーン)の書式で出力します。引数として、別の書式文字列を与えれば、日付の書式を変更することができます。例えば、\format[CurrentDate]{yyyy.MM.dd}
は、2005.11.30のように日付のみを返します。Default
: これは一つだけ引数を取り、それを既定値とします。整形する文字列が空でなければ、それに変更を加えずに出力されます。もしそれが空ならば、既定値が出力されます。例えば、\format[Default(unknown)]{\year}
は、項目のyearが設定されていればそれを出力し、yearが設定されていなければ、「unknown」を出力します。DOIStrip
: DOI文字列から前置句を取り除きます。DOICheck
: DOIリンクの完全URLを提供します。FileLink(ファイル型)
: 引数を与えなければ、このフォーマッタは、当該フィールドにエンコードされている最初の外部ファイルリンクを出力します。動作するためには、このフォーマッタに「file」フィールドの内容を与えなくてはいけません。
このフォーマッタは、外部ファイル型の名称を非必須引数としてとり、フォーマッタ名の後に丸括弧に入れて指定します。例えば、\format[FileLink(pdf)]{\file}
は、pdf
を引数として指定しています。引数が与えられると、フォーマッタは指定された型の最初のファイルリンクを選択します。この例では、最初のPDFリンクのパスが出力されます。
FirstPage
: 「pages」フィールドに設定があると、そこから最初のページを返します。例えば、pagesフィールドが「345-360」や「345--360」に設定されていると、このフォーマッタは「345」を返します。FormatChars
: このフォーマッタは、LaTeX文字列を同等のunicode文字列に変換し、他のLaTeXコマンドを処理しないで削除します。FormatPagesForHTML
: 「--」を「-」に置換します。FormatPagesForXML
: 「--」をXMLエヌダッシュに置換します。GetOpenOfficeType
: OpenOffice.org書誌情報システム(第1.x版および第2.x版)において、この項目の型を表す番号を返します。HTMLChars
: TeXの特殊文字({\^a}や{\"{o}}など)をHTML表記に置き換え、\emph・\textit・\textbfのLaTeXコマンドをHTMLでの等価のコマンドに書き換えます。HTMLParagraphs
: 二連続の改行(\n \nなど)を新しい段落の開始と解釈し、段落HTMLタグを正しく付与します。IfPlural
: 入力フィールドが2著者以上の著者リスト様に見える場合には第1引数を出力し、それ以外は第2引数を出力します。例えば、\format[IfPlural(Eds.,Ed.)]{\editor}
は2名以上の編者がいる場合は「Eds.」を出力し、1名だけの場合は「Ed.」を出力します。JournalAbbreviator
: 与えられた入力文字列を、誌名短縮形リストにしたがって短縮形にします。入力に対して短縮形が見つからない場合(リスト中にないか既に短縮されている場合など)には、入力は修正されずに返されます。例えば、\format[JournalAbbreviator]{\journal}
を使用すると、「Physical Review Letters」は「Phys. Rev. Lett.」となります。LastPage
: 「pages」フィールドに設定があると、そこから最後のページを返します。例えば、pagesフィールドが「345-360」や「345--360」に設定されていると、このフォーマッタは「360」を返します。NoSpaceBetweenAbbreviations
: 短縮されたファーストネームの間の空白を取り除くLayoutFormatterです。例えば、J. R. R. TolkienはJ.R.R. Tolkienとなります。NotFoundFormatter
: フォーマッタが見つからなかったことをシグナルするためのフォーマッタです。レイアウトが未定義の書式を使っている時に、品質低下を優美に表すために使うことができます。Number
: 現在の書出中で、現在の項目の(1から始まる)順番を出力します。このフォーマッタは、項目の連番リストを作るのに用いることができます。順番は、現在の整序順での現在の項目位置で決められ、このフォーマッタの呼び出し回数には依存しません。RemoveBrackets
: 波括弧「{」「}」をすべて取り除きます。RemoveBracketsAddComma
: 波括弧「{」「}」をすべて取り除き、閉じ括弧はコンマで置き換えられます。RemoveLatexCommands
: \em
や\textbf
のようなコマンドを取り除きます。HTMLChars
やXMLChars
と用いられる場合は、このフォーマッタは最後に呼び出されるべきです。RemoveTilde
: LaTeXで改行禁止空白として用いられるチルダを普通の空白で置き換えます。次節で論じるNameFormatterとともに用いると便利です。RemoveWhitespace
: すべての空白文字を取り除きます。Replace(正規表現,置換文字列)
: 正規表現置換を行います。このフォーマッタを使うには、二部からなる引数を与えなくてはなりません。各部はコンマで区切ります。 コンマ文字自身を表すには、 エスケープシークエンス\,を用いてください。RisAuthors
: まだ文書化されていません。RisKeywords
: まだ文書化されていません。RisMonth
: まだ文書化されていません。RTFChars
: TeXで用いられる特殊文字({\^a}や{\"{o}}など)をRTF表現に置き換え、LaTeXコマンド\emph・\textit・\textbfをRTFの同等表現に置き換えます。ToLowerCase
: 全文字を小文字にします。ToUpperCase
: 全文字を大文字にします。WrapContent
: このフォーマッタは、入力値が空でない限り、入力値に前置句及び後置句を付して出力します。入力値が空の場合には、空の文字列が出力されます(この場合前置句及び後置句は出力されません)。このフォーマッタは、前置句と後置句をコンマで区切った引数を必須とします。いずれかにコンマ文字自身を入れたい場合には、エスケープシークエンス(\,)を使用してください。WrapFileLinks
: 後述。XMLChars
: TeXで用いられる特殊文字({\^a}や{\"{o}}など)をXML表現に置き換えます。Authors
フォーマッタ様々な引用様式を可能にするために、Authors
フォーマッタは、著者リストのレイアウトを自由に制御できるようになっています。このフォーマッタは、コンマ区切りのオプション列を取り、これによって既定値を上書きできます。現在、以下のオプション・値の組が利用できます。既定値は波括弧で表示されています。
AuthorSort = [ {FirstFirst} | LastFirst | LastFirstFirstFirst ]
FirstFirst
: 名の後に姓が来ます。LastFirst
: 著者の姓の後にコンマで区切って名が来ます。LastFirstFirstFirst
: 第一著者がLastFirstで、その他の著者はFirstFirstで整形されます。AuthorAbbr = [ FullName | LastName | {Initials} | InitialsNoSpace | FirstInitial | MiddleInitial ]
FullName
: 著者名を完全形で表示します。名は短縮されません。LastName
: 姓のみを表示し、名は表示されません。Initials
: すべての名を短縮します。InitialsNospace
: イニシャルで表示し、イニシャル間の空白はすべて削除されます。FirstInitial
: 最初のイニシャルのみ表示されます。MiddleInitial
: 名は表示されますが、ミドルネームはすべて短縮されます。AuthorPunc = [ {FullPunc} | NoPunc | NoComma | NoPeriod ]
AuthorAbbr
を用いる際、著者リストでの句読点の付け方を指定します。
FullPunc
: 句読点に変化は加えません。NoPunc
: 著者名からコンマとピリオドをすべて取り除きます。NoComma
: 著者名からコンマをすべて取り除きます。NoPeriod
: 著者名からピリオドをすべて取り除きます。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}
と等価です。このように、オプションを指定する順序は無関係です。一つ、曖昧さが残る可能性があるのは、AuthorSep
とAuthorLastSep
の両方を指定する場合です。この場合、最初に遭遇した適用可能な値が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
フォーマッタこのフォーマッタは、すべてのファイルリンクもしくは指定した型のすべてのファイルリンクに対して、第一引数で与えられた整形文字列を反復出力します。整形文字列には、文字列にファイルリンク情報を挿入するためのエスケープシークエンスを複数入れることができます。
このフォーマッタは、非必須の第二引数としてファイル型名を指定することができます。これを指定した場合には、その型名に一致する(大文字小文字の区別無し)ファイル型に対してのみ反復を行います。空の引数を与えると、すべてのファイルリンクを対象とします。
第二引数の後には、さらに引数の対を追加することができ、挿入したリンク情報を出力文字列に埋め込む前に、リンク情報に対して行う正規表現置換を指定します。対になっていない引数は無視されます。ファイル型のフィルタをかけること無しに置換を指定するには、第二引数は空にしてください。
情報を埋め込むエスケープシークエンスは以下の通りです。
\i
: 繰り返しインデックス(1から始まる)を挿入します。出力ファイルリストに連番を振る際に便利です。\p
: ファイルリンクのファイルパスを挿入します。\f
: ファイルリンク型の名称を挿入します。\x
: ファイル拡張子があれば、それを挿入します。\d
: ファイルリンクの説明があれば、それを挿入します。例えば、「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,",")]{\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メーリングリストのどれかにメールを送ってください。