# [Dev-luatex] How to use an OpenType font.

Ulrike Fischer list at nililand.de
Wed Oct 1 12:00:27 CEST 2008

Guten Tag Javier Múgica,

am Mittwoch, 1. Oktober 2008 um 11:38 schrieben Sie:

> I am trying to use an open type font. In the manual I can see a piece of Lua
> code for loading such a font. I "suppose" that I have to enclose it within
> \direclua0{}, so I wrote

> but it still does not solve the problem. I have no idea of how to make the
> font known for TeX.

The example below works for me together with a "lualatex" format.
But is rather crude and  certainly will need extension.

> This problem is present to some extent all troughout the manual. It seems as
> if you were taking always something for granted about the
> interaction between Lua and TeX that is not explained anywhere. You may find
> it obvious, but keep in mind that manuals are intended for people who
> still don't know.
>     For somebody like me who comes from TeX, the impression got when reading
> the manual (or at least the impression I had) is as having all the pieces
> from a conglomerate rock but not having the cement. And the lack of examples
> is exasperating.

luatex is still very beta. So you shouldn't expect its documentation to be
complete.

> This I understand given the development state of the
> program, but men, since one of the main features of LuaTeX is accesing and
> modifing the TeX parameters and state with Lua code, some exemples of this,
> even if kept to a minimum, would be very helpful.

Heiko Oberdiek has made some packages with use lua. They are quite
informativ. There is a lua-inputenc on CTAN. And the wiki-page where I
got the font code has also some example.

The context sources contains a lot of lua code. (But I don't find them
very useful -- to complicated for me.)

\pdfoutput=1
\documentclass{article}
% From http://luatex.bluwiki.com/go/Use_a_TrueType_font
\directlua0{
callback.register('define_font',
function(name, size)
fonttype = nil
filename = kpse.find_file(name,"opentype fonts")
if (filename)
then fonttype = 'opentype'
else filename = kpse.find_file(name, "truetype fonts")
end
if filename and not fonttype then fonttype = 'truetype' end
if fonttype then
if (size < 0) then size = (- 655.36) * size end
ttffont = fontforge.to_table(fontforge.open(filename))
if ttffont then
f = { }
f.name = ttffont.fontname
f.fullname = ttffont.names[1].names.fullname
f.parameters = { }
f.designsize = size
f.size = size
direction = 0
f.parameters.slant = 0
f.parameters.space = size * 0.25
f.parameters.space_stretch = 0.3 * size
f.parameters.space_shrink = 0.1 * size
f.parameters.x_height = 0.4 * size
f.parameters.quad = 1.0 * size
f.parameters.extra_space = 0
f.characters = { }
mag = size / ttffont.units_per_em

names_of_char = { }
for char, glyph in pairs(ttffont.map.map)
do
names_of_char[ttffont.glyphs[glyph].name]
= ttffont.map.backmap[glyph]
end

names_of_glyph = { }
for char, glyph in pairs(ttffont.map.map)
do
names_of_glyph[ttffont.glyphs[glyph].name]
= glyph
end

for char, glyph in pairs(ttffont.map.map)
do
glyph_table = ttffont.glyphs[glyph]

f.characters[char] = {
index = glyph,
width = glyph_table.width * mag,
name = glyph_table.name,
}
if glyph_table.kerns then
local kerns = { }
for _, kern in pairs(glyph_table.kerns)
do
kerns[names_of_char[kern.char]] = kern.off * mag
end
f.characters[char].kerns = kerns
end
end
f.filename = filename
f.type = 'real'
f.format = fonttype
f.embedding = "subset"
f.cidinfo = {
ordering = "Identity",
supplement = 0,
version = 1
}
end
else
f = font.read_tfm(name, size)
end
return f
end
)
}

\begin{document}
\font\lm=lmroman10-regular at 10pt

\lm  This is
Latin Modern in Opentype format This is Latin Modern in Opentype
format This is Latin Modern in Opentype format This is Latin Modern in
Opentype format

\end{document}

--
Mit freundlichen Grüßen
Ulrike Fischer
mailto:list at nililand.de