diff options
Diffstat (limited to 'doc/context/sources/general/manuals/hybrid/hybrid-italics.tex')
-rw-r--r-- | doc/context/sources/general/manuals/hybrid/hybrid-italics.tex | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex b/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex new file mode 100644 index 000000000..65eeccde3 --- /dev/null +++ b/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex @@ -0,0 +1,378 @@ +% language=uk + +% \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 |