[luatex] How to access user-defined kerning
Hans Hagen
j.hagen at xs4all.nl
Fri Apr 20 09:11:58 CEST 2018
On 4/20/2018 5:52 AM, Henri Menke wrote:
> Dear list,
>
> I'm trying to determine the kerning between two letters (here A and V). For the
> sake of this example I'm inserting negative kerning of -400/1000 em. However,
> when I examine the kern in the kerning callback this massive enhancement of the
> negative kern doesn't show up but I only see the kerning from the font itself.
>
> How can I access the user-defined kerns? MWE is below.
no real answer but there is nreal need to go nuts in your code
local function show_kerns(head)
local glyph = node.id("glyph")
for item in node.traverse(head) do
if item.id == glyph then
local char = item.char
if char == 65 then
local font = item.font
print(font,char)
local next = item.next
if next.id == glyph then
local nextchar = next.char
local nextfont = next.font
local data = fonts.hashes.identifiers[font]
local kern =
fonts.handlers.otf.getkern(data,char,nextchar)
print(kern)
end
end
end
end
end
that said, what you could do is the loop over the to be packed list (so
later) and then look for a left math node and then start looking at the
characters and kerns
function foo(head)
local glyph = node.id("glyph")
local math = node.id("math")
local current = head
while current do
if current.id == math then
current = current.next
while current do
if current.id == math then
break
elseif current.id == glyph then
local char = current.char
if char == 0x1D434 then
local font = current.font
local next = current.next
if next.id == glyph then
local nextchar = next.char
if char == 0x1D449 then
local nextfont = next.font
local data = fonts.hashes.identifiers[font]
local kern =
fonts.handlers.otf.getkern(data,char,nextchar)
print(char,nextchar,kern)
end
end
current = next
else
current = current.next
end
else
current = current.next
end
end
end
current = current.next
end
end
depending on the macro package that you need to look at math unicodes
and even then you might not see a print because there is already a kern
keep in mind that this kind of hackery is macro package dependent so
your plain test might work out different elsewhere (i haven't tested it
as i operate in a different environment)
> Cheers, Henri
>
> ---
>
> \input luaotfload.sty
>
> \directlua{
> local function show_kerns(head)
> for item in node.traverse(head) do
> if item.id == node.id("glyph") and item.char == 65 then
> % Get current char and font
> local nut = node.direct.todirect(item)
> local char = node.direct.getchar(nut)
> local font = node.direct.getfont(nut)
> print(font)
> % Get next char and font
> local next = node.next(item)
> local nextnut = node.direct.todirect(next)
> local nextchar = node.direct.getchar(nextnut)
> local nextfont = node.direct.getfont(nextnut)
> % Determine the kern
> local data = fonts.hashes.identifiers[font]
> local kern = fonts.handlers.otf.getkern(data,char,nextchar)
> print(kern)
> end
> end
> end
> %
> luatexbase.add_to_callback("kerning",
> function(head)
> show_kerns(head)
> node.kerning(head)
> end,
> "show_kerns")
> }
>
> \directlua{
> fonts.handlers.otf.addfeature{
> name = "ktest",
> type = "kern",
> data = { ["A"] = { ["V"] = -400 } } % make them overlap for the example
> }
> }
>
> \font\test="Latin Modern Roman:+ktest"\test
> AV
>
> \bye
>
--
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
More information about the luatex
mailing list