У меня есть пакет, который включает (в основном) следующий код (предоставленный участником после запроса)этот вопросна 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
вызывают указанную ошибку и печатают резервный глиф.