![將 luacode 移到 Lua 文件,按名稱存取字形](https://rvso.com/image/399816/%E5%B0%87%20luacode%20%E7%A7%BB%E5%88%B0%20Lua%20%E6%96%87%E4%BB%B6%EF%BC%8C%E6%8C%89%E5%90%8D%E7%A8%B1%E5%AD%98%E5%8F%96%E5%AD%97%E5%BD%A2.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 檔案中。 (最終該函數應該不是usetex.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。我假設它可以在TeX Live(或音樂集)安裝時進行編譯lilyglyphs
,因為它會安裝使用的特殊字體。這是.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 字型產生預期字形的調用, while\luafontchar
會導致上述錯誤並列印後備字形。