OTF fonty v pdfTeXu

Na straně 132 TeXu pro pragmatiky popisuji způsob využití OTF fontu v pdfTeXu. Je třeba zvolit ,,výřez`` maximálně 256 znaků ve formě .enc souboru a tyto znaky použít v TeXové metrice .tfm. Pak můžete použít jiný .enc soubor a jiné znaky stejného fontu použít v jiné TeXové metrice. Nakonec můžete tedy získat přístup ke všem znakům fontu, jen je třeba k nim přistupovat po částech v různých TeXových metrikách.

Bohužel použitý program otftotfm na převod fontů z .otf do .pfb a .tfm změnil své chování a tím se text na straně 132 TeXu pro pragmatiky stal neplatný.. Tato stránka uvádí věci na pravou míru.

Problém se dá stručně popsat takto: Použití přepínače --no-virtual v nových verzích otftotfm nevytvoří ve fontu kerningové ani ligaturní informace, třebaže je specifikováno -fkern -fliga. Přitom na uvedené straně 132 použití přepínače --no-virtual doporučuji.

Nepoužívejte tedy --no-virtual. Z toho ale neplyne, že není možno komplikovanosti s virtuálními fonty nakonec odstranit. Pro implementaci fontů v zásadě nepotřebujeme virtuální font, protože se nedá očekávat, že bude potřeba nějaký znak sestavovat ze znaků původního OTF fontu jako kompozitní.

Popíšu, jak připravit pro pdfTeX font Lido, máme-li soubor LidoSTF.otf.

otftotfm -e xl2f LidoSTF.otf -fkern -fliga lido-8z

Tento příkaz vytvoří soubor lido-8z.tfm s metrikou fontu a LidoSTF.pfb s kompletním přepisem všech znaků z původního LidoSTF.otf. Kromě toho bohužel vytvoří zbytečný a nebezpečný lido-8z.vf a dále zbytečný lido-8z--base.tfm. Také vygeneruje vlastní .enc soubor a navrhuje ho použít. Pokud ale nežádáme speciální fontfeatures, které mění znaky (např. smcp, onum), vystačíme si s původním .enc souborem, tedy xl2f.enc.

Soubor lido-8z.tfm obsahuje ligatury a kerningové informace, o čemž se můžeme přesvědčit pomocí příkazu

tftopl lido-8z | less 

Zhruba od 20. řádku jsou vidět údaje označené jako LIGTABLE.

Před dalšími experimenty je nutné vymazat soubor lido-8z.vf. Jeho přítomnost kdekoli v systému adresářů, kde ho je schopen pdfTeX najít, způsobí potíže: zcela jiné chování, než potřebujeme. Po jeho nalezení se pdfTeX dozví, že má přesměrovat hledání fontu z původního lido-8z na lido-8z--base, ale já doporučuji tento font vymazat a nepoužít ho ani v map řádku. Tedy vše zjednodušit. Příslušný map řádek pak vypadá takto:

lido-8z LidoSTF "XL2encodingF ReEncodeFont" <xl2f.enc <LidoSTF.pfb

Tento řádek stačí vložit (s rovnítkem v předu) jako \pdfmapline přímo do dokumentu. Pak není nutné řešit map řádky na úrovni konfigurace pdfTeXu, což je asi výrazně pohodlnější. Máme-li tedy v aktuálním adresáři soubory lido-8z.tfm a LidoSTF.pfb, můžeme vyzkoušet v pdfTeXu tento dokument:

\font\f=lido-8z
\pdfmapline{=lido-8z LidoSTF "XL2encodingF ReEncodeFont" <xl2f.enc <LidoSTF.pfb}

\f Tady je zkouška nového písma Lido, fialka.

\end

Celou rodinu fontů vygenerujeme takto:

otftotfm -e xl2f LidoSTF.otf -fkern -fliga lido-8z
otftotfm -e xl2f LidoSTFBold.otf -fkern -fliga lido-b-8z
otftotfm -e xl2f LidoSTFItalic.otf -fkern -fliga lido-i-8z
otftotfm -e xl2f LidoSTFBoldItalic.otf -fkern -fliga lido-bi-8z
rm *base.tfm *.vf

