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ファイルに移動したいと考えています。(最終的には関数はない使用し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_nameluaotfloadaux.slot_of_name(name : string)luacode

完全な MWE は次のとおりです。TeX Live に (または音楽コレクション) がインストールされている場合は、使用されている特別なフォントも一緒にインストールされるため、コンパイルできると思います。これは、上記の Lua の例が保存されているファイルlilyglyphsです。.texcharacter.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}

\fontcharEmmentaler フォントから期待されるグリフを生成するための呼び出しにより、\luafontchar前述のエラーが発生し、フォールバック グリフが印刷されます。

結果

関連情報