Changes

Jump to navigation Jump to search
6,685 bytes added ,  13:26, 9 August 2020
m
Text replacement - "</cmd>" to "}}"
{{note|This page is NOT finished yet}}
 
'''This page is at the very initial stages of development: Please do not change it yet unless you know the topic well!'''
 
[[LuaTeX]] and [[MkIV]] allow advanced usage and manipulation of [[Open Type]] <i>open-type features</i>. Some features, such as <i>onum</i> (oldstyle) and <i>smcp</i> (smallcaps) are known to most users of Open Type fonts, and virtually every open type font has default features for kerning (<i>kern</i>) and ligatures (<i>liga</i>). More advanced OT fonts can have lots more, including the Stylistic Set feature <i>ss<nn></i> (where <i>nn</i> 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: ''metafeatureset'' 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 (<i>onum</i>, <i>smcp</i>, etc.) and in MkIV are associated with a keyval that turns it on ("yes") or off ("no"). For example, '[onum=yes]' turns on the lookup substitutions in the font which replace a line numeral with an oldstyle one. 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".  == Featuresets == A featureset is a composed of a set of open-type features. Featuresets are specified using {{cmd|definefontfeature}}. For each given body font in the typeface we specify the ''global'' default set of <i>open-type</i> 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: <texcode>\definefontfeature [schola-preset] [mode=node,script=latn,language=dflt,kern=yes,liga=yes,lnum=yes] </texcode> {{cmd|definefontfeature}}
All other open-type features in the font are not included in the processing.
== Open-type Now when we want to change the default, we use {{cmd|definefontfeature}} to specify local featuresets. The command {{cmd|feature ==}} and its siblings is then used to control the action of those featuresets. Here are the commands:
<texcode>
\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[>]
\resetfeature \feature[reset] \feature[<]
</texcode>
The open-type features There are specified in the font and are composed actually only six commands: Each row includes a set 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 (<i>onum</i>, <i>smcp</i>, 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"three synonyms for one command.
Meta-features are specified using <cmd>\definefontfeature</cmd>. In the preamble to our document, an environment = Sample file, or even in with examples = Let us now go through a typescript complete sample file; we specify the default set of <i>open-type</i> features to be usedwith examples. For example, using TeX-Gyre Schola we can specify the following Let us first define our global default open-type featuresfeatureset and activate it with a typescript:
<texcode>
[schola-preset]
[mode=node,script=latn,language=dflt,kern=yes,liga=yes,lnum=yes]
 
 
\starttypescript [serif] [schola-preset] [name]
\definefontsynonym [Serif] [name:texgyreschola-regular.otf][features=schola-preset]
\stoptypescript
 
\starttypescript [serif] [schola-preset] [size]
\definebodyfont
[35.8pt,29.8pt,24.8pt,20.7pt,17.3pt,14.4pt,12pt,11pt,10pt,9pt,8pt]
[rm]
[tf=Serif sa 1]
\stoptypescript
 
\starttypescript [schola-default]
\definebodyfontenvironment
[schola-default]
[default]
[interlinespace=2.7ex]
\definetypeface [schola-default] [rm] [serif] [schola-preset] [schola-preset] % [default]
\stoptypescript
\usetypescript[schola-default]
\setupbodyfont[schola-default,12pt]
</texcode>
 
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 {{cmd|definefontfeature}} to specify featuresets. The command {{cmd|feature}} and its siblings is then used to control the action of those featuresets.
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 featuresets. TeX-Gyre Schola has a decent set of open-type features. Using a few of them, let us set up a few featuresets:
 
<texcode>
\definefontfeature[f:smallcaps] [smcp=yes]
\definefontfeature[f:thinimacron] [ss04=yes]
\definefontfeature[f:upsidedown] [dlig=yes]
</texcode>
 
Above, all of our featuresets are mapped to open-type features that plug into the stack.
 
<texcode>
\definefontfeature[f:newstyle] [onum=no]
\definefontfeature[f:nocaps] [smcp=no]
\definefontfeature[f:wideimacron] [ss04=no]
\definefontfeature[f:rightsideup] [dlig=no]
</texcode>
 
We can also be redundant to the default open-type feature set:
 
<texcode>
\definefontfeature[f:ligatures] [liga=yes]
\definefontfeature[f:noligatures] [liga=no]
</texcode>
<cmd>definefontfeature</cmd>Of course, a featureset set can include more than one open-type feature. In advanced applications this will be the norm:
<texcode>\definefontfeature[f:oldstyle] [onum=yes,lnum= Stacking and unstacking features ==no]</texcode>
<cmd>NOTE: In this case we have to specify 'lnum=no' because it is already defined in our default feature</cmd><cmd>addfeature</cmd><cmd>subtractfeature</cmd><cmd>replacefeature</cmd><cmd>resetandaddfeature</cmd><cmd>revivefeature</cmd><cmd>resetfeature</cmd>set in the preamble etc. The order of lookups in the font itself could conceivably have an impact as well.
<texcode>
\addfeature definefontfeature[f:mineoldstyleupsidedown] \feature [more][f:mine] \feature[+][f:mineonum=yes,dlig=yes]\subtractfeature definefontfeature[f:mine] \feature [lessnewstylerightsideup][f:mine] \feature[-][f:mine]\replacefeature [f:mine] \feature [new][f:mine] \feature[onum=no,dlig=][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[<no]
</texcode>
 
Above, each featureset is mapped to an open-type feature set that plugs into or unplugs from the stack. But we can mix things up:
 
<texcode>
\definefontfeature[f:oldstylewmacron] [ss04=no,onum=yes]
\definefontfeature[f:newstylesmallcaps] [smcp=yes,onum=no]
</texcode>
 
The above two illustrate the point that featuresets 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 featuresets in action. Note the use of synonyms in both the activated code and in the comments:
 
<texcode>
\definefontfeature
[schola-preset]
[mode=node,script=latn,language=dflt,kern=yes,liga=yes,lnum=yes]
 
\starttypescript [serif] [schola-preset] [name]
\definefontsynonym [Serif] [name:texgyreschola-regular.otf][features=schola-preset]
\stoptypescript
 
\starttypescript [serif] [schola-preset] [size]
\definebodyfont
[35.8pt,29.8pt,24.8pt,20.7pt,17.3pt,14.4pt,12pt,11pt,10pt,9pt,8pt]
[rm]
[tf=Serif sa 1]
\stoptypescript
 
\starttypescript [schola-default]
\definebodyfontenvironment
[schola-default]
[default]
[interlinespace=2.7ex]
\definetypeface [schola-default] [rm] [serif] [schola-preset] [schola-preset] % [default]
\stoptypescript
 
\usetypescript[schola-default]
\setupbodyfont[schola-default,12pt]
 
\definefontfeature[f:smallcaps] [smcp=yes]
\definefontfeature[f:thinimacron] [ss04=yes]
\definefontfeature[f:upsidedown] [dlig=yes]
 
 
\definefontfeature[f:newstyle] [onum=no]
\definefontfeature[f:nocaps] [smcp=no]
\definefontfeature[f:wideimacron] [ss04=no]
\definefontfeature[f:rightsideup] [dlig=no]
 
 
\definefontfeature[f:ligatures] [liga=yes]
\definefontfeature[f:noligatures] [liga=no]
 
\definefontfeature[f:oldstyle] [onum=yes,lnum=no]
 
\definefontfeature[f:oldstyleupsidedown] [onum=yes,dlig=yes]
\definefontfeature[f:newstylerightsideup] [onum=no,dlig=no]
 
\definefontfeature[f:oldstylewmacron] [ss04=no,onum=yes]
\definefontfeature[f:newstylesmallcaps] [smcp=yes,onum=no]
 
\defineparagraphs[X][n=2, rule=on, width=10cm]
 
\startTEXpage[offset=10pt]
 
\define\SAMPLE{123 Idrīs ?` !` VA fi}
 
\startX
A) \SAMPLE\blank
 
\feature[+][f:oldstyle] B) \SAMPLE \blank
\feature[more][f:thinimacron] C) \SAMPLE \blank
\addfeature[f:upsidedown] D) \SAMPLE \blank
 