Nyní můžeme fonty použít (ve stejném adresáři) takto:

\message{FONT: LidoSTF - \string\rm, \string\it, \string\bf, \string\bi.}

\font\tenrm = lido-8z     \sizespec
\font\tenbf = lido-b-8z   \sizespec
\font\tenit = lido-i-8z   \sizespec
\font\tenbi = lido-bi-8z  \sizespec
\tenrm

\pdfmapline{=lido-8z LidoSTF "XL2encodingF ReEncodeFont" <xl2f.enc <LidoSTF.pfb}
\pdfmapline{=lido-b-8z LidoSTF-Bold "XL2encodingF ReEncodeFont" <xl2f.enc <LidoSTF-Bold.pfb}
\pdfmapline{=lido-i-8z LidoSTF-Italic "XL2encodingF ReEncodeFont" <xl2f.enc <LidoSTF-Italic.pfb}
\pdfmapline{=lido-bi-8z LidoSTF-BoldItalic "XL2encodingF ReEncodeFont" <xl2f.enc <LidoSTF-BoldItalic.pfb}

Soubory *.tfm a *.pfb můžeme nainstalovat do TeXové distribuce (metriky mezi metriky, pdf soubory mezi pfb soubory a výše uvedený soubor lidofont.tex mezi *.tex soubory) a aktualizovat databázi (typicky texhash). Pak vám bude fungovat \input lidofont v jakémkoli dokumentu.

Existují potíže s nejednoznačným značením standardních ligatur v OTF fontech. Někteří tvůrci je značí jako f_i, f_f_i a jiní jako fi, ffi. Pro první případ je třeba použít soubor xl2f.enc a v map řádku psát XL2encodingF ReEncodeFont (jak bylo ukázáno výše), zatímco pro druhý případ je třeba použít soubor xl2.enc při spuštění otftotfm i v map řádku a dále v map řádku psát XL2encoding ReEncodeFont.

Většina fontů neobsahuje beztečkové j (font Lido je v této věci spíše výjimkou a obsahuje ho). Přitom enc soubory xl2.enc nebo xl2f.enc tento znak obsahují. Zjistí-li otftotfm požadavek na neexistující znak, v jistém smyslu se pomátne a vygeneruje kromě základního přepisu znaků NazevFontu.pfb ještě zcela nefunkční NazevFontuLCDFJ.pfb a k tomu odpovídající metriku nazev-fontu--lcdfj.tfm. Tyto soubory můžete s klidným svědomím vymazat, pokud tedy vymažete dle tohoto návodu i *.vf. Vše ostatní funguje. Jen samozřejmě, nemůžete předpokládat, že bude fungovat beztečkové j.

Některé fontfeatures jsou založeny na výměně znaků na jistých pozicích za jiné, například smcp zamění mínusky za malé kapitálky. V takovém případě není možné v map řádku použít původní .enc soubor, ale je vhodné si vypůjčit automaticky generovaný, přejmenovat ho na něco srozumitelnějšího a uvnitř něj zkrátit smysluplně název kódování. Ukážeme si to na příkladu fontu LinLibertine_R.otf, o kterém otfinfo -f praví, že obsahuje feature smcp.

otftotfm -e xl2f LinLibertine_R.otf -fkern -fsmcp linlib-c
rm linlib-c.vf linlib-c--base.tfm

Program oznámí na terminálu, jaký vygeneroval enc soubor. V mém případě to byl soubor a_6s23y2.enc, takže jsem jej přejmenoval na něco smysluplného:

mv a_6s23y2.enc LinlibC.enc

a v tomto souboru jsem vyměnil název /AutoEnc_6s23y22xycakrfwoj66alkt2hc za /LinlibC (a smazal poznámku o tom, že se to nemá editovat). Nyní je možné font vyzkoušet:

\font\f=linlib-c
\pdfmapline{=linlib-c LinLibertineO "LinlibC ReEncodeFont" <LinlibC.enc <LinLibertineO.pfb}

\f Tady píšu fontem Linux Libertine v kapitálkách.

\end