我正在使用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}