\feature[+][f:smallcaps] E) \SAMPLE \blank
\nextX
\addfeature[f:wideimacron] F) \SAMPLE \blank
 
\feature[-][f:upsidedown] G) \SAMPLE \blank
 
\feature[=][f:oldstyleupsidedown] H) \SAMPLE \blank
 
\feature[!][f:smallcaps] I) \SAMPLE \blank
 
\feature[<] J) \SAMPLE \blank
\stopX
\stopTEXpage
</texcode>
 
Now let us review the results:
 
[[Image:Adding-featuresets.png]]
 
Finally, we can mix featuresets using comma-separated lists. Here is an example:
 
<texcode>
\setupbodyfont[pagella]
\starttext
 
test 123 {\feature[+][smallcaps,oldstyle] test 123}
\stoptext
</texcode>
 
You will also note that context already has some common featuresets predefined.
 
== Note ==
An earlier version of this functionality was contained in the commands
 
<texcode>
\addff{featureset} % Add absolute font-feature set -- replaces default set
\subff{featureset} % Subtract absolute font-feature set -- replaces default set
\addfs{featureset} % Add font-feature set on top of current stack
\subfs{featureset} % Subtract font-feature set from current stack
</texcode>
 
These have now been deprecated and, presumably, will eventually disappear.
= References =
See also [[Fonts in LuaTeX]]
<references/>
[[Category:Fonts]]
[[Category:InternationalTools]][[Category:LuaTeX]] {{note|This page is NOT finished yet}}

Navigation menu