% language=us

\startcomponent hybrid-backends

\environment hybrid-environment

\startchapter[title={Weird examples}]

\startsection[title={Introduction}]

In this chapter I will collect a couple of weird examples.

\stopsection

\startsection[title=Inter-character spacing]

There was a discussion on the \LUATEX\ (dev) list about inter character spacing
and ligatures. The discussion involved a mechanism inherited from \PDFTEX\ but in
\CONTEXT\ we don't use that at all. Actually, support for inter character spacing
was added in an early stage of \MKIV\ development as an alternative for the
\MKII\ variant, which used parsing at the \TEX\ end. Personally I never use this
spacing, unless a design in a project demands it.

In the \MKIV\ method we split ligatures when its components are known. This works
quite well. It's anyway a good idea to disable ligatures, so it's more a
fallback. Actually we should create components for hard coded characters like
\ae\ but as no one ever complained I leave that for a later moment.

As we already had the mechanisms in place, support for selective spacing of
ligatures was a rather trivial extension. If there is ever a real need for it, I
will provide control via the normal user interface, but for now using a few hooks
will do. The following code shows an example of an implementation. \footnote {The
examples have been adapted to the latest \CONTEXT\ where we use \type
{\getchar(n)} instead of \type {n.char}.}

\startbuffer
local utfbyte = utf.byte
local getchar = nodes.nuts.getchar

local keep = {
    [0x0132] = true, [0x0133] = true, -- IJ ij
    [0x00C6] = true, [0x00E6] = true, -- AE ae
    [0x0152] = true, [0x0153] = true, -- OE oe
}

function typesetters.kerns.keepligature(n)
    return keep[getchar(n)]
end

local together = {
    [utfbyte("c")] = { [utfbyte("k")] = true },
    [utfbyte("i")] = { [utfbyte("j")] = true },
    [utfbyte("I")] = { [utfbyte("J")] = true },
}

function typesetters.kerns.keeptogether(n1,n2)
    local k = together[getchar(n1)]
    return k and k[getchar(n2)]
end
\stopbuffer

\ctxluabuffer

\typebuffer

The following also works:

\starttyping
local lpegmatch = lpeg.match
local fontdata  = fonts.identifiers
local getchar   = nodes.nuts.getchar
local getfont   = nodes.nuts.getfont

local keep = -- start of name
        lpeg.P("i_j")
      + lpeg.P("I_J")
      + lpeg.P("aeligature")
      + lpeg.P("AEligature")
      + lpeg.P("oeligature")
      + lpeg.P("OEligature")

function typesetters.kerns.keepligature(n)
    local d = fontdata[getfont(n)].descriptions
    local c = d and d[getchar(n)]
    local n = c and c.name
    return n and lpegmatch(keep,n)
end
\stoptyping

A more generic solution would be to use the \type {tounicode} information, but it
would be overkill as we're dealing with a rather predictable set of characters
that have gotten \UNICODE\ slots assigned. When using basemode most fonts will
work anyway.

So, is this really worth the effort? Take a look at the following example.

\startbuffer
\definecharacterkerning [KernMe] [factor=0.25]

\start
  \setcharacterkerning[KernMe]
  \definedfont[Serif*default]
  Ach kijk effe, \ae sop draagt een knickerbocker! \par
  \definedfont[Serif*smallcaps]
  Ach kijk effe, \ae sop draagt een knickerbocker! \par
\stop
\stopbuffer

\typebuffer

Typeset this (Dutch text) looks like:

\getbuffer

You might wonder why I decided to look into it. Right at the moment when it was
discussed, I was implementing a style that needed the Calibri font that comes
with \MSWINDOWS, and I visited the FontShop website to have a look at the font.
To my surprise it had quite some ligatures, way more than one would expect.

\placefigure
  {Some of the ligatures in Calibri Regular. Just wonder what
   intercharacter spacing will do here.}
  {\externalfigure[calibri-fontshop.png]}

\stopsection

\stopchapter

\stopcomponent
