我有一个包含(基本上)以下代码的包(由一位贡献者在询问后提供这个问题在 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_name
luaotfload
aux.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}
调用\fontchar
Emmentaler 字体来产生预期的字形,同时\luafontchar
导致提到的错误并打印后备字形。