[NTG-context] modifying kerning breaks opentype ligatures (and other features)

mf massifr at fastwebnet.it
Tue Dec 11 13:45:13 CET 2018


> 
> did you play with
> 
> \definefontfeature[whatever][keepligatures=auto]
> 
> \definecharacterkerning [extrakerning] [factor=0.125,features=whatever]
> 
> \starttext
>      \setcharacterkerning[extrakerning]
>      effe fietsen
> \stoptext
> 

Great! Thanks! This now works:

\definefontfeature[frac][frac=yes]
\definefontfeature[klig][keepligatures=auto]

\definecharacterkerning[narrow][factor=-.02,features=klig]
\definecharacterkerning[wide][factor=.02,features=klig]

\def\Narrow#1{\dontleavehmode\bgroup\setcharacterkerning[narrow]#1\egroup}
\def\Wide#1{\dontleavehmode\bgroup\setcharacterkerning[wide]#1\egroup}
\def\NoKerning#1{\dontleavehmode\bgroup\resetcharacterkerning #1\egroup}

\starttext

\feature[+][frac]%
Some ligatures: float, finance, affine; a fraction: 1/4.

\blank

Modified kerning:

\Narrow{Some ligatures: float, finance, affine; a fraction: 1/4.}

\Wide{Some ligatures: float, finance, affine; a fraction: 1/4.}

\stoptext


BTW, back to the automatic insertion of tags, how can i create children 
elements? In other words, how should i rewrite new_dk_element?

The problem is this:

- you have an element t and t.dt = { "float, finance, affine, affluent" }

- t.dt should become = { DK1, "oat", DK2, "nance, a", DK3, "ne, a", DK4, 
"uent" }

- where DK1 ... DK4 are children elements of t with tg="dk" and dt 
respectively equal to { "fl" }, { "fi" }, { "ffi" }, { "ffl" }

My new_dk_element function should create such DKn elements, but they are 
not created right, because they look ignored by \xmlflush.

> 
> 
>> \startbuffer[test]
>> <text>
>> <p>Some ligatures: float, finance, affine, affluent.</p>
>> <p>Modified kerning:</p>
>> <p class="narrow">Some ligatures: float, finance, affine, affluent.</p>
>> <p class="wide">Some ligatures: float, finance, affine, affluent.</p>
>> </text>
>> \stopbuffer
>>
>> \startluacode
>> local function new_dk_element( parent, text )
>>    return {
>>      tag     = "dk",
>>      ns      = "",
>>      rn      = "",
>>      dt      = { text },
>>      at      = {},
>>      command = "xml:dk",
>>      __p__   = parent
>>    }
>> --[[
>>    local t = xml.toxml( "<dk>" .. text .. "</dk>" )
>>    t.__p__ = parent
>>    return t
>> ]]--
>> end
>>
>> local append = table.insert
>> local function saveLigaturesFromKerning( t )
>>    if t and t.dt then
>>      local dt = t.dt
>>      local t_copy = {}
>>      for k,v in pairs( t ) do
>>        if k ~= "dt" then t_copy[ k ] = v end
>>      end
>>      local new_dt = {}
>>      local i
>>      local child
>>      local b, e
>>      for i = 1, #dt, 1 do
>>        child = dt[ i ]
>>        if type( child ) == "string" then
>>          local s = child
>>          repeat
>>            b, e = string.find( s, "f?f[il]" )
>>            if b then
>>              if b > 1 then append( new_dt, string.sub( s, 1, b - 1 ) ) 
>> end
>>              append( new_dt, new_dk_element( t, string.sub( s, b, e ) ) )
>> --            append( new_dt, "[" .. string.sub( s, b, e ) .. "]" )
>>              s = string.sub( s, e + 1 )
>>            else
>>              append( new_dt, s )
>>            end
>>          until not b
>>        else
>>          append( new_dt, child )
>>        end
>>      end
>>      t.dt = new_dt
>>    end
>>    return t
>> end
>>
>> function xml.functions.textWithKerning( t )
>>    local kt = saveLigaturesFromKerning( t )
>>    lxml.flush( kt )
>> end
>> \stopluacode
>>
>> \definecharacterkerning[narrow][factor=-.02]
>> \definecharacterkerning[wide][factor=.02]
>> \def\Narrow#1{\bgroup\setcharacterkerning[narrow]#1\egroup}
>> \def\Wide#1{\bgroup\setcharacterkerning[wide]#1\egroup}
>> \def\NoKerning#1{\bgroup\resetcharacterkerning #1\egroup}
>>
>> \startxmlsetups xml:test
>>    \xmlsetsetup{#1}{text|p|dk}{xml:*}
>>    \xmlsetsetup{#1}{{p.narrow}}{xml:p:narrow}
>>    \xmlsetsetup{#1}{{p.wide}}{xml:p:wide}
>> \stopxmlsetups
>>
>> \xmlregistersetup{xml:test}
>>
>> \startxmlsetups xml:text
>>    \xmlflush{#1}
>> \stopxmlsetups
>>
>> \startxmlsetups xml:p
>>    \xmlflush{#1}\par
>> \stopxmlsetups
>>
>> \startxmlsetups xml:p:narrow
>>    \Narrow{\xmlfunction{#1}{textWithKerning}}\par
>> \stopxmlsetups
>>
>> \startxmlsetups xml:p:wide
>>    \Wide{\xmlfunction{#1}{textWithKerning}}\par
>> \stopxmlsetups
>>
>> \startxmlsetups xml:dk
>>    \NoKerning{\red\xmlflush{#1}}
>> \stopxmlsetups
>>
>> \starttext
>>    \xmlprocessbuffer{xml:test}{test}{}
>> \stoptext
>>


More information about the ntg-context mailing list