luaotfload 使用一个内部数据库,该数据库会随 更新mkluatexfontdb
。因此它知道我电脑上安装的许多字体。我该如何查询这个数据库?例如
luatexfontdb --list-fonts-on-my-computer-that-are-in-your-database
?
答案1
您可以在编辑器中打开数据库。它名为 otfl-names.lua,应该位于 中的一个 texmf-trees 中\luatex-cache\generic\names
。
基于 otfl-names.lua 制作列表也不是很困难。例如
旧版本(Texlive 2013?)
\documentclass{article}
\usepackage{luacode,luaotfload}
\begin{document}
\begin{luacode}
myfonts=dofile(fonts.names.path.localdir..'/otfl-names.lua')
for i,v in ipairs(myfonts.mappings) do
tex.print(-2, v.familyname)
tex.print(', ')
tex.print(-2, v.fontname)
tex.print('\\par')
end
\end{luacode}
\end{document}
2013 年 5 月编辑:使用较新的 luaotfload(如 TL2013(预测试)中的 luaotfload),应该将 myfonts 行替换为以下行,因为数据库的名称已更改:
myfonts=dofile(fonts.names.path.path)
针对 Texlive 2014 进行编辑
我在 TL 2014(2014 年 6 月)中再次尝试。现在名称文件位于 .luc 中,访问名称再次更改。我还添加了一些“如果存在代码”,以避免在字体的表条目不存在时出现错误:
\documentclass{article}
\usepackage{luacode}
\usepackage{luaotfload}
\begin{document}
\begin{luacode}
myfonts=dofile(fonts.names.path.index.luc)
tex.sprint(fonts.names.path.index.luc)
---[[
for i,v in ipairs(myfonts.mappings) do
if v.familyname then
tex.print('\\par')
tex.print(-2, v.familyname)
end
if v.fontname then
tex.print(', ')
tex.print(-2, v.fontname)
end
tex.print('\\par')
end
--]]
\end{luacode}
\end{document}
2015 年 7 月针对 TeXlive 2015 / MiKTeX 进行编辑
获取名称文件的代码必须再次调整。现在这个似乎可以工作了。
\documentclass{article}
\usepackage{luacode}
\usepackage{luaotfload}
\begin{document}
\begin{luacode}
myfonts=dofile(config.luaotfload.paths.index_path_luc)
tex.sprint(config.luaotfload.paths.index_path_luc)
---[[
for i,v in ipairs(myfonts.mappings) do
if v.familyname then
tex.print('\\par')
tex.print(-2, v.familyname)
end
if v.fontname then
tex.print(', ')
tex.print(-2, v.fontname)
end
tex.print('\\par')
end
--]]
\end{luacode}
\end{document}
答案2
根据 Ulrike 的回答:
因为我不想每次需要字体列表时都创建一个 TeX 文档,所以这里有一个简单的脚本:
#!/usr/bin/env texlua
kpse.set_program_name("listluatexfonts")
cachefile = kpse.expand_var("$TEXMFVAR") .. "/luatex-cache/generic/names/otfl-names.lua"
fontlist = dofile(cachefile)
assert(fontlist,"Could not load font name database")
local tmp = {}
for _,font in ipairs(fontlist.mappings) do
tmp[#tmp + 1] = font.fontname
end
table.sort(tmp)
for _,fontname in ipairs(tmp) do
print(fontname)
end
调用它
./listluatexfonts
更新:
替换cachefile
TexLive 2014的名称:
cachefile = kpse.expand_var("$TEXMFVAR") .. "/luatex-cache/generic/names/luaotfload-names.luc"
这个对我有用。
答案3
luafindfont -n "*"
列出所有可由xelatex
/使用lualatex
而无需特殊路径设置的字体。-n 表示“无符号名称列”