czwartek, 23 czerwca 2022

plain LuaTeX

luaTeX to najlepsza wersja TeXa bo ma tę przewagę nad pdfTeXem, że natywnie używa Unicode + potrafi korzystać z fontów systemowych. Jak się używa LaTeXa, to na tym można zakończyć. Jak ktoś chce plain-TeX (czyli zapewne kiedyś używał MeXa), to potrzebuje jako minimum: format z polskimi regułami przenoszenia wyrazów, no i możliwość dołączania rysunków.

W luaTeXu robi się to następująco (TeXlive):

Należy odszukać plik etex.src (np. /usr/local/texlive/2022/texmf-dist/tex/luatex/hyph-utf8/etex.src). Plik ten powinien zawierać wiersz:

  \addlanguage {USenglish}{hyphen}{}{2}{3}%

Po tym wierszu należy dodać

\addlanguage{polish}{loadhyph-pl.tex}{}{2}{2}

Teraz należy wygenerować format:

  luatex -ini luatex.tex
  ## powstał plik luatex.fmt; który kopiuję
  ## do katalogu z innymi formatami

Polskie reguły są włączane poleceniem:

\uselanguage{polish}

Fonty można deklarować tak, jak w poniższym przykładzie, w którym zakładamy skład fontem ChaparralPro

\input luaotfload.sty
%% https://www.wfonts.com/font/chaparral-pro
%% Potrzebujemy `family name` ale ChaparralPro też działa (why?)
%% otfinfo -a FONT wypisze family name
\def\MainSFont{name:Chaparral Pro}
\font\rm = "\MainSFont:+tlig" at 9.9pt
\font\it = "\MainSFont/I:+tlig" at 9.9pt
\font\bf = "\MainSFont/B:+tlig" at 9.9pt
\font\bi = "\MainSFont/BI:+tlig" at 9.9pt
%% \bf włącza odmianę grubą \it kursywę jak to plainie...

Zwróćmy uwagę, że odmiana jest deklarowana jako /X po nazwie kroju; potem po dwukropku (opcjonalnie) deklaruje się font features. Jako minimum warto dodać tlig, co włączy ligatury TeXowe (takie jak -- zamiast myślnika.) Inne użyteczne features, to smcp oraz onum:

%% Caps/smallcaps
\font\sc = "\MainSFont:+tlig,+smcp" at 9.9pt
%% Old style numbers
\font\sco = "\MainSFont:+tlig,+smcp,+onum" at 9.9pt

Dołączanie rysunków/kolorowanie/obracanie:

%% zPlainowany LaTeXowy pakiet graphicx:
\input graphicx.tex
\includegraphics[width=.9\hsize]{plik.png}
%% zPlainowany LaTeXowy pakiet color:
\input color.tex
\textcolor{red}{bbb}  \colorbox{green}{one two}
%% obracanie:
\rotatebox{90}{\colorbox{blue}{\textcolor{yellow}{Stand with Ukraine}}}
%% skalowanie
%% x-przeskaluj na 40% \hsize
\resizebox{.4\hsize}{!}{Stand with Ukraine}
%% xy-przeskaluj na 40%
\resizebox{.4\hsize}{2cm}{Stand with Ukraine}
%% Powiększ oryginał 2 razy
\scalebox{2}{Stand with Ukraine}

No i tyle. Podstawowa funkcjonalność jest. Z MeXa zostały tylko wzorce przenoszenia. Reszta stała się zbędna, więc nie ma czegoś takiego jak luaMeX. Postęp jest nieubłaganyn nawet w świecie TeXa...

Kompletny mini-przykład

%% -*- coding: utf-8 -*-
%% należy kompilować luaTeXem
\input luaotfload.sty
\input graphicx.tex
\input color.tex
%%
\uselanguage{polish}
%%%
\def\MainSFont{Iwona}
\font\rm = "\MainSFont:+tlig;+onum" at 9.9pt
\font\it = "\MainSFont/I:+tlig;+onum" at 9.9pt
\font\bf = "\MainSFont/B:+tlig;+onum" at 9.9pt
\font\bi = "\MainSFont/BI:+tlig;+onum" at 9.9pt
%% Small caps
\font\sc = "\MainSFont:+tlig;+smcp" at 9.9pt
%% Old style numbers
\font\sco = "\MainSFont:+tlig;+smcp;+onum" at 9.9pt

\def\SwUA{\colorbox{blue}{\textcolor{yellow}{Stand with Ukraine}}}
\def\dig{0123--456---789}

\rightskip0pt plus 1fil
\nopagenumbers

\rm \SwUA \dig {\bf \SwUA \dig } {\it \SwUA \dig }

{\sc \SwUA \dig } vs {\sco \SwUA \dig }


\rotatebox{90}{\resizebox{.4\hsize}{!}{\SwUA}}

\scalebox{2}{\SwUA}
\bye

i wynik

UWAGA: uważny czytelnik zauważy, że nie do końca jest to co miało być (small caps zawsze jest z OldStyleNumbers i nie idzie tego wyłączyć), bo niektóre font features są ignorowane. Z fontem Chaparral jest jeszcze gorzej: nawet smcp jest ignorowane.

Żeby było śmieszniej po usunięciu \input luaotfload.sty i kompilacji xeTeXem jest OK. Dalsze testy można streścić następująco: niektóre fonty nie są poprawnie deklarowane; deklarowanie tych samych fontów w LaTeXu daje poprawne rezultaty (ale z użyciem fontspeca); przetwarzanie xeTeXem też daje poprawne rezultaty. Na moje coś jest spieprzone w plainowej wersji luaotfload, ale konkretnie co to nie ustaliłem albo fontspec jest bardziej cwany i lepiej deklaruje fonty.

Relewantna literatura to dokumentacja do dwóch pakietów: https://www.ctan.org/pkg/fontspec oraz https://www.ctan.org/pkg/luaotfload.

Dopisane 23 czerwca 2022 (wieczorem): Pytanie zadałem na githubie (https://github.com/latex3/luaotfload/issues/229) i już wiem co było nie tak. Trzeba było dodać mode=node;script=latn, tj. na przykład:

\font\sc = "\MainSFont:mode=node;script=latn;+tlig;+smcp" at 9.9pt

You can check in the log how exactly fontspec specifies the font and copy that in your plaintex document.

1 komentarz: