% language=us % \enabletrackers[typesetters.italics] % We need to make sure that this works ok, also in future versions % so we add some more (re)settings than needed. \startcomponent hybrid-italics \environment hybrid-environment \ctxcommand{pushitaliccorrection()} \startchapter[title={Italic correction}] \component hybrid-note \startsection [title={Introduction}] During the 2011 \CONTEXT\ conference there were presentations by Thomas Schmitz and Jano Kula where they demonstrated advanced rendering of document source encoded in \XML. When looking at the examples on screen using many fonts I realized that (also given my own workflows) it was about time to look into automated italic correction in the perspective of \MKIV. In the Lucida Math project it already became clear that italics in \OPENTYPE\ math fonts are to be ignored. And, as in regular \OPENTYPE\ fonts italic correction is basically non|-|existent some alternative approach is needed there as well. In \CONTEXT\ you can already for quite a while enable the \type {itlc} feature which adds italic correction to shapes using some heuristics. However, in \TEX\ this kind of correction is never applied automatically but is triggered by the \type {\/} command. Commands like \type {\em} deal with italic correction automatically but otherwise you need to take care of it yourself. In a time when you not always have control over the source code or when you are coding in a format that has no provisions for it (for instance \XML) some further automatism makes sense. You might even wonder if explicit corrections still make sense. In this chapter we discuss an alternative approach in \MKIV. This is a typical example of an experimental feature that might need further discussion (probably at a next conference). One of our mottos is that the document source should be as clean as possible and this is one way to go. \stopsection \startsection [title={Some preparations}] Adding italic correction to a font is easy: you just add the right feature directive. You can do this for all italic (or oblique) fonts in one go: \starttyping \definefontfeature[default][default][itlc=yes] \stoptyping At some point this might become the default in \CONTEXT. After that the \type {\/} command can do the job, but as mentioned, we don't really want to do this each time it's needed. If you never plan to use that command you can disable \TEX's built|-|in mechanism completely by setting the \type {textitalics} parameter. \starttyping \definefontfeature[default][default][itlc=yes,textitalics=yes] \stoptyping It even makes sense then to redefine the the \type {\/} command: \starttyping \let\/=/ \stoptyping so that we have a nice escape in tune with the other escapes. \stopsection \startsection [title={Controlling correction}] In the following examples we will use Cambria as an example as it shows the effect rather prominently. \startbuffer[setups] \definefontfeature[itclyes][default][itlc=yes,textitalics=no] \definefont[itlcregular] [name:cambria*itclyes sa 4] \definefont[itlcbold] [name:cambriabold*itclyes sa 4] \definefont[itlcitalic] [name:cambriaitalic*itclyes sa 4] \definefont[itlcbolditalic][name:cambriabolditalic*itclyes sa 4] \stopbuffer \getbuffer[setups] \let\/=\italiccorrection % to be sure \defineframed[ITLCexampleA][frame=off,foregroundcolor=white,background=color,backgroundcolor=red] \defineframed[ITLCexampleB][frame=off,foregroundcolor=white,background=color,backgroundcolor=blue] \defineframed[ITLCexampleC][frame=off,foregroundcolor=white,background=color,backgroundcolor=green] \defineframed[ITLCexampleD][frame=off,foregroundcolor=white,background=color,backgroundcolor=yellow] \defineframed[ITLCexampleE][frame=off,foregroundcolor=white,background=color,backgroundcolor=gray] We start with a simple case: just an emphasized word in a small line: \starttyping \setupitaliccorrection[none]\tf test {\it test} test \setupitaliccorrection[none]\tf test {\it test\/} test} \setupitaliccorrection[text]\tf test {\it test} test} \stoptyping Decorated for the purpose of this demonstration this comes out as follows: \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \ITLCexampleA{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test} test} \par \ITLCexampleB{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test\/} test} \par \ITLCexampleC{\setupitaliccorrection[text]\itlcregular test {\itlcitalic test} test} \par \egroup \stoplinecorrection In the first line no correction is applied. The second line shows \TEX\ in action and the third line demonstrates the automatically applied correction. The explicit directive in the second lines of course gives most control but is also a no|-|go when you have lots of them. Actually, \TEX\ is clever enough to ignore multiple corrections: it will only apply one after a glyph. \starttyping \setupitaliccorrection[none]\tf test {\it test} test} \setupitaliccorrection[none]\tf test {\it test\/} test} \setupitaliccorrection[none]\tf test {\it test\/\/\/\/} test} \stoptyping So we get this: \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \ITLCexampleA{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test} test} \par \ITLCexampleB{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test\/} test} \par \ITLCexampleC{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test\/\/\/\/} test} \par \egroup \stoplinecorrection It can be argued that in a decent usage of \CONTEXT\ you will never switch to another font this way. Instead you will do this: \starttyping \definehighlight[important][style=\it] test \important{test} test \stoptyping However, this will not correct at all, so in fact you have to use an environment that takes care of automatically adding the \type {\/} at the end. Quite from the start the \type {\em} command does this, with the added benefit of dealing with bold and nested emphasizing. Which brings us to cases where you don't want to apply correction, like: \starttyping \setupitaliccorrection[none]\tf test {\it test}{\bi test} \setupitaliccorrection[none]\tf test {\it test\/}{\bi test} \setupitaliccorrection[text]\tf test {\it test}{\bi test} \stoptyping Now we get: \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \ITLCexampleA{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test}{\itlcbolditalic test}} \par \ITLCexampleB{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test\/}{\itlcbolditalic test}} \par \ITLCexampleC{\setupitaliccorrection[text]\itlcregular test {\itlcitalic test}{\itlcbolditalic test}} \par \egroup \stoplinecorrection A variant on this is: \starttyping \setupitaliccorrection[none]\tf test {\it test \bi test} \setupitaliccorrection[none]\tf test {\it test\/ \bi test} \setupitaliccorrection[text]\tf test {\it test \bi test} \stoptyping which gives: \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \ITLCexampleA{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test \itlcbolditalic test}} \par \ITLCexampleB{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test\/ \itlcbolditalic test}} \par \ITLCexampleC{\setupitaliccorrection[text]\itlcregular test {\itlcitalic test \itlcbolditalic test}} \par \egroup \stoplinecorrection So, no italic correction is added between italic shapes of different fonts. Ideally we should have some inter|-|character kerning, but that is currently beyond this mechanism. What does the \type {text} mean in the setup command? The following table tells what keywords can be passed: \starttabulate \NC \type {text} \NC only apply correction to running text \NC \NR \NC \type {always} \NC also apply correction to end end of a list \NC \NR \NC \type {global} \NC enable this mechanism globally (more efficient) \NC \NR \NC \type {none} \NC disable this mechanism \NC \NR \stoptabulate The difference between \type {text} and \type {always} is best demonstrated with an example: \starttyping \setupitaliccorrection[none]\tf test {\it test}} \setupitaliccorrection[always]\tf test {\it test}} \setupitaliccorrection[text]\tf test {\it test}} \stoptyping This gives: \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \ITLCexampleA{\setupitaliccorrection[none]\itlcregular test {\itlcitalic test}} \par \ITLCexampleD{\setupitaliccorrection[always]\itlcregular test {\itlcitalic test}} \par \ITLCexampleC{\setupitaliccorrection[text]\itlcregular test {\itlcitalic test}} \par \egroup \stoplinecorrection The \type {always} option will flush pending corrections at a boundary, like the edge of a box (or line). Contrary to \TEX's italic corrections, the \MKIV\ variants are glue and they will disappear whenever \TEX\ likes to get rid of glue, for instance at line breaks. \footnote {There is some room for improvement here, for instance we can take penalties into account.} While writing this, we're still talking of an experimental setup so there might be extensions or changes to this mechanism. \footnote {For instance, I'm considering extending this mechanism to provide kerning between fonts, something for a rainy afternoon.} As it's just a guess you can influence the amount of automatic correction by specifying a factor. We show an exmaple of this. \startbuffer \definefontfeature[itclyes] [default][itlc=yes,textitalics=delay] \definefontfeature[itclyesten] [default][itlc=10, textitalics=delay] \definefontfeature[itclyeshundred][default][itlc=100,textitalics=delay] \definefont[itlcitalicyes] [name:cambriaitalic*itclyes sa 4] \definefont[itlcitalicten] [name:cambriaitalic*itclyesten sa 4] \definefont[itlcitalichundred] [name:cambriaitalic*itclyeshundred sa 4] \stopbuffer \typebuffer \getbuffer We show all three variants: \starttyping \setupitaliccorrection[text]\itlcregular test {\itlcitalicyes test} test\par \setupitaliccorrection[text]\itlcregular test {\itlcitalicten test} test\par \setupitaliccorrection[text]\itlcregular test {\itlcitalichundred test} test\par \stoptyping This becomes: \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \ITLCexampleA{\setupitaliccorrection[text]\itlcregular test {\itlcitalicyes test} test}\par \ITLCexampleB{\setupitaliccorrection[text]\itlcregular test {\itlcitalicten test} test}\par \ITLCexampleC{\setupitaliccorrection[text]\itlcregular test {\itlcitalichundred test} test}\par \egroup \stoplinecorrection \stopsection \startsection [title={Saving resources}] You can keep track of what gets done by enabling a tracker: \starttyping \enabletrackers[typesetters.italics] \stoptyping You will notice that there are occasional reports about correction being inserted, ignored and removed. As node lists are parsed there is some extra overhead, but not that much. The \TEX\ solution (using \type {\/}) is quit efficient because that command directly injects a kern without too much analysis. You can gain some efficiency for the automated variant by using the \type {global} option: \starttyping \setupitaliccorrection[always,global] \stoptyping Also, you can disable \TEX's mechanism effectively by not passing the italic information to the font machinery at all: \starttyping \definefontfeature[italics][default][itlc=yes,textitalics=yes] \stoptyping The \type {itlc} feature will tag the font for italic corrections but the \type {textitalics} option will make sure that this information is not passed to the \TEX\ font handler but kept private. As adding the italic corrections to a font takes memory and a little bit of extra load time, we can delay this process till it is really needed. \starttyping \definefontfeature[italics][default][itlc=yes,textitalics=delay] \stoptyping In this case the correction will be calculated when needed and cached for later usage. At some point this might become the default \CONTEXT\ behaviour. \stopsection \startsection [title={Math}] Italic correction in math plays a role when dealing with traditional \TEX\ fonts, where glyph dimensions can have a special meaning. However, in \OPENTYPE\ math the correction is mostly ignored. You can disable it altogether and let an alternative mechanism deal with it. This mechanism is still somewhat experimental but is controlled as follows: \starttyping \switchtobodyfont[xits] \setupmathematics[italics=no] test $a;b;a; b; f;$ test} \setupmathematics[italics=1] test $a;b;a; b; f;$ test} \setupmathematics[italics=2] test $a;b;a; b; f;$ test} \setupmathematics[italics=3] test $a;b;a; b; f;$ test} \setupmathematics[italics=4] test $a;b;a; b; f;$ test} \stoptyping This gives: \start \switchtobodyfont[xits,42pt] \stop \startlinecorrection[blank] \vbox \bgroup \offinterlineskip \enabletrackers[math.italics] \ITLCexampleE{\switchtobodyfont[xits,42pt]\setupmathematics[italics=no] test $a;b;a; b; f;$ test}\par \ITLCexampleA{\switchtobodyfont[xits,42pt]\setupmathematics[italics=1] test $a;b;a; b; f;$ test}\par \ITLCexampleB{\switchtobodyfont[xits,42pt]\setupmathematics[italics=2] test $a;b;a; b; f;$ test}\par \ITLCexampleC{\switchtobodyfont[xits,42pt]\setupmathematics[italics=3] test $a;b;a; b; f;$ test}\par \ITLCexampleD{\switchtobodyfont[xits,42pt]\setupmathematics[italics=4] test $a;b;a; b; f;$ test}\par \egroup \stoplinecorrection \disabletrackers[math.italics] The actual rendering can depend on the settings in the goodies file, for instance: \starttyping local italics = { defaultfactor = 0.025, disableengine = true, % feature: mathitalics=yes corrections = { -- [0x1D44E] = 0.99, -- a (fraction of quad) -- [0x1D44F] = 100, -- b (font points) [0x1D453] = -0.0375, -- f } } return { name = "xits-math", version = "1.00", comment = "Goodies that complement xits (by Khaled Hosny).", author = "Hans Hagen", copyright = "ConTeXt development team", mathematics = { italics = { ["xits-math"] = italics, }, } } \stoptyping Corrections can be specified in the font's units or as a fraction (smaller than 1) in which case it will be multiplied by \type {1em}. You can set the font feature \type {mathitalics} to \type {yes} to inhibit the engine's built|-|in mechanism completely and rely on the alternative approach but as users will seldom define math feature sets themselves, there is also the possibility to disable the engine in the goodies file. The process can be watched by setting a tracker: \starttyping \enabletrackers[math.italics] \stoptyping \stopsection \stopchapter \ctxcommand{popitaliccorrection()} \disabletrackers[typesetters.italics] \stopcomponent