![Verschieben von Luacode in eine Lua-Datei, Zugreifen auf Glyphen nach Namen](https://rvso.com/image/399816/Verschieben%20von%20Luacode%20in%20eine%20Lua-Datei%2C%20Zugreifen%20auf%20Glyphen%20nach%20Namen.png)
Ich habe ein Paket, das (im Wesentlichen) den folgenden Code enthält (von einem Mitwirkenden auf Anfrage bereitgestellt)diese Frageauf 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"}}
Diese Funktion sucht anhand des Namens nach einem Glyph einer Schriftart und druckt ihn in das TeX-Dokument.
Ich beginne gerade damit, das Paket in ein reines Lua-Paket umzuwandeln und möchte den Code in eine separate Lua-Datei verschieben. (Irgendwann sollte die Funktionnichtverwenden tex.sprint
, aber eine Zeichenfolge zurückgeben, und ich würde gerne wissen, ob es möglich ist, solche Glyphen über Lua weiterzugeben, aber das ist ein Folgeproblem).
Wenn ich jedoch eine meiner Meinung nach korrekte Übersetzung mache, erhalte ich eine Fehlermeldung:
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
Da steht luaotfload | aux : invalid parameters to slot_of_name (16, nil)false
. Das klingt eigentlich vernünftig, wenn man bedenkt, dass die Dokumentation aux.slot_of_name
im luaotfload
Handbuch aux.slot_of_name(name : string)
als Signatur der Funktion angibt. Angesichts dieser Dokumentation frage ich mich, warum das in dieser luacode
Umgebung überhaupt funktioniert hat.
Hier ist das komplette MWE. Ich nehme an, dass es kompiliert werden kann, wenn lilyglyphs
(oder die Musiksammlung) in TeX Live installiert wird, da es die verwendete spezielle Schriftart mit installiert. Dies ist die .tex
Datei, in der das obige Lua-Beispiel gespeichert ist 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}
Die Aufrufe zum \fontchar
Erzeugen der erwarteten Glyphen aus der Schriftart Emmentaler \luafontchar
verursachen den genannten Fehler und drucken die Fallback-Glyphe.