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

وفا خلیقی، Vafa Khalighi vafa at live.com.au
Wed Oct 1 11:51:45 CEST 2008


I think this should work:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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 = {
          registry = "Adobe",
          ordering = "Identity",
          supplement = 0,
          version = 1
        }
      end
    else
      f = font.read_tfm(name, size)
    end
  return f
  end
)
}

\font\test=nazli.ttf at 12pt
\test
Hi. This is just a test.
\end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
Hope that helps

________________________________
> Date: Wed, 1 Oct 2008 11:38:41 +0200
> From: javier at digi21.eu
> To: dev-luatex at ntg.nl
> Subject: [Dev-luatex] How to use an OpenType font.
> 
> 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
> 
> \directlua0{function load_font (filename)
>  local metrics = nil
>  local font = fontforge.open(filename)
>  if font then
>   metrics = fontforge.to_table(font)
>   fontforge.close(font)
>  end
>  return metrics
> end
> }
> \directlua0{twelverm = load_font('C:/Windows/Fonts/LMRoman12-Regular.otf')}
> 
> but it still does not solve the problem. I have no idea of how to make the font known for TeX.
> 
> This is command is expandable. As an example, the following input:
> $\pi = \directlua0{tex.print(math.pi)}$
> 
> will result in p = 3.1415926535898
> 
> But this leaves me none the wiser about fonts. The problem is: which is the equivalent of
> 
> \font\tenrm=cmr10
> 
> for OpenType (or TrueType) fonts?
> 
> 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. 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.
>    I wouldn't have any problem in taking the time to write them myself... if knew it, but the LuaTeX manual is still very far from serving to the learning of LuaTeX in the same way as the TeXBook serves for the learnig TeX or "the red book" serves for the learning of the postscript language.
> 
> Continuing with my problem with using an otf font, I found some pages below in the manual an example intended for a diferent purpose but that looked usefull for solving my problem even if not the way it should be done. So below the avobe mentioned lua code I boldly wrote
> 
> \directlua0 {
> callback.register('define_font', function (name,size)
>  if name == 'LMRoman12-Regular' then
>   f = twelverm
>  else
>   f = font.read_tfm(name,size)
>  end
>  return f
> end
> )
> }
> \font\twelverm= LMRoman12-Regular
> it does not work, but it exhibits a bug in LuaTeX: I get a warning at \dump time:
> 
> luaTeX warning: lua-loaded font [1] () has no character table!
> 
> but right afterwards the program dies and is closed by Windows.
> 
> --Javier A.

_________________________________________________________________



More information about the dev-luatex mailing list