我想使用 将一些当前设置写入文件io.savedata
。如何获取有关当前字体的信息,或者更好的是,获取\rm
、\ss
和 的当前设置\tt
?
编辑:fontconfig 必须能够处理字体名称。我想将字体从 ConTeXt 传递到 GNU LilyPond。请参阅http://wiki.contextgarden.net/LilyPond
答案1
如何获取有关当前字体的信息
字体对象包含从字体文件读取的更多信息。您可以在metadata
表中访问它,例如:
\startluacode
local font_info = function (id)
local fnt = font.getfont(id)
context.section { title = fnt.resources.filename }
local metadata = fnt.shared and fnt.shared.rawdata and fnt.shared.rawdata.metadata
if not metadata then return end
local out = function (k)
local v = metadata [k]
context (k) context ": "
context (v) context.endgraf()
end
local items = table.keys (metadata)
context "id: " context (id) context.endgraf()
for i=1, \letterhash items do out (items [i]) end
end
userdata.current_font_info = function () font_info (font.current()) end
\stopluacode
\def \showfontinfo {\ctxlua {userdata.current_font_info ()}}
\setupbodyfont [10pt]
\setuphead [section] [style=\tf]
\starttext
\showfontinfo \endgraf
\tt \showfontinfo \endgraf
\definedfont[file:iwona-regular.otf at 10pt] \showfontinfo \endgraf
\definedfont[file:antykwatorunska-bold.otf at 10pt] \showfontinfo \endgraf
\stoptext
fontconfig 必须能够处理字体名称
您可以创建字体配置模式
来自上述表格。可以从表中访问与字体定义相关的信息(例如 sp 中的字体大小)
specification
。
\startluacode
local get_metadata = function (id)
local fnt = font.getfont(id)
if fnt then
return fnt.shared and fnt.shared.rawdata and fnt.shared.rawdata.metadata
end
end
local get_size = function (id)
local fnt = font.getfont(id)
if fnt then return fnt.specification.size end
end
local fc_pattern = function (id)
local metadata = get_metadata (id)
local size = get_size (id)
if not metadata then return "nil" end
local ret = string.format ([[\letterpercent s:\letterpercent s]],
metadata.familyname,
metadata.subfamily)
if size then ret = ret .. ":size=" .. tostring(size / 2^16) end
return ret
end
userdata.print_fc_pattern = function () print (fc_pattern (font.current())) end
userdata.current_fc_pattern = function () return fc_pattern (font.current()) end
\stopluacode
\def \showfcpattern {%
\fontname \font
\rightarrow
“\ctxlua {context (userdata.current_fc_pattern ())}”
%ctxlua {userdata.print_fc_pattern ()}
\endgraf
}
\setupbodyfont [10pt]
\starttext
\showfcpattern \endgraf
\tt \showfcpattern \endgraf
\definedfont[file:iwona-regular.otf at 10pt] \showfcpattern \endgraf
\definedfont[file:antykwatorunska-bold.otf at 10pt] \showfcpattern \endgraf
\stoptext
结合两个表中的信息来创建适合 Fontconfig 的模式。
然后可以将上面代码片段中的字符串输入到fc-match(1)
类似程序中,也可能输入到 Lilypond 中:
$ fc-match "Iwona:Regular:size=10"
iwona-regular.otf: "Iwona" "Regular"
$ fc-match "Antykwa Torunska:Bold:size=10"
antykwatorunska-bold.otf: "Antykwa Torunska" "Bold"
$ fc-match "Latin Modern Roman:Regular:size=10"
lmroman10-regular.otf: "Latin Modern Roman" "10 Regular"
答案2
这是我能得到的最接近的结果。您必须使用 提取 TeX 级别的字体 ID,并将\fontid\font
其传递给 Lua。然后您可以在那里提取字体名称和标识符。由于我不知道您到底想用它做什么,因此解析和其他操作都由您决定。tex.fontname
和的返回值tex.fontidentifier
是常规 Lua 字符串。
\def\getfontnames{%
\startluacode
function printothers(text)
local catcodetableothers = -2
tex.sprint(catcodetableothers, text)
end
context.startTABLE()
context.NC() context("tex.fontname")
context.NC() printothers(tex.fontname(\fontid\font))
context.NC() context.NR()
context.NC() context("tex.fontidentifier")
context.NC() printothers(tex.fontidentifier(\fontid\font))
context.NC() context.NR()
context.stopTABLE()
\stopluacode
}
\starttext
\rm\getfontnames
\it\getfontnames
\tt\getfontnames
\stoptext