將 luacode 移到 Lua 文件,按名稱存取字形

將 luacode 移到 Lua 文件,按名稱存取字形

我有一個包(基本上)包含以下程式碼(由貢獻者在詢問後提供)這個問題在 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中的文件指出了函數的簽名。鑑於該文檔,我想知道為什麼這首先在環境中起作用。luaotfloadaux.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會導致上述錯誤並列印後備字形。

結果

相關內容