Hyphenation

FOP uses Liang's hyphenation algorithm, well known from TeX. It needs
language specific patterns and other data for operation.

Because of licensing issues (and for convenience), all hyphenation
patterns for FOP are made available through the Objects For Formatting
Objects project <http://offo.sourceforge.net/hyphenation/index.html>.

To install a custom hyphenation pattern for use with FOP:

1. Convert the TeX hyphenation pattern file to the FOP format. The FOP
   format is an xml file conforming to the DTD found at
   {fop-dir}/hyph/hyphenation.dtd.

   The most important source of TeX hyphenation pattern files is the
   CTAN TeX Archive
   <http://www.ctan.org/tex-archive/language/hyphenation/>.

2. Name this new file following this scheme:
   languageCode_countryCode.xml. The country code is optional, and
   should be used only if needed. For example:
-  en_US.xml would be the file name for American English hyphenation
   patterns,
-  it.xml would be the file name for Italian hyphenation patterns.

   The language and country codes must match the XSL-FO input, which
   follows ISO 639
   <http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt>
   (languages) and ISO 3166
   <http://www.ics.uci.edu/pub/ietf/http/related/iso3166.txt>
   (countries).

   NOTE: The ISO 639/ISO 3166 convention is that language names are
   written in lower case, while country codes are written in upper
   case.

   FOP does not check whether the language and country specified in
   the FO source are actually from the current standard, but it relies
   on it being two letter strings in a few places. So you can make up
   your own codes for custom hyphenation patterns, but they should be
   two letter strings too (patches for proper handling extensions are
   welcome)

3. There are basically three ways to make the FOP-compatible
   hyphenation pattern file(s) accessible to FOP:

a. Download the precompiled JAR from OFFO
   <http://offo.sourceforge.net/hyphenation/index.html> and place it
   either in the {fop-dir}/lib directory, or in a directory of your
   choice (and append the full path to the JAR to the environment
   variable FOP_HYPHENATION_PATH).

b. Download the desired FOP-compatible hyphenation pattern file(s) from 
   OFFO <http://offo.sourceforge.net/hyphenation/index.html>, and/or
   take your self created hyphenation pattern file(s),
   - place them in the directory {fop-dir}/hyph,
   - or place them in a directory of your choice and set the Ant
	 variable user.hyph.dir to point to that directory (in
     build-local.properties),
   and run Ant with build target jar-hyphenation. This will create a
   JAR containing the compiled patterns in {fop-dir}/build that will
   be added to the classpath on the next run.

   When FOP is built from scratch, and there are pattern source
   file(s) present in the directory pointed to by the user.hyph.dir
   variable, this JAR will automatically be created from the supplied
   pattern(s).

c. Put the pattern source file(s) into a directory of your choice and
   configure FOP to look for custom patterns in this directory, by
   setting the hyphenation-dir configuration option.

   Either of these three options will ensure hyphenation is working
   when using FOP from the command-line. If FOP is being embedded,
   remember to add the location(s) of the hyphenation JAR(s) to the
   CLASSPATH (option 1 and 2) or to set the hyphenation-dir
   configuration option programmatically (option 3).

If you would like to build your own hyphenation pattern files, or
modify existing ones, the section entitled 'Hyphenation Patterns' of
the 'FOP: Hyphenation' page at the FOP web site
<http://xmlgraphics.apache.org/fop/hyphenation.html#patterns> will
help you understand how to do so. Even when creating a pattern file
from scratch, it may be beneficial to start with an existing file and
modify it. See OFFO's Hyphenation page
<http://offo.sourceforge.net/hyphenation/index.html> for examples.

If you have made improvements to an existing FOP hyphenation pattern,
or if you have created one from scratch, please consider contributing
these to OFFO so that they can benefit other FOP users as well.
Please inquire on the FOP User mailing list.

