包裹lilyglyphs
提供了一组宏,可轻松将 Lilypond 字体合并到 XeLaTeX 文件中。该软件包现已可用这里。我正在使用 TeXLive 2013。
通过以下 MWE,它可以与 XeLaTeX 一起正常运行:
\documentclass{memoir}
\usepackage{fontspec}
\usepackage{lilyglyphs}
\begin{document}
\lilyTimeC
\end{document}
使用 LuaLaTeX 运行它会导致以下错误:
! Undefined control sequence. \lilyGetGlyph #1^^@-\XeTeXglyph
\XeTeXglyphindex "#1"
我追溯到core/genericAccess.inp
包含以下行的文件:
\newcommand*{\lilyGetGlyph}[1]{\XeTeXglyph\XeTeXglyphindex"#1" }
好的,这是 XeTeX 专用命令。我需要 LuaTeX 版本才能让这个命令与 LuaLaTeX 配合使用。我发现这个答案这表明:
\def\lilyGetGlyph#1{\directlua{fonts.otf.char("#1")}}
但是当我在 MWE 上运行 LuaLaTeX 时出现以下错误:
! LuaTeX error [string "\directlua "]:1: attempt to index field 'otf' (a nil value)
stack traceback:
[string "\directlua "]:1: in main chunk.
\lilyGetGlyph ...\directlua {fonts.otf.char("#1")}
我不知道这意味着什么,但我也不理解我尝试修复的语法(我只是不断输入文字和符号,希望能够起到作用)。
因此,我正在寻找 XeLaTeX 代码的 LuaTeX 版本,以便该包能够lilyglyphs
与 LuaLaTeX 配合使用。当然,前提是这是解决此问题的正确方法。
答案1
好吧,显然\directlua{fonts.otf.char
LuaTeX 不再支持这个答案。幸运的是他们(@phg)也提供了解决方案:
\usepackage{luaotfload,luacode}
\begin{luacode}
documentdata = documentdata or { }
local stringformat = string.format
local texsprint = tex.sprint
local slot_of_name = luaotfload.aux.slot_of_name
documentdata.fontchar = function (chr)
local chr = slot_of_name(font.current(), chr, false)
if chr and type(chr) == "number" then
texsprint
(stringformat ([[\char"%X"]], chr))
end
end
\end{luacode}
\def\lilyGetGlyph#1{\directlua{documentdata.fontchar "#1"}}
我将其添加到core/genericAccess.inp
文件中,现在一切都正常了。我在原始代码中添加了一些测试来检查 LuaTeX 与 XeTeX,并将所有这些发送给包的作者。