使用 LuaTeX 打印字体名称

使用 LuaTeX 打印字体名称

我想使用 LuaTeX 的字体表打印字体名称(全名、ps 名称、文件名等)。以前它工作正常,但最近我遇到了来自 luaotfload 的错误消息

这是一个最小的工作示例,

\documentclass{article}
\usepackage{fontspec}
% \setmainfont{Minion Pro}

\begin{document}
\directlua{
  local str = font.fonts[font.current()].fullname
  tex.sprint(-2, str)
}
\end{document}

此示例在使用 LuaTeX 编译时可以正常工作。输出 PDF 包含字符串LMRoman10-Regular,这是默认字体。但是,如果我不注释掉该setmainfont行,即加载 Minion Pro 字体,则会收到以下错误消息,

error: ...3/texmf-dist/tex/luatex/luaotfload/luaotfload-merged.lua:7656: attempt to perform arithmetic on local 'factor' (a nil value)
.
\newpage ...k \@nobreakfalse \everypar {}\fi \par 
                                                  \vfil \penalty -\@M 

相关线路luaotfload-merged.lua如下:

function injections.setkern(current,factor,rlmode,x,tfmchr)
  local dx=factor*x
  if dx~=0 then
    local bound=#kerns+1
    setattr(current,a_kernpair,bound)
    kerns[bound]={ rlmode,dx }
    return dx,bound
  else
    return 0,0
  end
end

当我tex.sprint用 替换该行时inspect,控制台正确显示Minion Pro Regular

有人知道这里发生了什么事吗?

我正在使用最新的 TeXLive 2013 安装。

答案1

索引font.fonts表可能会导致字体加载器布局的数据结构被覆盖。 提供对这些字体的安全访问font.getfont()。 如果您想检索其他字体(例如 TFM/OFM 或虚拟字体),那么您必须编写一个包装器,如下所示:

local fontdata = fonts.hashes.identifiers
local my_getfont = function (id)
  local f = fontdata[id]
  if f then
    return f
  end
  return font.fonts[id]
end

fonts.hashes.identifiers字体加载器将其初始化的字体保存在哪里。

相关内容