![Mover luacode a un archivo Lua, acceder a glifos por nombre](https://rvso.com/image/399816/Mover%20luacode%20a%20un%20archivo%20Lua%2C%20acceder%20a%20glifos%20por%20nombre.png)
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.sprint
pero 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_name
manual luaotfload
indica 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 luacode
medio 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 .tex
archivo, 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 \fontchar
producen los glifos esperados de la fuente Emmentaler, mientras \luafontchar
causan el error mencionado e imprimen el glifo alternativo.