![Movendo luacode para arquivo Lua, acessando glifos por nome](https://rvso.com/image/399816/Movendo%20luacode%20para%20arquivo%20Lua%2C%20acessando%20glifos%20por%20nome.png)
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_name
manual luaotfload
indica 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 luacode
ambiente.
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 .tex
arquivo, 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 \fontchar
produzir os glifos esperados da fonte Emmentaler, \luafontchar
causam o erro mencionado e imprimem o glifo substituto.