lualatex で独自の合字を定義するにはどうすればいいですか?

lualatex で独自の合字を定義するにはどうすればいいですか?

なぜ合字が機能しないのでしょうか?

\documentclass[12pt,a4page]{article}
\usepackage{fontspec}
\setmainfont[FeatureFile=pytanie.fea,
 Path = /usr/share/fonts/dejavu/,
 Extension=.ttf]{DejaVuSerif}
\begin{document}
ambona amarant żółw flaming i filharmonia.

młot
\end{document}

ファイルpytanie.fea

languagesystem DFLT dflt;
languagesystem latn dflt;
feature liga {
 sub \a \m by \fl;
 sub 0061 by uniF731;
 sub m ł by uni0062;
} liga;

am標準の合字f_laUnicode 文字F731に変換する必要がありますb

答え1

フィーチャファイルベースのアプローチがなぜ機能しないのかはわかりません。しかし幸いなことに、グリフ置換を直接実行するために、Lua 関数と TeX 側の「ラッパー」マクロ ( および という名前\myligsOn)をいくつか記述するのはそれほど難しくありません\myligsOff

以下のコードでは、フォントを から に切り替えましたDejaVuSerifGaramond Premier Pro前者には位置 のグリフがないようですuniF731

ここに画像の説明を入力してください

% !TEX TS-program = lualatex
\documentclass{article}

%% load fontspec package and specify main font
\usepackage{fontspec}
\setmainfont{Garamond Premier Pro}% -- DejaVuSerif has no glyph at pos. F731

%% Lua-side code 
\usepackage{luacode}
\begin{luacode*}
function myligs ( s )
   s = unicode.utf8.gsub ( s , '(\\?)([%a@]+)' , function( backslash, text )
   -- no substitutions inside (La)TeX macros
       if backslash=='' then 
           text = unicode.utf8.gsub (text, 'mł', 'b' )  
           text = unicode.utf8.gsub (text, 'am', 'fl' )  
           text = unicode.utf8.gsub (text, 'a', '\\char"F731' )  
       end
       return backslash .. text
   end)
   return s
end
\end{luacode*}

%% TeX-side code
\newcommand\myligsOn{\directlua{luatexbase.add_to_callback(
      "process_input_buffer", myligs, "myligs")}}
\newcommand\myligsOff{\directlua{luatexbase.remove_from_callback(
      "process_input_buffer", "myligs")}}

\begin{document}

\myligsOn
\small  % Note: The 'a' in '\small' is *not* being converted to '\char"F731'.
mł am a

\myligsOff
mł am a
\end{document}

関連情報