Mover luacode a un archivo Lua, acceder a glifos por nombre

Mover luacode a un archivo Lua, acceder a glifos por nombre

Tengo un paquete que incluye (básicamente) el siguiente código (proporcionado por un colaborador después de preguntaresta preguntaen 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 función localiza un glifo de una fuente por su nombre y lo imprime en el documento TeX.

Estoy empezando a convertir el paquete a un paquete exclusivo de Lua y quiero mover ese código en un archivo Lua separado. (Eventualmente la función deberíanouse tex.sprintpero devuelva una cadena, y me gustaría saber si es posible pasar dichos glifos a través de Lua, pero ese es un problema de seguimiento).

Sin embargo, cuando hago lo que pensé que era una traducción correcta, aparece un error:

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

Dice luaotfload | aux : invalid parameters to slot_of_name (16, nil)false. En realidad, esto suena razonable, dado que la documentación del aux.slot_of_namemanual luaotfloadindica aux.slot_of_name(name : string)la firma de la función. Dada esa documentación, me pregunto por qué esto funcionó en primer lugar, en el luacodemedio ambiente.

Aquí está el MWE completo. Supongo que se puede compilar cuando lilyglyphs(o la colección de música) se instala en TeX Live, porque instala la fuente especial usada con él. Este es el .texarchivo, con el ejemplo de Lua anterior guardado en 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}

Las llamadas \fontcharproducen los glifos esperados de la fuente Emmentaler, mientras \luafontcharcausan el error mencionado e imprimen el glifo alternativo.

Resultados

información relacionada