diff options
author | Hans Hagen <pragma@wxs.nl> | 2018-05-12 01:19:03 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2018-05-12 01:19:03 +0200 |
commit | 77e216e323271fb85d508b7206b13c980540b74b (patch) | |
tree | 5b4053c2bbe5190e28c0dce89653c7b13aea0642 /doc/context/sources/general/manuals/onandon | |
parent | d817aef76ab8b606c02bd0636661b634b43a68a6 (diff) | |
download | context-77e216e323271fb85d508b7206b13c980540b74b.tar.gz |
2018-05-12 00:16:00
Diffstat (limited to 'doc/context/sources/general/manuals/onandon')
-rw-r--r-- | doc/context/sources/general/manuals/onandon/onandon-modern.tex | 1284 | ||||
-rw-r--r-- | doc/context/sources/general/manuals/onandon/onandon.tex | 20 |
2 files changed, 1302 insertions, 2 deletions
diff --git a/doc/context/sources/general/manuals/onandon/onandon-modern.tex b/doc/context/sources/general/manuals/onandon/onandon-modern.tex new file mode 100644 index 000000000..65b5d0490 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-modern.tex @@ -0,0 +1,1284 @@ +% language=uk + +% 284 instances, 234 shared in backend, 126 common vectors, 108 common hashes, load time 1.343 seconds + +%setupversion[alternative=concept,text={not corrected yet}] +\setupversion[alternative=file,text={not corrected yet}] + +\definebodyfontenvironment[24pt] + +\usemodule[fonts-effects] + +\startcomponent onandon-modern + +\environment onandon-environment + +\startchapter[title={Modern Latin}] + +\startsection[title={Introduction}] + +In \CONTEXT, already in \MKII, we have a feature tagged \quote {effects} that can +be used to render a font in outline or bolder versions. It uses some low level +\PDF\ directives to accomplish this and it works quite well. When a user on the +\CONTEXT\ list asked if we could also provide it as a font feature in the +repertoire of additional features in \CONTEXT, I was a bit reluctant to provide +that because it operates at another level than the glyph stream. Also, such a +feature can be abused and result in a bad looking document. However, by adding a +few simple options to the \LUATEX\ engine such a feature could actually be +achieved rather easy: it was trivial to implement given that we can influence +font handling at the \LUA\ end. In retrospect extended and pseudo slanted fonts +could be done this way too but there we have some historic ballast. Also, the +backend now handles such transformations very efficient because they are combined +with font scaling. Anyway, by adding this feature in spite of possible +objections, I could do some more advanced experiments. + +In the following pages I will demonstrate how we support effects as a feature in +\CONTEXT. Instead of simply applying some magic \PDF\ text operators in the +backend a more integrated approach is used. The difference with the normal effect +mechanism is that where the one described here is bound to a font instance while +the normal mechanism operates on the glyph stream. + +\stopsection + +\startsection[title={The basics}] + +\definefontsynonym[DemoSerif][file:lmroman10-regular] + +Let's start with a basic boldening example. First we demonstrate a regular Latin +Modern sample (using \type {ward.tex}): + +\startnarrower + \definedfont[DemoSerif*default] + \samplefile{ward} +\stopnarrower + +This font looks rather thin (light). Next we define an effect or \type {0.2} and +typeset the same sample: + +\startbuffer +\definefontfeature + [effect-1] + [effect=.2] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \definedfont[DemoSerif*default,effect-1] + \samplefile{ward} +\stopnarrower + +This simple call gives reasonable default results. But you can have more control +than this. The previous examples use the following properties: + +{\definedfont[DemoSerif*default,effect-1] \showfonteffect} + +\startbuffer +\definefontfeature + [effect-2] + [effect={width=.3}] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \definedfont[DemoSerif*default,effect-2] + \samplefile{ward} +\stopnarrower + +This time we use: + +{\definedfont[DemoSerif*default,effect-2] \showfonteffect} + +\startbuffer +\definefontfeature + [effect-3] + [effect={width=.3,delta=0.4}] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \showfontkerns + \definedfont[DemoSerif*default,effect-3] + \samplefile{ward} +\stopnarrower + +We have now tweaked one more property and show the fontkerns in order to see what +happens with them: + +{\definedfont[DemoSerif*default,effect-3] \showfonteffect} + +\startbuffer +\definefontfeature + [effect-4] + [effect={width=.3,delta=0.4,factor=0.3}] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \showfontkerns + \definedfont[DemoSerif*default,effect-4] + \samplefile{ward} +\stopnarrower + +An additional parameter \type {factor} will influence the way (for instance) +kerns get affected: + +{\definedfont[DemoSerif*effect-4] \showfonteffect} + +\stopsection + +\startsection[title=Outlines] + +There are four effects. Normally a font is rendered with effect \type {inner}. +The \type {outer} effect just draws the outlines while \type {both} gives a +rather fat result. The \type {hidden} effect hides the text. + +\startbuffer +\definefontfeature + [effect-5] + [effect={width=0.2,delta=0.4,factor=0.3,effect=inner}] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \showfontkerns + \definedfont[DemoSerif*default,effect-5] + \samplefile{ward} +\stopnarrower + +An inner effect is rather useless unless you want to use the other properties of +this mechanism. + +\startbuffer +\definefontfeature + [effect-6] + [effect={width=.2,delta=0.4,factor=0.3,effect=outer}] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \showfontkerns + \definedfont[DemoSerif*default,effect-6] + \samplefile{ward} +\stopnarrower + +\startbuffer +\definefontfeature + [effect-7] + [effect={width=.2,delta=0.4,factor=0.3,effect=both}] +\stopbuffer + +\typebuffer \getbuffer + +\startnarrower + \showfontkerns + \definedfont[DemoSerif*default,effect-7] + \samplefile{ward} +\stopnarrower + +\startbuffer +\definefontfeature + [effect-8] + [effect={width=.2,delta=0.4,factor=0.3,effect=hidden}, + boundingbox=yes] % to show something +\stopbuffer + +\typebuffer \getbuffer + +We also show the boundingboxes of the glyphs here so that you can see what you're +missing. Actually this text is still there and you can select it in the viewer. + +\startnarrower + \showfontkerns + \showglyphs + \definedfont[DemoSerif*default,effect-8] + \samplefile{ward} +\stopnarrower + +\stopsection + +\startsection[title=The logic] + +In order to support this I had to make some choices. The calculations involved +are best explained in terms of \CONTEXT\ font machinery. + +\startformula + \Delta _{\text{wd}} = \text{effect} _{\text{wdelta}} + \times \text{parameter}_{\text{hfactor}} + \times \text{effect} _{\text{width}} + \times 100 +\stopformula + +\startformula + \Delta _{\text{ht}} = \text{effect} _{\text{hdelta}} + \times \text{parameter}_{\text{vfactor}} + \times \text{effect} _{\text{width}} + \times 100 +\stopformula + +\startformula + \Delta _{\text{dp}} = \text{effect} _{\text{ddelta}} + \times \text{parameter}_{\text{vfactor}} + \times \text{effect} _{\text{width}} + \times 100 +\stopformula + +The factors in the parameter namespace are adapted according to: + +\startformula + \Delta _{\text{factor}} = \text{effect} _{\text{factor}} + \times \text{parameters}_{\text{factor}} +\stopformula + +\startformula + \Delta _{\text{hfactor}} = \text{effect} _{\text{hfactor}} + \times \text{parameters}_{\text{hfactor}} +\stopformula + +\startformula + \Delta _{\text{vfactor}} = \text{effect} _{\text{vfactor}} + \times \text{parameters}_{\text{vfactor}} +\stopformula + +The horizontal and vertical scaling factors default to the normal factor that +defaults to zero so by default we have no additional scaling of for instance +kerns. The width (wd), height (ht) and depth (dp) of a glyph are adapted in +relation to the line width. A glyph is shifted in its bounding box by half the +width correction. The delta defaults to one. + +\stopsection + +\startsection[title=About features] + +This kind of boldening has limitations especially because some fonts use +positioning features that closely relate to the visual font properties. Let's +give some examples. The most common positioning is kerning. Take for instance +these shapes: + +\startlinecorrection +\startMPcode + def SampleShapes(expr dx, offset, pw, k) = + picture p ; p := image ( + draw fullcircle scaled 1cm ; + draw fullsquare scaled 1cm shifted (dx+k,0) ; + draw point 8 of (fullcircle scaled 1cm) withcolor white ; + draw point 3.5 of (fullsquare scaled 1cm) shifted (dx+k,0) withcolor white ; + ) shifted (offset,0) ; + draw p withpen pencircle scaled pw ; + draw boundingbox p withcolor white ; + enddef ; + SampleShapes(15mm, 0mm,1mm,0mm) ; + SampleShapes(15mm, 40mm,2mm,0mm) ; + SampleShapes(17mm, 80mm,2mm,0mm) ; +\stopMPcode +\stoplinecorrection + +The first one is that we start with. The circle and square have a line width of +one unit and a distance (kern) of five units. The second pair has a line width of +two units and the same distance while the third pair has a distance of seven +units. So, in the last case we have just increased the kern with a value relative +to the increase of line width. + +\startlinecorrection +\startMPcode + SampleShapes(15mm, 0mm,1mm,0mm) ; + SampleShapes(15mm, 40mm,2mm,2mm) ; + SampleShapes(17mm, 80mm,2mm,2mm) ; +\stopMPcode +\stoplinecorrection + +In this example we have done the same but we started with a distance of zero. You +can consider this a kind of anchoring. This happens in for instance cursive +scripts where entry and exit points are used to connect shapes. In a latin script +you can think of a poor|-|mans attachment of a cedilla or ogonek. But what to do +with for instance an accent on top of a character? In that case we could do the +same as with kerning. However, when we mix styles we would like to have a +consistent height so maybe there scaling is not a good idea. This is why we can +set the factors and deltas explictly for vertical and horizontal movements. +However, this will only work well when a font is consistent in how it applies +these movements. In this case, if could recognize cursive anchoring (the last +pair in the example) we could compensate for it. + +\startMPinclusions + def SampleShapes(expr dx, offset, pw, k) = + picture p ; p := image ( + draw fullcircle scaled 1cm ; + draw fullsquare scaled 1cm shifted (dx+k,0) ; + draw point 8 of (fullcircle scaled 1cm) withcolor white ; + draw point 3.5 of (fullsquare scaled 1cm) shifted (dx+k,0) withcolor white ; + ) shifted (offset,0) ; + draw p withpen pencircle scaled pw ; + draw boundingbox p withcolor white ; + enddef ; +\stopMPinclusions + +\startlinecorrection +\startMPcode + SampleShapes(10mm, 0mm,1mm,0mm) ; + SampleShapes(10mm, 40mm,1mm,1mm) ; + SampleShapes(10mm, 80mm,2mm,0mm) ; + SampleShapes(10mm,120mm,2mm,2mm) ; +\stopMPcode +\stoplinecorrection + +So, an interesting extension to the positioning part of the font handler could be +to influence all the scaling factors: anchors, cursives, single and pair wise +positioning in both directions (so eight independent factors). Technically this +is no big deal so I might give it a go when I have a need for it. + +\stopsection + +\startsection[title=Some (extreme) examples] + +The last decade buying a font has become a bit of a nightmare simply because you +have to choose the weights that you need. It's the business model to not stick to +four shapes in a few weights but offer a whole range and each of course costs +money. + +Latin Modern is based on Computer Modern and is meant for high resolution rendering. +The design of the font is such that you can create instances but in practice that +isn't done. One property that let the font stand out is its bold which runs rather +wide. However, how about cooking up a variant? For this we will use a series of +definitions: + +\startbuffer +\definefontfeature[effect-2-0-0] + [effect={width=0.2,delta=0}] +\definefontfeature[effect-2-3-0] + [effect={width=0.2,delta=0.3}] +\definefontfeature[effect-2-6-0] + [effect={width=0.2,delta=0.6}] +\definefontfeature[effect-4-0-0] + [effect={width=0.4,delta=0}] +\definefontfeature[effect-4-3-0] + [effect={width=0.4,delta=0.3}] +\definefontfeature[effect-4-6-0] + [effect={width=0.4,delta=0.6}] +\definefontfeature[effect-8-0-0] + [effect={width=0.8,delta=0}] +\definefontfeature[effect-8-3-0] + [effect={width=0.8,delta=0.3}] +\definefontfeature[effect-8-6-0] + [effect={width=0.8,delta=0.6}] +\definefontfeature[effect-8-6-2] + [effect={width=0.8,delta=0.6,factor=0.2}] +\definefontfeature[effect-8-6-4] + [effect={width=0.8,delta=0.6,factor=0.4}] +\stopbuffer + +\typebuffer \getbuffer + +And a helper macro: + +\startbuffer +\starttexdefinition ShowOneSample #1#2#3#4 + %\testpage[5] + %\startsubsubsubject[title=\type{#1}] + \start + \definedfont[#2*#3 @ 10pt] + \setupinterlinespace + \startlinecorrection + \showglyphs \showfontkerns + \scale[sx=#4,sy=#4]{effective n\"ots} + \stoplinecorrection + \blank[samepage] + \dontcomplain + \showfontkerns + \margintext{\tt\txx\maincolor#1} + \samplefile{ward} + \par + \stop + %\stopsubsubsubject +\stoptexdefinition +\stopbuffer + +\typebuffer \getbuffer + +\starttexdefinition ShowSamples #1 + \startsubsubject[title=#1] + \start + \ShowOneSample{no effect} {#1}{default} {5} + \ShowOneSample{width=0.2\\delta=0} {#1}{default,effect-2-0-0}{5} + \ShowOneSample{width=0.2\\delta=0.3} {#1}{default,effect-2-3-0}{5} + \ShowOneSample{width=0.2\\delta=0.6} {#1}{default,effect-2-6-0}{5} + \ShowOneSample{width=0.4\\delta=0} {#1}{default,effect-4-0-0}{5} + \ShowOneSample{width=0.4\\delta=0.3} {#1}{default,effect-4-3-0}{5} + \ShowOneSample{width=0.4\\delta=0.6} {#1}{default,effect-4-6-0}{5} + \ShowOneSample{width=0.8\\delta=0} {#1}{default,effect-8-0-0}{5} + \ShowOneSample{width=0.8\\delta=0.3} {#1}{default,effect-8-3-0}{5} + \ShowOneSample{width=0.8\\delta=0.6} {#1}{default,effect-8-6-0}{5} + \ShowOneSample{width=0.8\\delta=0.6\\factor=0.2}{#1}{default,effect-8-6-2}{5} + \ShowOneSample{width=0.8\\delta=0.6\\factor=0.4}{#1}{default,effect-8-6-4}{5} + \stop + \stopsubsubject +\stoptexdefinition + +We show some extremes, using the font used in this document. so don't complain +about beauty here. + +\texdefinition{ShowSamples}{Serif} +\texdefinition{ShowSamples}{SerifBold} +\texdefinition{ShowSamples}{SerifItalic} +\texdefinition{ShowSamples}{SerifBoldItalic} +\texdefinition{ShowSamples}{Sans} + +\start + \setupalign[flushleft,broad,nothyphenated,verytolerant] + \texdefinition{ShowSamples}{Mono} +\stop + +\stopsection + +\startsection[title=Pitfall] + +The quality of the result depends on how the font is made. For instance, +ligatures can be whole shapes, replaced glyphs and|/|or repositioned +glyphs, or whatever the designer thinks reasonable. In \in {figure} +[fig:ligature-effects-mess] this is demonstrated. We use the following +feature sets: + +\startbuffer +\definefontfeature + [demo-1] + [default] + [hlig=yes] + +\definefontfeature + [demo-2] + [demo-1] + [effect=0.5] +\stopbuffer + +\typebuffer \getbuffer + +\startplacefigure[title={The effects on ligatures.},reference=fig:ligature-effects-mess] + \startcombination[1*3] + { \scale [scale=5000] { + \definedfont[texgyrepagellaregular*demo-1]fist effe + \par + \definedfont[texgyrepagellaregular*demo-2]fist effe + } } { + texgyre pagella regular + } { \scale [scale=5000] { + \definedfont[cambria*demo-1]fist effe + \par + \definedfont[cambria*demo-2]fist effe + } } { + cambria + } { \scale [scale=5000] { + \definedfont[ebgaramond12regular*demo-1]fist effe + \par + \definedfont[ebgaramond12regular*demo-2]fist effe + } } { + ebgaramond 12 regular + } + \stopcombination +\stopplacefigure + +Normally the artifacts (as in the fi ligature in ebgaramond as of 2018) will go +unnoticed at small sized. Also, when the user has a low res display, printer or +when the publishers is one of those who print a scanned \PDF\ the reader might +not notice it at all. Most readers don't even know what to look at. + +\stopsection + +\startsection[title=A modern Modern] + +So how can we make an effective set of Latin Modern that fits in todays look and +feel. Of course this is a very subjective experiment but we've seen experiments +with these fonts before (like these cm super collections). Here is an example of +a typescript definition: + +\starttyping +\starttypescriptcollection[modernlatin] + + \definefontfeature[lm-rm-regular][effect={width=0.15,delta=1.00}] + \definefontfeature[lm-rm-bold] [effect={width=0.30,delta=1.00}] + \definefontfeature[lm-ss-regular][effect={width=0.10,delta=1.00}] + \definefontfeature[lm-ss-bold] [effect={width=0.20,delta=1.00}] + \definefontfeature[lm-tt-regular][effect={width=0.15,delta=1.00}] + \definefontfeature[lm-tt-bold] [effect={width=0.30,delta=1.00}] + \definefontfeature[lm-mm-regular][effect={width=0.15,delta=1.00}] + \definefontfeature[lm-mm-bold] [effect={width=0.30,delta=1.00}] + + \starttypescript [serif] [modern-latin] + \definefontsynonym + [Serif] [file:lmroman10-regular] + [features={default,lm-rm-regular}] + \definefontsynonym + [SerifItalic] [file:lmroman10-italic] + [features={default,lm-rm-regular}] + \definefontsynonym + [SerifSlanted] [file:lmromanslant10-regular] + [features={default,lm-rm-regular}] + \definefontsynonym + [SerifBold] [file:lmroman10-regular] + [features={default,lm-rm-bold}] + \definefontsynonym + [SerifBoldItalic] [file:lmroman10-italic] + [features={default,lm-rm-bold}] + \definefontsynonym + [SerifBoldSlanted] [file:lmromanslant10-regular] + [features={default,lm-rm-bold}] + \stoptypescript + + \starttypescript [sans] [modern-latin] + \definefontsynonym + [Sans] [file:lmsans10-regular] + [features={default,lm-ss-regular}] + \definefontsynonym + [SansItalic] [file:lmsans10-oblique] + [features={default,lm-ss-regular}] + \definefontsynonym + [SansSlanted] [file:lmsans10-oblique] + [features={default,lm-ss-regular}] + \definefontsynonym + [SansBold] [file:lmsans10-regular] + [features={default,lm-ss-bold}] + \definefontsynonym + [SansBoldItalic] [file:lmsans10-oblique] + [features={default,lm-ss-bold}] + \definefontsynonym + [SansBoldSlanted] [file:lmsans10-oblique] + [features={default,lm-ss-bold}] + \stoptypescript + + \starttypescript [mono] [modern-latin] + \definefontsynonym + [Mono] [file:lmmono10-regular] + [features={default,lm-tt-regular}] + \definefontsynonym + [MonoItalic] [file:lmmono10-italic] + [features={default,lm-tt-regular}] + \definefontsynonym + [MonoSlanted] [file:lmmonoslant10-regular] + [features={default,lm-tt-regular}] + \definefontsynonym + [MonoBold] [file:lmmono10-regular] + [features={default,lm-tt-bold}] + \definefontsynonym + [MonoBoldItalic] [file:lmmono10-italic] + [features={default,lm-tt-bold}] + \definefontsynonym + [MonoBoldSlanted] [file:lmmonoslant10-regular] + [features={default,lm-tt-bold}] + \stoptypescript + + \starttypescript [math] [modern-latin] + \loadfontgoodies[lm] + \definefontsynonym + [MathRoman] [file:latinmodern-math-regular.otf] + [features={math\mathsizesuffix,lm-mm-regular,mathextra}, + goodies=lm] + \definefontsynonym + [MathRomanBold] [file:latinmodern-math-regular.otf] + [features={math\mathsizesuffix,lm-mm-bold,mathextra}, + goodies=lm] + \stoptypescript + + \starttypescript [modern-latin] + \definetypeface [\typescriptone] + [rm] [serif] [modern-latin] [default] + \definetypeface [\typescriptone] + [ss] [sans] [modern-latin] [default] + \definetypeface [\typescriptone] + [tt] [mono] [modern-latin] [default] + \definetypeface [\typescriptone] + [mm] [math] [modern-latin] [default] + \quittypescriptscanning + \stoptypescript + +\stoptypescriptcollection +\stoptyping + +We show some more samples now for which we use\type {zapf.tex}. + +\startbuffer + {\tf\samplefile{zapf}}\blank {\bf\samplefile{zapf}}\blank + {\it\samplefile{zapf}}\blank {\bi\samplefile{zapf}}\blank + {\sl\samplefile{zapf}}\blank {\bs\samplefile{zapf}}\blank +\stopbuffer + +\startsubsubsubject[title={\type{\switchtobodyfont[modern-latin,rm,10pt]}}] + \start + \switchtobodyfont[modern-latin,rm,10pt] + \getbuffer + \stop +\stopsubsubsubject + +\startsubsubsubject[title={\type{\switchtobodyfont[modern-latin,ss,10pt]}}] + \start + \switchtobodyfont[modern-latin,ss,10pt] + \getbuffer + \stop +\stopsubsubsubject + +\startsubsubsubject[title={\type{\switchtobodyfont[modern-latin,tt,10pt]}}] + \start + \switchtobodyfont[modern-latin,tt,10pt] + \setupalign[flushleft,broad,nothyphenated,verytolerant] + \getbuffer + \stop +\stopsubsubsubject + +\stopsection + +\startsection[title=Finetuning] + +In practice we only need to compensate the width but can leave the height +and depth untouched. In the following examples we see the normal bold next +to the regular as well as the boldened version. For this we will use a couple +of definitions: + +\startbuffer +\definefontfeature[lm-bald][effect={width=0.25,effect=both}] +\definefontfeature[pg-bald][effect={width=0.25,effect=both}] +\definefontfeature[dj-bald][effect={width=0.35,effect=both}] + +\definefontfeature + [lm-bold] + [effect={width=0.25,hdelta=0,ddelta=0,effect=both}, + extend=1.10] + +\definefontfeature + [pg-bold] + [effect={width=0.25,hdelta=0,ddelta=0,effect=both}, + extend=1.00] + +\definefontfeature + [dj-bold] + [effect={width=0.35,hdelta=0,ddelta=0,effect=both}, + extend=1.05] + +\definefont[lmbald][Serif*default,lm-bald sa d] +\definefont[pgbald][Serif*default,pg-bald sa d] +\definefont[djbald][Serif*default,dj-bald sa d] + +\definefont[lmbold][Serif*default,lm-bold sa d] +\definefont[pgbold][Serif*default,pg-bold sa d] +\definefont[djbold][Serif*default,dj-bold sa d] +\stopbuffer + +\typebuffer \getbuffer + +We can combine the extend and effect features to get a bold running as wide as a +normal bold. We limit the height and depth so that we can use regular and bold in +the same sentence. It's all a matter of taste, but some control is there. + +\starttabulate[|l|l|l|l|] +\NC + \BC + \tt modern \BC + \tt pagella \BC + \tt dejavu \NC +\NR +\NC + \type{\tfd} \NC + \switchtobodyfont [modern,24pt]\strut\ruledhbox{\tfd ABC}\NC + \switchtobodyfont[pagella,24pt]\strut\ruledhbox{\tfd ABC}\NC + \switchtobodyfont [dejavu,24pt]\strut\ruledhbox{\tfd ABC}\NC +\NR +\NC + \type{\..bald} \NC + \switchtobodyfont [modern,24pt]\strut\ruledhbox{\lmbald ABC}\NC + \switchtobodyfont[pagella,24pt]\strut\ruledhbox{\pgbald ABC}\NC + \switchtobodyfont [dejavu,24pt]\strut\ruledhbox{\djbald ABC}\NC +\NR +\NC + \type{\bfd} \NC + \switchtobodyfont [modern,24pt]\strut\ruledhbox{\bfd ABC}\NC + \switchtobodyfont[pagella,24pt]\strut\ruledhbox{\bfd ABC}\NC + \switchtobodyfont [dejavu,24pt]\strut\ruledhbox{\bfd ABC}\NC +\NR +\NC + \type{\..bold} \NC + \switchtobodyfont [modern,24pt]\strut\ruledhbox{\lmbold ABC}\NC + \switchtobodyfont[pagella,24pt]\strut\ruledhbox{\pgbold ABC}\NC + \switchtobodyfont [dejavu,24pt]\strut\ruledhbox{\djbold ABC}\NC +\NR +\stoptabulate + +Let's take another go at Pagella. We define a few features, colors +and fonts first: + +\startbuffer +\definefontfeature + [pg-fake-1] + [effect={width=0.25,effect=both}] + +\definefontfeature + [pg-fake-2] + [effect={width=0.25,hdelta=0,ddelta=0,effect=both}] + +\definefont[pgregular] [Serif*default] +\definefont[pgbold] [SerifBold*default] +\definefont[pgfakebolda][Serif*default,pg-fake-1] +\definefont[pgfakeboldb][Serif*default,pg-fake-2] + +\definecolor[color-pgregular] [t=.5,a=1,r=.6] +\definecolor[color-pgbold] [t=.5,a=1,g=.6] +\definecolor[color-pgfakebolda][t=.5,a=1,b=.6] +\definecolor[color-pgfakeboldb][t=.5,a=1,r=.6,g=.6] +\stopbuffer + +\typebuffer \getbuffer + +When we apply these we get the results of \in {figure} [fig:pagella-compared] +while we show the same overlayed in \in {figure} [fig:pagella-overlayed]. As you +can see, the difference in real bold and fake bold is subtle: the inner shape of +the \quote {o} differs. Also note that the position of the accents doesn't change +in the vertical direction but moves along with the width. + +\def\SampleWord{\^o\"ep\c s} + +\startplacefigure[title={Four pagella style variants compared.},reference=fig:pagella-compared] + \startcombination[2*2] + { + \scale [scale=7500] { + \ruledhbox{\showglyphs\pgregular \SampleWord} + } + } { + regular (red) + } { + \scale [scale=7500] { + \ruledhbox{\showglyphs\pgbold \SampleWord} + } + } { + bold (green) + } { + \scale [scale=7500] { + \ruledhbox{\showglyphs\pgfakebolda \SampleWord} + } + } { + fakebolda (blue) + } { + \scale [scale=7500] { + \ruledhbox{\showglyphs\pgfakeboldb \SampleWord} + } + } { + fakeboldb (yellow) + } + \stopcombination +\stopplacefigure + +\startplacefigure[title={Four pagella style variants overlayed.},reference=fig:pagella-overlayed] + \startcombination[2*3] + { + \scale [scale=7500] { + \startoverlay + {\color[color-pgregular] {\pgregular \SampleWord}} + {\color[color-pgbold] {\pgbold \SampleWord}} + \stopoverlay + } + } { + bold over regular + } { + \scale [scale=7500] { + \startoverlay + {\color[color-pgregular] {\pgregular \SampleWord}} + {\color[color-pgfakeboldb]{\pgfakeboldb \SampleWord}} + \stopoverlay + } + } { + fakebolda over regular + } { + \scale [scale=7500] { + \startoverlay + {\color[color-pgregular] {\pgregular \SampleWord}} + {\color[color-pgfakebolda]{\pgfakeboldb \SampleWord}} + \stopoverlay + } + } { + fakeboldb over regular + } { + \scale [scale=7500] { + \startoverlay + {\color[color-pgbold] {\pgbold \SampleWord}} + {\color[color-pgfakeboldb]{\pgfakeboldb \SampleWord}} + \stopoverlay + } + } { + fakeboldb over bold + } { + \scale [scale=7500] { + \startoverlay + {\color[color-pgfakebolda]{\pgfakebolda \SampleWord}} + {\color[color-pgfakeboldb]{\pgfakeboldb \SampleWord}} + \stopoverlay + } + } { + fakeboldb over fakebolda + } { + \scale [scale=7500] { + \startoverlay + {\color[color-pgregular] {\pgregular \SampleWord}} + {\color[color-pgbold] {\pgbold \SampleWord}} + {\color[color-pgfakebolda]{\pgfakebolda \SampleWord}} + {\color[color-pgfakeboldb]{\pgfakeboldb \SampleWord}} + \stopoverlay + } + } { + all four overlayed + } + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=The code] + +The amount of code involved is not that large and is a nice illustration of what +\LUATEX\ provides (I have omitted a few lines of tracing and error reporting). +The only thing added to the font scaler elsewhere is that we pass the \type +{mode} and \type {width} parameters to \TEX\ so that they get used in the backend +to inject the few operators needed. + +\starttyping +local effects = { + inner = 0, + outer = 1, + both = 2, + hidden = 3, +} + +local function initialize(tfmdata,value) + local spec + if type(value) == "number" then + spec = { width = value } + else + spec = utilities.parsers.settings_to_hash(value) + end + local effect = spec.effect or "both" + local width = tonumber(spec.width) or 0 + local mode = effects[effect] + if mode then + local factor = tonumber(spec.factor) or 0 + local hfactor = tonumber(spec.vfactor) or factor + local vfactor = tonumber(spec.hfactor) or factor + local delta = tonumber(spec.delta) or 1 + local wdelta = tonumber(spec.wdelta) or delta + local hdelta = tonumber(spec.hdelta) or delta + local ddelta = tonumber(spec.ddelta) or hdelta + tfmdata.parameters.mode = mode + tfmdata.parameters.width = width * 1000 + tfmdata.properties.effect = { + effect = effect, width = width, + wdelta = wdelta, factor = factor, + hdelta = hdelta, hfactor = hfactor, + ddelta = ddelta, vfactor = vfactor, + } + end +end + +local function manipulate(tfmdata) + local effect = tfmdata.properties.effect + if effect then + local characters = tfmdata.characters + local parameters = tfmdata.parameters + local multiplier = effect.width * 100 + local wdelta = effect.wdelta * parameters.hfactor * multiplier + local hdelta = effect.hdelta * parameters.vfactor * multiplier + local ddelta = effect.ddelta * parameters.vfactor * multiplier + local hshift = wdelta / 2 + local factor = (1 + effect.factor) * parameters.factor + local hfactor = (1 + effect.hfactor) * parameters.hfactor + local vfactor = (1 + effect.vfactor) * parameters.vfactor + for unicode, char in next, characters do + local oldwidth = char.width + local oldheight = char.height + local olddepth = char.depth + if oldwidth and oldwidth > 0 then + char.width = oldwidth + wdelta + char.commands = { + { "right", hshift }, + { "char", unicode }, + } + end + if oldheight and oldheight > 0 then + char.height = oldheight + hdelta + end + if olddepth and olddepth > 0 then + char.depth = olddepth + ddelta + end + end + parameters.factor = factor + parameters.hfactor = hfactor + parameters.vfactor = vfactor + end +end + +local specification = { + name = "effect", + description = "apply effects to glyphs", + initializers = { + base = initialize, + node = initialize, + }, + manipulators = { + base = manipulate, + node = manipulate, + }, +} + +fonts.handlers.otf.features.register(specification) +fonts.handlers.afm.features.register(specification) +\stoptyping + +The real code is slightly more complex because we want to stack virtual features +properly but the principle is the same. + +\stopsection + +\startsection[title=Arabic] + +It is tempting to test effects with arabic but we need to keep in mind that for +that we should add some more support in the \CONTEXT\ font handler. Let's define +some features. + +\startbuffer +\definefontfeature + [bolden-arabic-1] + [effect={width=0.4}] + +\definefontfeature + [bolden-arabic-2] + [effect={width=0.4,effect=outer}] + +\definefontfeature + [bolden-arabic-3] + [effect={width=0.5,wdelta=0.5,ddelta=.2,hdelta=.2,factor=.1}] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer + +\setupalign + [righttoleft] + +\setupinterlinespace + [1.5] + +\start + \definedfont[arabictest*arabic,bolden-arabic-1 @ 30pt] + \samplefile{khatt-ar}\par + \definedfont[arabictest*arabic,bolden-arabic-2 @ 30pt] + \samplefile{khatt-ar}\par + \definedfont[arabictest*arabic,bolden-arabic-3 @ 30pt] + \samplefile{khatt-ar}\par +\stop +\stopbuffer + +With \MICROSOFT\ Arabtype the \type {khatt-ar.tex} looks as follows: + +\typebuffer \start \definefontsynonym[arabictest][arabtype] \getbuffer\stop + +And with Idris' Husayni we get: + +\typebuffer \start \definefontsynonym[arabictest][husayni] \getbuffer\stop + +Actually, quite okay are the following. We don't over do bold here and to get +a distinction we make the original thinner. + +\startbuffer +\definefontfeature[effect-ar-thin] [effect={width=0.01,effect=inner}] +\definefontfeature[effect-ar-thick][effect={width=0.20,extend=1.05}] +\stopbuffer + +\typebuffer \getbuffer + +\start + \setupalign + [righttoleft] + + \setupinterlinespace + [1.5] + + \definedfont[husayni*arabic,effect-ar-thin @ 30pt] + \samplefile{khatt-ar}\par + \definedfont[husayni*arabic,effect-ar-thick @ 30pt] + \samplefile{khatt-ar}\par +\stop + +The results are acceptable at small sizes but at larger sizes you will start to +see kerning, anchoring and cursive artifacts. The outline examples show that the +amount of overlap differs per font and the more overlap we have the better +boldening will work. + +\startMPinclusions + def DrawShapes(expr how) = + def SampleShapes(expr offset, pw, xc, xs, xt, yc, ys, yt, txt, more) = + numeric l ; l := pw * mm ; + picture p ; p := image ( + draw fullcircle scaled 10 ; + draw fullcircle scaled 3 shifted (-3+xc ,8+yc) withcolor "darkred" ; + draw fullsquare scaled 3 shifted ( 6+xs ,7+ys) withcolor "darkblue"; + draw fulltriangle scaled 4 shifted ( 6+xt+5,6+yt) withcolor "darkgreen"; + ) shifted (offset,0) scaled mm ; + draw p + withpen pencircle + if how = 2 : + xscaled l yscaled (l/2) rotated 30 ; + else : + scaled l ; + fi ; + draw boundingbox p + withcolor "darkyellow" ; + draw textext(txt) + shifted (xpart center p, -8mm) ; + draw textext(more) + shifted (xpart center p, -11mm) ; + enddef ; + SampleShapes( 0,1, 0,0,0, 0, 0, 0, "\tinyfont \setstrut \strut original", "\tinyfont \setstrut \strut ") ; + SampleShapes( 25,2, 0,0,0, 0, 0, 0, "\tinyfont \setstrut \strut instance", "\tinyfont \setstrut \strut ") ; + SampleShapes( 50,2,-1,1,0, 0, 0, 0, "\tinyfont \setstrut \strut mark", "\tinyfont \setstrut \strut x only") ; + SampleShapes( 75,2,-1,1,1, 0, 0, 0, "\tinyfont \setstrut \strut mark + mkmk","\tinyfont \setstrut \strut x only") ; + SampleShapes(100,2,-1,1,1, 1, 1, 1, "\tinyfont \setstrut \strut mark + mkmk","\tinyfont \setstrut \strut x and y") ; + SampleShapes(125,2,-1,2,2,-1/2,-1/2,-1/2,"\tinyfont \setstrut \strut mark + mkmk","\tinyfont \setstrut \strut x and -y") ; + enddef ; +\stopMPinclusions + +In arabic (and sometimes latin) fonts the marks (or accents in latin) are +attached to base shapes and normally one will use the \type {mark} to anchor a +mark to a base character or specific component of a ligature. The \type {mkmk} +feature is then used to anchor marks to other marks. Consider the following +example. + +\startlinecorrection +\scale + [width=\textwidth] + {\startMPcode DrawShapes(1) ; \stopMPcode} +\stoplinecorrection + +We start with \type {original}: a base shape with three marks: the red circle and +blue square anchor to the base and the green triangle anchors to the blue square. +When we bolden, the shapes will start touching. In the case of latin scripts, +it's normal to keep the accents on the same height so this is why the third +picture only shifts in the horizontal direction. The fourth picture demonstrates +that we need to compensate the two bound marks. One can decide to move the lot up +as in the fifth picture but that is no option here. + +Matters can be even more complex when a non circular pen is introduced. In that +case a transformation from one font to another using the transformed \OPENTYPE\ +positioning logic (values) is even more tricky and unless one knows the +properties (and usage) of a mark it makes no sense at all. Actually the sixths +variant is probably nicer here but there we actually move the marks down! + +\startlinecorrection +\scale + [width=\textwidth] + {\startMPcode DrawShapes(2) ; \stopMPcode} +\stoplinecorrection + +For effects this means that when it gets applied to such a font, only small +values work out well. + +\stopsection + +\startsection[title=Math] + +Math is dubious as there is all kind of positioning involved. Future versions +might deal with this, although bolder math (math itself has bold, so actually +we're talking of bold with some heavy) is needed for titling. If we keep that +in mind we can actually just bolden math and probably most will come out +reasonable well. One of the potential troublemakers is the radical (root) sign +that can be bound to a rule. Bumping the rules is no big deal and patching the +relevant radical properties neither, so indeed we can do: + +\startbuffer[mathblob] +2\times\sqrt{\frac{\sqrt{\frac{\sqrt{2}}{\sqrt{2}}}} + {\sqrt{\frac{\sqrt{2}}{\sqrt{2}}}}} +\stopbuffer + +\startbuffer +\switchtobodyfont [modernlatin,17.3pt] +$ + \mr \darkblue \getbuffer[mathblob] \quad + \mb \darkgreen \getbuffer[mathblob] +$ +\stopbuffer + +\typebuffer \blank \start \getbuffer \stop \blank + +Where the \type {mathblob} buffer is: + +\typebuffer[mathblob] + +Here you also see a fraction rule that has been bumped. In display mode we +get: + +\startbuffer +\switchtobodyfont[modernlatin,17.3pt] +\startformula + \mr \darkblue \getbuffer[mathblob] \quad + \mb \darkgreen \getbuffer[mathblob] +\stopformula +\stopbuffer + +\typebuffer \blank \start \getbuffer \stop \blank + +Extensibles behave well too: + +\startbuffer +\switchtobodyfont [modernlatin,17.3pt] +\dostepwiserecurse {1} {30} {5} { + $ + \mr \sqrt{\blackrule[width=2mm,height=#1mm,color=darkblue]} + \quad + \mb \sqrt{\blackrule[width=2mm,height=#1mm,color=darkgreen]} + $ +} +\stopbuffer + +\typebuffer \blank \start \getbuffer \stop \blank + +\definecolor[colormr] [t=.5,a=1,b=.6] +\definecolor[colormb] [t=.5,a=1,g=.6] + +In \in {figure} [fig:regular-over-bold] we overlay regular and bold. The result +doesn't look that bad after all, does it? It took however a bit of experimenting +and a fix in \LUATEX: pickup the value from the font instead of the currently +used (but frozen) math parameter. + +\startplacefigure[title={Modern Latin regular over bold.},reference=fig:regular-over-bold] +\switchtobodyfont[modernlatin,17.3pt] +\scale[width=.25\textwidth]{\startoverlay + {\color[colormb]{$\mb\sqrt{\frac{1}{x}}$}} + {\color[colormr]{$ \sqrt{\frac{1}{x}}$}} +\stopoverlay} +\stopplacefigure + +In case you wonder how currently normal Latin Modern bold looks, here we go: + +\startbuffer +\switchtobodyfont[latinmodern,17.3pt] +\startformula + \mr \darkblue \getbuffer[mathblob] \quad + \mb \darkgreen \getbuffer[mathblob] +\stopformula +\stopbuffer + +\typebuffer \blank \start \getbuffer \stop \blank + +\unexpanded\def\ShowMathSample#1% + {\switchtobodyfont[#1,14.4pt]% + \mathematics{% + \mr \darkblue \getbuffer[mathblob] \quad + \mb \darkgreen \getbuffer[mathblob] + }} + +\unexpanded\def\ShowMathCaption#1% + {\switchtobodyfont[#1]% + #1: + $ + {\mr2\enspace \scriptstyle2\enspace \scriptscriptstyle2} + \enspace + {\mb2\enspace \scriptstyle2\enspace \scriptscriptstyle2} + $} + +\startcombination[3*2] + {\ShowMathSample {dejavu}} {\ShowMathCaption{dejavu}} + {\ShowMathSample{pagella}} {\ShowMathCaption{pagella}} + {\ShowMathSample {termes}} {\ShowMathCaption{termes}} + {\ShowMathSample {bonum}} {\ShowMathCaption{bonum}} + {\ShowMathSample {schola}} {\ShowMathCaption{schola}} + {\ShowMathSample{cambria}} {\ShowMathCaption{cambria}} +\stopcombination + +I must admit that I cheat a bit. In order to get a better looking pseudo math +we need to extend the shapes horizontally as well as squeeze them a bit vertically. +So, the real effect definitions more look like this: + +\starttyping +\definefontfeature + [boldened-30] + [effect={width=0.3,extend=1.15,squeeze=0.985,% + delta=1,hdelta=0.225,ddelta=0.225,vshift=0.225}] +\stoptyping + +and because we can calculate the funny values sort of automatically, this gets +simplified to: + +\starttyping +\definefontfeature + [boldened-30] + [effect={width=0.30,auto=yes}] +\stoptyping + +We leave it to your imagination to figure out what happens behind the screens. +Just think of some virtual font magic combined with the engine supported \type +{extend} and \type {squeeze} function. And because we already support bold math +in \CONTEXT, you will get it when you are doing bold titling. + +\startbuffer +\def\MathSample + {\overbrace{2 + + \sqrt{\frac{\sqrt{\frac{\sqrt{2}}{\sqrt{2}}}} + {\sqrt{\frac{\sqrt{\underbar{2}}}{\sqrt{\overbar{2}}}}}}}} + +\definehead + [mysubject] + [subject] + +\setuphead + [mysubject] + [style=\tfc, + color=darkblue, + before=\blank, + after=\blank] + +\mysubject{Regular\quad$\MathSample\quad\mb\MathSample$} + +\setuphead + [mysubject] + [style=\bfc, + color=darkred] + +\mysubject{Bold \quad$\MathSample\quad\mb\MathSample$} +\stopbuffer + +\typebuffer + +\getbuffer + +Of course one can argue about the right values for boldening and compensation if +dimensions so don't expect the current predefined related features to be frozen +yet. + +For sure this mechanism will create more fonts than normal but fortunately it +can use the low level optimizations for sharing instances so in the end the +overhead is not that large. This chapter uses 36 different fonts, creates 270 +font instances (different scaling and properties) of which 220 are shared in the +backend. The load time is 5 seconds in \LUATEX\ and 1.2 seconds in \LUAJITTEX\ on +a somewhat old laptop with a i7-3840QM processor running 64 bit \MSWINDOWS. Of +course we load a lot of bodyfonts at different sizes so in a normal run the extra +loading is limited to just a couple of extra instances for math (normally 3, one +for each math size). + +\stopsection + +\startsection[title=Conclusion] + +So what can we conclude? When we started with \LUATEX, right from the start +\CONTEXT\ supported true \UNICODE\ math by using virtual \UNICODE\ math fonts. +One of the objectives of the \TEX Gyre project is to come up with a robust +complete set of math fonts, text fonts with a bunch of useful symbols, and +finally a subset bold math font for titling. Now we have real \OPENTYPE\ math +fonts, although they are still somewhat experimental. Because we're impatient, we +now provide bold math by using effects but the future will learn to what extent +the real bold math fonts will differ and be more pleasant to look at. After all, +what we describe he is just an experiment that got a bit out of hands. + +% And if you wonder if this kind of messing with fonts is okay? Well, you don't +% know what specs we sometimes get (and then ignore). + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon.tex b/doc/context/sources/general/manuals/onandon/onandon.tex index 60b626a5e..593de3e75 100644 --- a/doc/context/sources/general/manuals/onandon/onandon.tex +++ b/doc/context/sources/general/manuals/onandon/onandon.tex @@ -34,23 +34,39 @@ \startbodymatter \component onandon-decade + \component onandon-ffi + % \startchapter[title=Variable fonts] First published in user group magazines. \stopchapter \component onandon-variable + \component onandon-emoji + \startchapter[title={Children of \TEX}] First published in user group magazines. \stopchapter % \component onandon-children + \component onandon-performance + \component onandon-editing + \startchapter[title={Advertising \TEX}] First published in user group magazines. \stopchapter % \component onandon-perception + \startchapter[title={Tricky fences}] First published in user group magazines. \stopchapter % \component onandon-fences + % \component onandon-media - \startchapter[title={From 5.2 to 5.3}] Maybe first published in user group magazines. \stopchapter + + \startchapter[title={From 5.2 to 5.3}] First published in user group magazines. \stopchapter % \component onandon-53 - \startchapter[title={Executing \TEX}] Maybe first published in user group magazines. \stopchapter + + \startchapter[title={Executing \TEX}] First published in user group magazines. \stopchapter % \component onandon-execute + + \component onandon-modern + + \startchapter[title={More expansion}] Maybe first published in user group magazines. \stopchapter + % \component onandon-expansion \stopbodymatter \stopproduct |