JabRef allows you to define and use your own export filters, in the same way as the standard export filters are defined. An export filter is defined by one or more layout files, which with the help of a collection of built-in formatter routines specify the format of the exported files. Your layout files must be prepared in a text editor outside of JabRef.
The only requirement for a valid export filter is the existence of a file with the extension .layout. To add a new custom export filter, open the dialog box Options -> Manage custom exports, and click Add new. A new dialog box will appear, allowing you to specify a name for the export filter (which will appear as one of the choices in the File type dropdown menu of the file dialog when you use the File -> Export menu choice in the JabRef window), the path to the .layout file, and the preferred file extension for the export filter (which will be the suggested extension in the file dialog when you use the export filter).
To see examples of how export filters are made, look for the package containing the layout files for the standard export filters on our download page.
Let us assume that we are creating an HTML export filter.
While the export filter only needs to consist of a single .layout file, which in this case could be called html.layout, you may also want to add two files called html.begin.layout and html.end.layout. The former contains the header part of the output, and the latter the footer part. JabRef will look for these two files whenever the export filter is used, and if found, either of these will be copied verbatim to the output before or after the individual entries are written.
Note that these files must reside in the same directory as html.layout, and must be named by inserting .begin and .end, respectively.
In our example export filter, these could look like the following:
html.begin.layout:
<HTML>
<BODY> text="#275856">
<basefont size="4" color="#2F4958"
face="arial">
html.end.layout:
</BODY>
</HTML>
The file html.layout provides the default template for exporting one single entry. If you want to use different templates for different entry types, you can do this by adding entry-specific .layout files. These must also reside in the same directory as the main layout file, and are named by inserting .entrytype into the name of the main layout file. The entry type name must be in all lowercase. In our example, we might want to add a template for book entries, and this would go into the file html.book.layout. For a PhD thesis we would add the file html.phdthesis.layout, and so on. These files are similar to the default layout file, except that they will only be used for entries of the matching type. Note that the default file can easily be made general enough to cover most entry types in most export filters.
Layout files are created using a simple markup format where commands are identified by a preceding backslash. All text not identified as part of a command will be copied verbatim to the output file.
An arbitrary word preceded by a backslash, e.g.
\author
, \editor
, \title
or \year
, will be interpreted as a reference to
the corresponding field, which will be copied directly to the
output.
Often there will be a need for some preprocessing of the field contents before output. This is done using a field formatter - a java class containing a single method that manipulates the contents of a field.
A formatter is used by inserting the \format
command followed by the formatter name in square braces, and
the field command in curly braces, e.g.:
\format[ToLowerCase]{\author}
You can also specify multiple formatters separated by commas. These will be called sequentially, from left to right, e.g.
\format[ToLowerCase,HTMLChars]{\author}
will cause the formatter ToLowerCase to be called first, and then HTMLChars will be called to format the result. You can list an arbitrary number of formatters in this way.
The argument to the formatters, withing the curly braces, does not have to be a field command. Instead, you can insert normal text, which will then be passed to the formatters instead of the contents of any field. This can be useful for some fomatters, e.g. the CurrentDate formatter (described below).
Some formatters take an extra argument, given in parentheses
immediately after the formatter name. The argument can be enclosed
in quotes, which is necessary if it includes the parenthesis characters.
For instance, \format[Replace("\s,_")]{\journal}
calls
the Replace formatter with the argument \s,_ (which results
in the "journal" field after replacing all whitespace by underscores).
JabRef provides the following set of formatters, some of which depend on the others:
AuthorAbbreviator
or AuthorLastFirstAbbreviator
: abbreviates first and middle names of all authors. This formatter
returns names with the last name first. Follow this formatter with
AuthorFirstFirst to get abbreviated names with the initials first.AuthorAndsCommaReplacer
: replaces "and"
between names with ",", and "&" between the last
two.AuthorAndsReplacer
: replaces "and"
between names with ";", and "&" between the last
two.AuthorFirstFirst
: formats author/editor
fields with the first names first.AuthorFirstFirstCommas
or AuthorFirstLastCommas
: formats author/editor fields with the first names first, delimited by
commas, with "and" between the last two names.AuthorFirstLastOxfordCommas
: similar
to AuthorFirstLastCommas
, except that the "and"
between the last two names is preceded by a comma.AuthorFirstAbbrLastCommas
: formats
author/editor fields with abbreviated first names first, delimited by
commas, with "and" between the last two names.AuthorFirstAbbrLastOxfordCommas
: similar
to AuthorFirstAbbrLastCommas
, except that the "and"
between the last two names is preceded by a comma.AuthorLastFirst
: formats author/editor
fields with the last names first.AuthorLastFirstAbbrCommas
: formats
author/editor fields with last names first and abbreviated first names
last, delimited by commas, with "and" between the last two names.AuthorLastFirstAbbrOxfordCommas
: similar
to AuthorLastFirstAbbrCommas
, except that the "and"
between the last two names is preceded by a comma.AuthorLastFirstCommas
: formats
author/editor fields with the last names first, delimited by
commas, with "and" between the last two names.AuthorLastFirstOxfordCommas
: similar
to AuthorLastFirstCommas
, except that the "and"
between the last two names is preceded by a comma.AuthorNatBib
: formats author names in
NatBib style, with last names only, separating names by
"and" if there are two authors, and giving the first author
followed by "et al." if there are more than two
authors.AuthorOrgSci
: first author is in "last,
first" all others in "first last". First names are
abbreviated.CreateDocBookAuthors
: formats the author
field in DocBook style.CreateDocBookEditors
: to be
documented.CurrentDate
: outputs the current date.
With no argument, this formatter outputs the current date
and time in the format "yyyy.MM.dd hh:mm:ss z" (date, time
and time zone). By giving a different format string as
argument, the date format can be customized. E.g.
\format[CurrentDate]{yyyy.MM.dd}
will give the
date only, e.g. 2005.11.30.FileLink(filetype)
: if no argument is given, this formatter outputs
the first external file link encoded in the field. To work, the formatter must
be supplied with the contents of the "file" field.
This formatter takes the name of an external file type as an optional argument,
specified in parentheses after the formatter name. For instance,
\format[FileLink(pdf)]{\file}
specifies pdf
as an
argument. When an argument is given, the formatter selects the first file
link of the specified type. In the example, the path to the first PDF link will
be output.
FirstPage
: returns the first page from the "pages" field, if set.
For instance, if the pages field is set to "345-360" or "345--360",
this formatter will return "345".FormatPagesForHTML
: replaces "--" with
"-".FormatPagesForXML
: replaces "--" with an
XML en-dash.GetOpenOfficeType
: returns the number used by the OpenOffice.org
bibliography system (versions 1.x and 2.x) to denote the type of this entry.HTMLChars
: replaces TeX-specific special
characters (e.g. {\^a} or {\"{o}}) with their HTML
representations, and translates LaTeX commands \emph, \textit,
\textbf into HTML equivalents.HTMLParagraphs
: interprets two
consecutive newlines (e.g. \n \n) as the beginning of a new
paragraph and creates paragraph-html-tags accordingly.LastPage
: returns the last page from the "pages" field, if set.
For instance, if the pages field is set to "345-360" or "345--360",
this formatter will return "360".NoSpaceBetweenAbbreviations
: spaces
between multiple abbreviated first names are removed.RemoveBrackets
: removes all curly
brackets "{" or "}".RemoveBracketsAddComma
: to be
documented.RemoveLatexCommands
: removes LaTeX
commands like \em
, \textbf
, etc.
If used together with HTMLChars
or
XMLChars
, this formatter should be called
last.RemoveTilde
: replaces the tilde character
used in LaTeX as a non-breakable space by a regular space.
Useful in combination with the NameFormatter discussed in
the next section.RemoveWhitespace
: removes all whitespace characters.Replace(regexp,replacewith)
: does a regular expression replacement.
To use this formatter, a two-part argument must be given. The parts are
separated by a comma. To indicate the comma character, use an escape
sequence: \,RTFChars
: replaces TeX-specific special
characters (e.g. {\^a} or {\"{o}}) with their RTF
representations, and translates LaTeX commands \emph, \textit,
\textbf into RTF equivalents.ToLowerCase
: turns all characters into
lower case.ToUpperCase
: turns all characters into
upper case.WrapContent
: This formatter outputs the input value after adding a
prefix and a postfix, as long as the input value is non-empty. If the input value
is empty, an empty string is output (the prefix and postfix are not output in this case).
The formatter requires an argument containing the prefix and postix separated
by a comma. To include the comma character in either, use an escape sequence
(\,).WrapFileLinks
: See below.XMLChars
: replaces TeX-specific special
characters (e.g. {\^a} or {\"{o}}) with their XML
representations.WrapFileLinks
formatter1. John's final report (/home/john/report.pdf)If the entry contained a second file link to the file "/home/john/draft.txt" of the "Text file" type with description 'An early "draft"', the output would be as follows:
1. John's final report (/home/john/report.pdf)
2. An early "draft" (/home/john/draft.txt)If the formatter was called with a second argument, the list would be filtered. For instance:
\format[WrapFileLinks(\i. \d (\p),,text file)]{\file}would show only the text file:
1. An early "draft" (/home/john/draft.txt)If we wanted this output to be part of an XML styled output, the quotes in the file description could cause problems. Adding two additional arguments to translate the quotes into XML characters solves this:
1. An early "draft" (/home/john/draft.txt)Additional pairs of replacements could be added.
If none of the available formatters can do what you want to
achieve, you can add your own by implementing the
net.sf.jabref.export.layout.LayoutFormatter
interface. If you insert your class into the
net.sf.jabref.export.layout.format
package, you
can call the formatter by its class name only, like with the
standard formatters. Otherwise, you must call the formatter by
its fully qualified name (including package name). In any case,
the formatter must be in your classpath when running
JabRef.
From JabRef 2.2, it is possible to define custom name formatters using the bibtex-sty-file syntax. This allows ultimate flexibility, but is a cumbersome to write
You can define your own formatter in the preference tab "Name Formatter" using the following format and then use it with the name given to it as any other formatter
<case1>@<range11>@<format>@<range12>@<format>@<range13>...@@
<case2>@<range21>@... and so on.
This format first splits the task to format a list of author into cases depending on how many authors there are (this is since some formats differ depending on how many authors there are). Each individual case is separated by @@ and contains instructions on how to format each author in the case. These instructions are separated by a @.
Cases are identified using integers (1, 2, 3, etc.) or the character * (matches any number of authors) and will tell the formatter to apply the following instructions if there are a number of less or equal of authors given.
Ranges are either
<integer>..<integer>
,
<integer>
or the character *
using a 1 based index for indexing authors from the given list
of authors. Integer indexes can be negative to denote them to
start from the end of the list where -1 is the last author.
For instance with an authorlist of "Joe Doe and Mary Jane and Bruce Bar and Arthur Kay":
The <format>
-strings use the Bibtex
formatter format:
The four letters v, f, l, j indicate the name parts von, first, last, jr which are used within curly braces. A single letter v, f, l, j indicates that the name should be abbreviated. If one of these letters or letter pairs is encountered JabRef will output all the respective names (possibly abbreviated), but the whole expression in curly braces is only printed if the name part exists.
For instance if the format is "{ll} {vv {von Part}} {ff}" and the names are "Mary Kay and John von Neumann", then JabRef will output "Kay Mary" (with two space between last and first) and "Neuman von von Part John".
I give two examples but would rather point you to the bibtex documentation.
Small example: "{ll}, {f.}"
will turn
"Joe Doe"
into "Doe, J."
Large example:
To turn:
"Joe Doe and Mary Jane and Bruce Bar and Arthur Kay"
into
"Doe, J., Jane, M., Bar, B. and Kay, A."
you would use
1@*@{ll}, {f}.@@2@1@{ll}, {f}.@2@ and {ll}, {f}.@@*@1..-3@{ll}, {f}., @-2@{ll}, {f}.@-1@ and {ll}, {f}.
If somebody would like to write a better tutorial about this: Write a mail to one of the JabRef mailinglists!
Some static output might only make
sense if a specific field is set. For instance, say we want to
follow the editor names with the text (Ed.)
. This
can be done with the following text:
\format[HTMLChars,AuthorFirstFirst]{\editor}
(Ed.)
However, if the editor
field has not been set -
it might not even make sense for the entry being exported - the
(Ed.)
would be left hanging. This can be prevented
by instead using the \begin
and \end
commands:
\begin{editor}
\format[HTMLChars,AuthorFirstFirst]{\editor} (Ed.)
\end{editor}
The \begin
and \end
commands make
sure the text in between is printed if and only if the field
referred in the curly braces is defined for the ently being
exported.
Note: Use of the \begin
and
\end
commands is a key to creating layout files
that work well with a variety of entry types.
If you wish to separate your entries into groups based on a certain field, use the grouped output commands. Grouped output is very similar to conditional output, except that the text in between is printed only if the field referred in the curly braces has changed value.
For example, let's assume I wish to group by keyword. Before exporting the file, make sure you have sorted your entries based on keyword. Now use the following commands to group by keyword:
\begingroup{keywords}New Category:
\format[HTMLChars]{\keywords}
\endgroup{keywords}
With external layout files, it's fairly simple to share custom export formats between users. If you write an export filter for a format not supported by JabRef, or an improvement over an existing one, we encourage you to post your work on our SourceForge.net page. The same goes for formatter classes that you write. We'd be happy to distribute a collection of submitted layout files, or to add to the selection of standard export filters and formatters.
Starting with JabRef 2.4b1 you can also package your
ExportFormat or LayoutFormatter as a plug-in. If you do so,
you can provide a single zip-file to other user to make use
of your ExportFormat. For an example download the JabRef
source release and have a look at the directory
src/plugins/
. Don't hesitate to stop by the
forums on Sourceforge, since we don't have extensive documentation, yet.