Movendo luacode para arquivo Lua, acessando glifos por nome

Movendo luacode para arquivo Lua, acessando glifos por nome

Eu tenho um pacote que inclui (basicamente) o seguinte código (fornecido por um contribuidor após solicitaressa questãoem 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"}}

Esta função localiza um glifo de uma fonte pelo seu nome e o imprime no documento TeX.

Estou começando a converter o pacote em um pacote somente Lua e quero mover esse código para um arquivo Lua separado. (Eventualmente a função devenãouse tex.sprint, mas retorne uma string, e gostaria de saber se é possível passar esses glifos por Lua, mas isso é um problema de acompanhamento).

No entanto, quando faço o que considero uma tradução correta, recebo um erro:

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

Diz luaotfload | aux : invalid parameters to slot_of_name (16, nil)false. Na verdade, isso parece razoável, visto que a documentação do aux.slot_of_namemanual luaotfloadindica aux.slot_of_name(name : string)a assinatura da função. Dada essa documentação, estou me perguntando por que isso funcionou em primeiro lugar, no luacodeambiente.

Aqui está o MWE completo. Presumo que ele possa ser compilado quando lilyglyphs(ou a coleção de músicas) estiver instalado no TeX Live, porque ele instala a fonte especial usada com ele. Este é o .texarquivo, com o exemplo Lua acima salvo em 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}

As chamadas para \fontcharproduzir os glifos esperados da fonte Emmentaler, \luafontcharcausam o erro mencionado e imprimem o glifo substituto.

Resultados

informação relacionada