Using VOLT: The substitution tool

A substitution lookup can be edited with the Substitution Tool one of 2 ways:

  • Double click on it in the main project window; or
  • Select it and press the 'Edit Lookup' button.

Lookup header

The lookup header occupies the top portion of the tool. The same kind of header is used in the Positioning Tool to describe positioning lookups.

The Substitution tool

The Substitution tool

The header contains the following fields:

  • Lookup name

  • Lookup type, which is set automatically for substitutions (you must specify the lookup type manually for positioning lookups); if substitutions entries have inconsistent types, this field will change to 'Unknown substitution' to alert you; attempts to compile such lookups will result in errors.

  • Process Marks, which define the lookup's behavior towards marks. Valid entries are:

    • ALL - all mark glyphs are processed
    • NONE - all mark glyphs are skipped by this lookup
    • Group name - only marks from this group will be processed, other marks are skipped.


    All marks groups used in this way in lookup headers have to be mutually exclusive. If you need to use this feature, it is advisable that you break the marks down into several separate groups beforehand, and then use these groups in lookup headers. The breaking into groups usually follows the geometrical position of marks (marks above, marks below etc.) and is similar to combining mark classes assigned by Unicode.

  • Process base glyphs - when off, all non-mark glyphs are skipped by the lookup.

  • Text Flow - valid entries are Left-To-Right (LTR) or Right-To-Left (RTL); affects the display (preview) of substitution/positioning operations, and the way glyphs are placed for positioning; set to RTL when working with languages such as Arabic or Hebrew.

List of substitutions

The list of substitutions consists of two columns: descriptions on the right and previews on the left. The descriptions use glyph names and groups to specify the substitution. The preview column displays the glyphs involved in the substitution.

All substitutions are defined in the following format: LeftHandSide -> RightHandSide. For example, 'Ampersand -> AlternativeAmpersand' could define a single or alternative substitution, and 'LatinSmallLetterF LatinSmallLetterI -> LatinSmallLigatureFI' could define a simple ligature.

A single menu option lets you order your substitutions, which is handy if you are dealing with large glyph sets. Read the caveat though: ordering by the first glyph generally will not change how the lookup is processed. But, if you are using groups in defining your substitutions (see below), complete ordering is impossible (the groups are not broken down), and the new ordering may have an effect on the lookup's behavior.

Use of groups in substitutions

Groups can be used in substitutions as a shorthand notation, meaning the substitution should be performed with each element of the group. Any group notation (a reference to a predefined group, a range or an enumeration) can be used (see the Group Tool section). At most, one glyph group can be used on each side of a substitution. If groups are used on each size of the substitution, their cardinalities have to match. Such substitution compiled into a series of substitutions, with groups substituted by subsequently the first, second and so on, members of the groups. For example, the substitution:

'[LatinSmallLetterA - LatinSmallLetterZ] -> [LatinSmallCapZ - LatinSmallCapZ]'

will be compiled into the series:

'LatinSmallLetterA -> LatinSmallCapA', 'LatinSmallLetterB -> LatinSmallCapB'

and so on.


Glyphs in groups are always ordered by their glyph IDs and not by the order implied from the way a group is described.

Using contexts

The bottom part of the substitution is for describing contexts. By using contexts, you declare that the substitutions above cannot happen anywhere the lookup is applied but only if surrounded by the specified contexts.