Hope to see you there!
Hope to see you there!
Apache™ FOP uses Liang's hyphenation algorithm, well known from TeX. It needs language specific pattern and other data for operation.
Because oflicensing issues (and for convenience), all hyphenation patterns for FOP are made available through theObjects For Formatting Objects project.
Many of the hyphenation files distributed with TeX and its offspring are licenced under theLaTeX Project Public License (LPPL), which prevents them from being distributed with Apache software. The LPPL puts restrictions on file names in redistributed derived works which we feel can't guarantee. Some hyphenation pattern files have other or additional restrictions, for example against use for commercial purposes.
Although Apache FOP cannot redistribute hyphenation pattern files that do not conform with its license scheme, that does not necessarily prevent users from using such hyphenation patterns with FOP. However, it does place on the user the responsibility for determining whether the user can rightly use such hyphenation patterns under the hyphenation pattern license.
The most important source of hyphenation pattern files is theCTAN TeX Archive.
To install a custom hyphenation pattern for use with FOP:
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.
Name this new file following this schema: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 followsISO 639 (languages) andISO 3166 (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)
There are basically three ways to make the FOP-compatible hyphenation pattern file(s) accessible to FOP:
Download the precompiled JAR fromOFFO 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 variableFOP_HYPHENATION_PATH).
Download the desired FOP-compatible hyphenation pattern file(s) fromOFFO, 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 variableuser.hyph.dir to point to that directory (inbuild-local.properties),and run Ant with build targetjar-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 theuser.hyph.dir variable, this JAR will automatically be created from the supplied pattern(s)).
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
If you would like to build your own hyphenation pattern files, or modify existing ones, this section 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. SeeOFFO's Hyphenation page for examples. Here is a brief explanation of the contents of FOP's hyphenation patterns:
The root of the pattern file is the
before: the minimum number of characters in a word allowed to exist on a line immediately preceding a hyphenated word-break.
after: the minimum number of characters in a word allowed to exist on a line immediately after a hyphenated word-break.This element is unused and not even read. It should be considered a documentation for parameters used during pattern generation.
non-numeric characters represent characters in a sub-word to be evaluated
the period character (.) represents a word boundary, i.e. either the beginning or ending of a word
numeric characters represent a scoring system for indicating the acceptability of a hyphen in this location. Odd numbers represent an acceptable location for a hyphen, with higher values overriding lower inhibiting values. Even numbers indicate an unacceptable location, with higher values overriding lower values indicating an acceptable position. A value of zero (inhibiting) is implied when there is no number present. Generally patterns are constructed so that valuse greater than 4 are rare. Due to a bug currently patterns with values of 8 and greater don't have an effect, so don't wonder.Here are some examples from the English patterns file:
Knuth (The TeXBook, Appendix H) uses the examplehach4, which indicates that it is extremely undesirable to place a hyphen after the substring "hach", for example in the word "toothach-es".
.leg5e indicates that "leg-e", when it occurs at the beginning of a word, is a very good place to place a hyphen, if one is needed. Words like "leg-end" and "leg-er-de-main" fit this pattern.Note that the algorithm that uses this data searches for each of the word's substrings in the patterns, and chooses thehighest value found for letter combination.
If you want to convert a TeX hyphenation pattern file, you have to undo the TeX encoding for non-ASCII text. FOP uses Unicode, and the patterns must be proper Unicode too. You should be aware of the XML encoding issues, preferably use a good Unicode editor.
Note that FOP does not do Unicode character normalization. If you use combining chars for accents and other character decorations, you must declare character classes for them, and use the same sequence of base character and combining marks in the XSLFO source, otherwise the pattern wouldn't match. Fortunately, Unicode provides precomposed characters for all important cases in common languages, until now nobody run seriously into this issue. Some dead languages and dialects, especially ancient ones, may pose a real problem though.
If you want to generate your own patterns, an open-source utility called patgen can be used to assist in creating pattern files from dictionaries. It is available in many Unix/Linux distributions and every TeX distribution. Pattern creation for languages like english or german is an art. Read Frank Liang's original paper"Word Hy-phen-a-tion by Com-pu-ter" (yes, with hyphens) for details. The original patgen.web source, included in the TeX source distributions, contains valuable comments, unfortunately technical details often obscure the high level issues. Another important source of information isThe TeX Book, appendix H (either read the TeX source, or run it through TeX to typeset it). Secondary articles, for example the works by Petr Sojka, may also give some much needed insight into problems arising in automated hyphenation.
Copyright © 2025 The Apache Software Foundation, Licensed undertheApache License, Version 2.0.
Apache, Apache XML Graphics, Apache FOP, Apache Batik, the Apache logo, and theApache XML Graphics logos are trademarks ofThe ApacheSoftware Foundation. All other marks mentioned may be trademarks or registeredtrademarks of their respective owners.