![Перемещение luacode в файл Lua, доступ к глифам по имени](https://rvso.com/image/399816/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20luacode%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%20Lua%2C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D0%B3%D0%BB%D0%B8%D1%84%D0%B0%D0%BC%20%D0%BF%D0%BE%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8.png)
У меня есть пакет, который включает (в основном) следующий код (предоставленный участником после запроса)этот вопросна 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
вызывают указанную ошибку и печатают резервный глиф.