Проблема с пользовательской функцией шрифта для дополнительного кернинга в шрифте OpenType

Проблема с пользовательской функцией шрифта для дополнительного кернинга в шрифте OpenType

Я пытаюсь добавить некоторый пользовательский кернинг к шрифту OpenType, используемому с помощью fontspec. lualatexРеальный пример использует Brillшрифты, но поскольку они не являются частью TeX Live, я использую их Libertinusв примере ниже.

Я хочу добавить кернинг между определенными символами с диакритическими знаками и надстрочными числами. Единственная комбинация, которая работает, — это прямое использование надстрочных чисел Unicode. Как только я использую \textsuperscript, который переопределяется с помощью realscriptsдля использования правильных цифр, дополнительный кернинг не применяется.

Есть ли способ добиться желаемого при использовании \textsuperscript?

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

\usepackage{fontspec}
% Values below are for demonstration purposes only
\directlua {
   fonts.handlers.otf.addfeature {
      name = "supkern",
      type = "kern",
      data = {
         ["ī"] = {
            ["¹"] = 500,%
            ["two.sups"] = 500,%
         },
         ["š"] = {%
            ["one.sups"] = 500,%
            ["two.sups"] = 500,%
         },
      },
   }
}
\usepackage[defaultfeatures={RawFeature={+supkern}}]{libertinus} %Brill in real life
\usepackage{realscripts}

\begin{document}
   ī\textsuperscript{12}
   
   ī¹
   
   ī{\addfontfeatures{VerticalPosition=Superior}2}
   
   {\addfontfeatures{RawFeature={+supkern}}ī\addfontfeatures{VerticalPosition=Superior}12}
   
   š\textsuperscript{2}
   
\end{document}

решение1

Код realscripts добавляет команду \addfontfeature. И это в основном означает, что у вас есть два разных шрифта. Что-то вроде этого должно работать, но нужно добавить несколько тестов, чтобы это не давало сбой, если шрифт не имеет верхних индексов. Посмотрите в код realscript.

\documentclass{article}

\usepackage{fontspec}
% Values below are for demonstration purposes only
\directlua {
   fonts.handlers.otf.addfeature {
      name = "supkern",
      type = "kern",
      data = {
         ["ī"] = {
            ["¹"] = 500,%
            ["two.sups"] = 500,%
         },
         ["š"] = {%
            ["one.sups"] = 500,%
            ["two.sups"] = 500,%
         },
      },
   }
}
\usepackage[defaultfeatures={RawFeature={+sups,+supkern}}]{libertinus} %Brill in real life
\RenewDocumentCommand\textsuperscript{m}{#1}
\begin{document}
   ī\textsuperscript{12}

ī¹ 
\end{document}

Связанный контент