Перемещение 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_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вызывают указанную ошибку и печатают резервный глиф.

Полученные результаты

Связанный контент