将 luacode 移动到 Lua 文件,通过名称访问字形

将 luacode 移动到 Lua 文件,通过名称访问字形

我有一个包含(基本上)以下代码的包(由一位贡献者在询问后提供这个问题在 tex.stackoverflow 上)。

\begin{luacode}
  documentdata = documentdata or { }
  documentdata.fontchar = function (chr)
    local chr = luaotfload.aux.slot_of_name(font.current(), chr, false)
    print(chr)
    if chr and type(chr) == "number" then
      tex.sprint(string.format([[\char"%X]], chr))
    end
  end
\end{luacode}
\def\fontchar#1{\directlua{documentdata.fontchar "#1"}}

此函数根据字体名称定位字形并将其打印到 TeX 文档中。

我开始将包转换为仅 Lua 的包,并希望将该代码移动到单独的 Lua 文件中。(最终该函数应该不是使用tex.sprint但返回一个字符串,我想知道是否可以通过 Lua 传递这样的字形,但这是一个后续问题)。

然而,当我做我认为正确的翻译时却出现错误:

local character = {}

function character.char_by_name(name)
    local chr = luaotfload.aux.slot_of_name(font.current(), name, false)
    if chr and type(chr) == "number" then
      tex.sprint(string.format([[\char"%X]], chr))
    else
        tex.sprint('f') -- 'forte' character to show "not found"
    end
end

return character

它说。实际上,这听起来很合理,因为手册中luaotfload | aux : invalid parameters to slot_of_name (16, nil)false的文档指出了函数的签名。鉴于该文档,我想知道为什么这在环境中首先起作用。aux.slot_of_nameluaotfloadaux.slot_of_name(name : string)luacode

这是完整的 MWE。我假设它可以lilyglyphs在 TeX Live 中安装时(或音乐集)进行编译,因为它会随它一起安装使用的特殊字体。这是文件.tex,上面的 Lua 示例保存在character.lua

\documentclass{scrartcl}
\usepackage{luaotfload,luacode}

\begin{luacode}
  documentdata = documentdata or { }
  documentdata.fontchar = function (chr)
    local chr = luaotfload.aux.slot_of_name(font.current(), chr, false)
    if chr and type(chr) == "number" then
      tex.sprint(string.format([[\char"%X]], chr))
    end
  end
\end{luacode}
\def\fontchar#1{\directlua{documentdata.fontchar "#1"}}

% Alternative implementation in Lua file
\directlua{lua_char = require('character.lua')}
\newcommand{\luafontchar}[1]{\directlua{lua_char.char_by_name(#1)}}

\font\mainfont="emmentaler-11" at 20pt

\begin{document}
    \mainfont
    \noindent
    \fontchar{clefs.C}\\
    \fontchar{clefs.G}\\
    \fontchar{flags.u7}

    \bigskip
    \luafontchar{Something}
\end{document}

调用\fontcharEmmentaler 字体来产生预期的字形,同时\luafontchar导致提到的错误并打印后备字形。

结果

相关内容