Wie kann ich in Lualatex eigene Ligaturen definieren?

Wie kann ich in Lualatex eigene Ligaturen definieren?

Warum funktionieren meine Ligaturen nicht?

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

Dateipytanie.fea

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

Ich muss amin eine Standardligatur f_l, ain Unicode-Zeichen F731und in konvertieren b.

Antwort1

Ich kann Ihnen nicht sagen, warum der Featurefile-basierte Ansatz nicht funktioniert. Glücklicherweise ist es jedoch nicht allzu schwierig, eine Lua-Funktion und einige TeX-seitige „Wrapper“-Makros (mit den Namen \myligsOnund \myligsOff) zu schreiben, um die Glyphenersetzungen direkt durchzuführen.

Im folgenden Code habe ich die Schriftart von DejaVuSerifauf geändert Garamond Premier Pro, da erstere an der Position kein Glyph zu haben scheint uniF731.

Bildbeschreibung hier eingeben

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

verwandte Informationen