luatex fontloader 虚拟字形表问题

luatex fontloader 虚拟字形表问题

我正在使用Brill-Roman.otf字体,但使用 luatex 时,我不知道如何从虚拟fontloader.to_table返回表访问小型大写字母字形glyphs。没有这样的索引,我不知道如何获取该字形数据。其中Brill-Roman.lua有这样的字形(小型大写字母D):

  [983164]={
   ["boundingbox"]=804,
   ["index"]=1146,
   ["name"]="D.c2sc",
   ["unicode"]=68,
   ["width"]=559,
  },

西北世界

\documentclass{article}
\usepackage{luacode}
\usepackage{fontspec}
\setmainfont[
  Extension=.otf,
  UprightFont=*-Roman,
  UprightFeatures={
    SizeFeatures={
      { Size={9-},
          SmallCapsFeatures={Letters=UppercaseSmallCaps,LetterSpace=5.0},
          WordSpace={1,1.5,0.6}
      }
    }
  }
]{Brill}

\begin{luacode*}

local function get_real_char(font_idx, glyph_idx)
    local real_font = font.getfont(font_idx)
    local myfont = fontloader.open(real_font.filename)
    if myfont then
        metrics = fontloader.to_table(myfont)
        print ("IS_IT?", metrics.glyphs[glyph_idx])
        fontloader.close(myfont)
    end    
end

function print_glyph(h)
    for n in node.traverse(h) do
      if n.id == node.id("glyph") then
        print ("GLYPH:", n.char, n.font)
        get_real_char(n.font, n.char)
      elseif n.id == node.id("hlist") or n.id == node.id("vlist") then
        print_glyph(n.head)
      end
    end
  return h  
end  
luatexbase.add_to_callback("pre_output_filter", print_glyph, "print glyph")            
\end{luacode*}

\begin{document}
\textsc{Data} font
\end{document}

输出如下:

This is LuaTeX, Version 1.07.0 (TeX Live 2018/W32TeX)  
  (format=lualatex 2018.6.5)  10 JUL 2018 09:43
....
GLYPH:     983164  30
IS_IT?  nil
GLYPH:  983574  30
IS_IT?  nil
GLYPH:  983593  30
IS_IT?  nil
GLYPH:  983574  30
IS_IT?  nil
GLYPH:  102     29
IS_IT?  table: 09814140
GLYPH:  111     29
IS_IT?  table: 0D4A73B8
GLYPH:  110     29
IS_IT?  table: 0E93DCF8
GLYPH:  116     29
IS_IT?  table: 106CDC88

我打印出了字体加载器返回的所有表,但没有任何内容983164,但有很多名称的信息D.c2sc。似乎它已经重新映射到一些查找表。我看不到任何可以附加文件的可能性,所以我无法添加该字体。问题是,如果字体加载器返回的虚拟字体表中没有数据(例如“名称”、“unicode”),
如何获取数据。n.char

答案1

该表必须使用 OTF 文件中的字符索引而不是 unicode 代码点进行索引。您可以使用 LuaTeX 字体表访问代码点:您的real_font表包含一个character由 LuaTeX 使用的字形索引索引的哈希,并存储在字形节点中。在那里,每个字符表都有一个index字段,它提供字体文件中的索引。必须使用此索引来访问fontloader表。您可能想避免这种情况to_table,因为表会变得非常大。

LuaTeX 字体表中也直接提供了大多数信息,因此您无需fontloader从头开始。正如 Ulrike Fischer 在评论中提到的那样,该fontloader库通常不用于任何用途,尤其是 luaotfload 字体加载器。

\documentclass{article}
\usepackage{luacode}
\usepackage{fontspec}
\setmainfont[
  Extension=.ttf,
  UprightFont=*-Roman,
  UprightFeatures={
    SizeFeatures={
      { Size={9-},
          SmallCapsFeatures={Letters=UppercaseSmallCaps,LetterSpace=5.0},
          WordSpace={1,1.5,0.6}
      }
    }
  }
]{Brill}

\begin{luacode*}

local function get_real_char(font_idx, glyph_idx)
    local real_font = font.getfont(font_idx)
    local myfont = fontloader.open(real_font.filename)
    if myfont then
        print ("Name: ", myfont.glyphs[real_font.characters[glyph_idx].index].name)
        fontloader.close(myfont)
    end    
    print ("Unicode without fontloader: ", real_font.characters[glyph_idx].unicode)
end

function print_glyph(h)
    for n in node.traverse(h) do
      if n.id == node.id("glyph") then
        print ("GLYPH:", n.char, n.font)
        get_real_char(n.font, n.char)
      elseif n.id == node.id("hlist") or n.id == node.id("vlist") then
        print_glyph(n.head)
      end
    end
  return h  
end  
luatexbase.add_to_callback("pre_output_filter", print_glyph, "print glyph")            
\end{luacode*}

\begin{document}
\textsc{Data} font
\end{document}

相关内容