¿Cómo puedo definir mis propias ligaduras en lualatex?

¿Cómo puedo definir mis propias ligaduras en lualatex?

¿Por qué no funcionan mis ligaduras?

\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}

Archivopytanie.fea

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

Necesito convertir ama ligadura estándar f_l, aa carácter Unicode F731y a b.

Respuesta1

No puedo decirle por qué el enfoque basado en archivos de funciones no funciona. Afortunadamente, sin embargo, no es demasiado difícil escribir una función Lua y un par de macros "contenedores" del lado TeX (llamadas \myligsOny \myligsOff) para realizar las sustituciones de glifos directamente.

En el código siguiente, cambié la fuente de DejaVuSerifa Garamond Premier Pro, ya que la primera no parece tener un glifo en la posición uniF731.

ingrese la descripción de la imagen aquí

% !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}

información relacionada