From Wiki
Revision as of 14:59, 21 March 2013 by Ishamid (talk | contribs) (A description of the new \feature commands)
Jump to navigation Jump to search

NOTE: This page is NOT finished yet

LuaTeX and MkIV allow advanced usage and manipulation of Open Type open-type features. Some features, such as onum (oldstyle) and smcp (smallcaps) are known to most users of Open Type fonts, and virtually every open type font has default features for kerning (kern) and ligatures (liga). More advanced OT fonts can have lots more, including the Stylistic Set feature ss<nn> (where nn stands for any numeral between 01 and 99).

Features in general

In MkIV there are two kinds of font feature directly visible to the user: meta-feature and open-type feature.

Open-type features

The open-type features are specified in the font and are composed of individual "lookups" which specify each substitution and positioning action to be performed in the processing. These open-type features are plugged in and out of the "stack" of lookups to be processed in the MkIV open type handler. These features are represented by a 4-character name (onum, smcp, etc.) and in MkIV are associated with a keyval that turns it on ("yes") or off ("no"). For example, '[onum=yes]'. Here the key 'yes' means "include open-type feature onum into the processed stack"; the key 'no' means "do not include open-type feature onum in the processed stack".


A meta-feature is a composed of a set of open-type features. Meta-features are specified using \\definefontfeature. For each given body font in the typeface we specify the global default set of open-type features to be used for that font. This is usually done in the preamble to our document, an environment file, or a typescript file, or the like.

For example, using TeX-Gyre Schola we can specify the following default, global set open-type features in the preamble:



All other open-type features in the font are not included in the processing.

Now when we want to change the default, we use \\definefontfeature to specify local meta-features. The command \feature and its siblings is then used to control the action of those meta-features. Here are the commands:

\addfeature        [f:mine]  \feature [more][f:mine]  \feature[+][f:mine]
\subtractfeature   [f:mine]  \feature [less][f:mine]  \feature[-][f:mine]
\replacefeature    [f:mine]  \feature  [new][f:mine]  \feature[=][f:mine]
\resetandaddfeature[f:mine]  \feature[local][f:mine]  \feature[!][f:mine]
\revivefeature     [f:mine]  \feature  [old][f:mine]  \feature[>][f:mine]
\resetfeature                \feature[reset]          \feature[<]

There are actually only six commands: Each row includes a set of three synonyms for one command.

Sample file with examples

Let us now go through a complete sample file with examples. Let us first define our global default meta-feature and activate it with a typescript:


\starttypescript [serif] [schola-preset] [name]
\definefontsynonym [Serif] [name:texgyreschola-regular.otf][features=schola-preset]

 \starttypescript [serif] [schola-preset] [size]
     [tf=Serif sa 1]

 \starttypescript [schola-default] 
\definetypeface [schola-default] [rm] [serif] [schola-preset] [schola-preset] % [default]

In the above note that we start with just a global, default feature set of kerns, ligatures, and line numerals.

Now when we want to change the default, we use \\definefontfeature to specify meta-features. The command \feature and its siblings is then used to control the action of those meta-features.

At this stage which open-type feature is being plugged into or unplugged from the stack is invisible to the user. We just speak in terms of meta-features. TeX-Gyre Schola has a decent set of open-type features. Using a few of them, let us set up a few meta-features:

\definefontfeature[f:smallcaps]   		[smcp=yes]
\definefontfeature[f:thinimacron] 		[ss04=yes]
\definefontfeature[f:upsidedown] 		[dlig=yes]

Above, all of our meta-features are mapped to open-type features that plug into the stack.

\definefontfeature[f:newstyle]			[onum=no]
\definefontfeature[f:nocaps]       		[smcp=no]
\definefontfeature[f:wideimacron]  		[ss04=no]
\definefontfeature[f:rightsideup] 		[dlig=no]

We can also be redundant to the default open-type feature set:

\definefontfeature[f:ligatures] 		[liga=yes]
\definefontfeature[f:noligatures] 		[liga=no]

Of course, a meta-feature set can include more than one open-type feature. In advanced applications this will be the norm:

\definefontfeature[f:oldstyle]			[onum=yes,lnum=no]

NOTE: In this case we have to specify 'lnum=no' because it is already defined in our default feature set in the preamble etc. Depending on the order of lookups in the font one has to watch out for this.

\definefontfeature[f:oldstyleupsidedown]	[onum=yes,dlig=yes]
\definefontfeature[f:newstylerightsideup]	[onum=no,dlig=no]

Above, each meta-feature is mapped to an open-type feature set that plugs into or unplugs from the stack. But we can mix things up:

\definefontfeature[f:oldstylewmacron]	[ss04=no,onum=yes]
\definefontfeature[f:newstylesmallcaps]	[smcp=yes,onum=no]

The above two illustrate the point that meta-features hide from the user which actual open-type features are being plugged into or unplugged from the stack.

Now let's put some of the above meta-features in action. Note the use of synonyms in both the activated code and in the comments:


\define\SAMPLE{123 Idrīs ?` !` VA fi}


% Adding

\feature[+][f:oldstyle] 		\SAMPLE \blank
\feature[more][f:thinimacron] 	\SAMPLE \blank
\addfeature[f:upsidedown] 		\SAMPLE \blank

\feature[+][f:smallcaps] 		\SAMPLE \blank
% \feature[more][f:smallcaps]		\SAMPLE \blank
\addfeature[f:wideimacron] 		\SAMPLE \blank

% Subtracting

\feature[-][f:upsidedown] 		\SAMPLE \blank
% \feature[less][f:upsidedown] 		\SAMPLE \blank
% \subtractfeature[f:upsidedown] 		\SAMPLE \blank

% Replace all features, including the default set defined in the preamble. Note that kerning is now gone!

\feature[=][f:oldstyleupsidedown] 		\SAMPLE \blank
% \feature[new][f:oldstyleupsidedown] 		\SAMPLE \blank
% \replacefeature[=][f:oldstyleupsidedown]	\SAMPLE \blank

% Let's reset and get the original default set back and add smallcaps:

\feature[!][f:smallcaps] 			\SAMPLE \blank
% \feature[!][f:noligatures] 			\SAMPLE \blank
% \resetandaddfeature[!][f:noligatures]	\SAMPLE \blank

% Let's revive one of the old meta-features

\feature[>][f:upsidedown] 		\SAMPLE \blank
% \feature[old][f:upsidedown] 		\SAMPLE \blank
% \revivefeature[f:upsidedown]	\SAMPLE \blank

% Let's get the original default set back.

\feature[<]		\SAMPLE \blank 
% \feature[reset]		\SAMPLE \blank 
% \resetfeature		\SAMPLE \blank 


Now let us review the results:


An earlier version of this functionality was contained in the commands

\addff{} \subff{} \addfs{} \subfs{}

These have now been deprecated and presumably will presumably disappear eventually.


See also Fonts in LuaTeX