Portál AbcLinuxu, 2. května 2025 17:25

TeX – 7 (OpenType fonty)

12. 12. 2013 | Petr Olšák
Články - TeX – 7 (OpenType fonty)  

Na konci 90. let ustoupily fonty generované Metafontem do pozadí a nejčastěji se i v TeXu používaly fonty Type1 (formát od Adobe). Vedle toho stály fonty formátu TrueType od Microsoftu, které ale měly pro obtahy implementovány jen kvadratické spliny na rozdíl od kubických a často byly postiženy nevhodnou implementací. DTP svět se jim tedy vyhýbal obloukem, případně před tiskem prováděl konverze, což fontům taky nepomohlo k lepší reputaci.

Lidé v DTP rozlišovali počítače poněkud zjednodušeně na Mac a PC a na obou těchto platformách byla implementace fontů Type1 naprosto odlišná. To společně s faktem, že metriky a obtahy byly ve zvláštních souborech, nebylo příliš praktické. A tak na počátku milénia začali v Microsoftu pracovat na následníkovi formátu TrueType a jejich rival Adobe se k nim překvapivě přidal a vznikl formát OpenType. Metrika i obtahy jsou ve společném souboru a formát je nezávislý na platformě. V Linuxu máme možnost tyto fonty použít např. v implementaci X Window systému X.org, taky díky knihovnám pango, freetype, Qt a dalším a můžeme je použít pochopitelně v XeTeXu nebo v LuaTeXu.

Obsah

Zavedení fontu v klasickém TeXu

link

V klasickém TeXu potřebujeme mít zvlášť metriku fontu. S obtahy znaků pracuje až ovladač DVI. V TeXu píšeme:

 
\font\prepinac=<metrika> % <metrika> se uvádí bez přípony .tfm 
nebo: 
\font\prepinac=<metrika> at<velikost>
nebo: 
\font\prepinac=<metrika> scaled<poměr zvětšení>

například: 
\font\fa=pzcmi8z at12.3pt   % font ve velikosti 12,3 bodů
nebo: 
\font\fb=pzcmi8z scaled1380 % základní velikost 10 bodů násobená 1,38

V textu se pak přepínač fontu použije přirozeně například {\fa takto}. 

V uvedené ukázce je použit font Zapf Chancery, ale to by poznal jen specialista na TeXové fonty, protože z názvu metriky pzcmi8z to nelze snadno poznat. Tyto zkrácené názvy metrik (motivované tím, že názvy souborů kvůli přenositelnosti na stařičkých systémech musejí být omezeny na 8+3) jsem vždy považoval za velkou nevýhodu v koncepci TeXového přístupu k fontům. Nevýhodu násobenou ještě skutečností, že TeX pochopitelně neposkytuje interaktivní nabídku dostupných fontů. Vytvořil jsem tedy někdy před deseti lety makro OFS, které dokáže generovat vzorníčky fontů, vypisuje na terminál a do logu přehledy fontů a umožňuje používat přirozené názvy. Při dnešním použití XeTeXu nebo LuaTeXu už toto makro pozbývá smyslu: je možné přímo používat skutečné názvy fontů a vzorníček ve formě interaktivní nabídky instalovaných fontů v systému obstará jiný program.

Fonty v LaTeXu

link

LaTeXoví uživatelé ani v době před XeTeXem neměli potřebu se zabývat nečitelnými názvy metrik dostupných fontů. To řeší použitý styl. Uživatel se typicky s primitivním příkazem \font nesetká. Místo toho pracuje s předdefinovanými přepínači \textbf, \textit, atd. Může ale použít doplňkové styly, které zavádějí kompletní rodinu fontů dle názvu, například \usepackage{times}.

Při nástupu verze 2e (na začátku 90. let) se stalo součástí LaTeXu Mittelbachovo makro NFSS (new font selection scheme), které vybírá fonty prostřednictvím tzv. fd souborů. V nich je implementováno propojení mezi zkratkami jednotlivých metrik a novými, podobně nesrozumitelnými, zkratkami použitými uvnitř LaTeXu. Uživatel nebo programátor stylu pak vybíral font pomocí maker NFSS. LaTeX navíc pomocí maker převzal do svých rukou i přepínání mezi kódováním fontů a veškerý text prostřednictvím aktivních znaků převáděl do interní na kódování nezávislé reprezentace LICR (LaTeX internal character representation) a ta byla expandována do kódování použitého fontu.

Pro LaTeX je tedy přechod na XeTeX nebo LuaTeX jednoznačným vysvobozením z této složitosti. Není nutné žádné LICR. Pro výběr fontů je v tomto novém prostředí připraven balíček fontspec.

Zavedení OpenType fontu v XeTeXu

link

XeTeX je prolinkován s fontovou knihovnou operačního systému (v Linuxu fontconfig) a dokáže také najít dle názvu souboru OpenType fonty v TeXové distribuci nebo v aktuálním adresáři. XeTeX z toho důvodu rozšiřuje možnosti příkazu \font takto:

 
\font\prepinac="Jméno Fontu:<fontfeatures>" <at nebo scaled jako v klasickém TeXu> 
nebo: 
\font\prepinac="[jméno-otf-souboru]:<fontfeatures>" <at nebo scaled> 

XeTeX dokáže najít podle jména fontu jen font instalovaný v systému. Dokáže pracovat jednak s plným názvem (obvykle s mezerami) i s kondenzovaným PostScriptovým názvem (bez mezer). Ukázka bude za chvíli následovat.

Nepovinné parametry <fontfeatures> specifikují dodatečné parametry fontu a pohovoříme o tom za chvíli. Za názvem fontu (při hledání podle názvu) a před dvojtečku je možné navíc umístit přepínače /B, /I, nebo /BI, což způsobí zavedení fontu stejné rodiny, ale ve variantě Bold, Italic nebo BoldItalic. Druhá možnost, jak k fontu přistoupit, je použít jeho plný název nebo název souboru.

Zavedení OpenType fontu v LuaTeXu

link

LuaTeX rozšiřuje příkaz \font stejně jako XeTeX, ovšem toto rozšíření je dostupné až po spuštění inicializačního luakódu. To lze udělat například pomocí \input luafonts nebo \input luaoftload.sty. Obě makra dělají z hlediska fontů to samé. První z nich (moje makro) zavede jen potřebný luakód, zatímco druhé makro řeší ještě plno dalších věcí, které s fonty zcela nesouvisejí, a je tedy obtížné zjistit, co to všechno dělá.

LuaTeX nabízí další syntaktické možnosti parametru příkazu \font: prefix name nebo file a obklopení názvu fontu namísto uvozovek závorkami {, }. Mně se vyplatilo používat výhradně XeTeXový způsob zápisu, kterému LuaTeX taky rozumí. Toho se budu držet i v následujících ukázkách.

Instalace OpenType fontu LinuxLibertine

link

Pro další ukázky možností OpenType fontů je v tomto článku použit font LinuxLibertine. Z uvedené stránky je možné stáhnout fonty v souborech *.otf. Dále se nabízí několik možností: fonty necháte jen v aktuálním adresáři (a budete je vyhledávat jen pomocí jména souboru), nebo je instalujete do  systému, nebo je instalujete mezi TeXové fonty. Také je můžete konvertovat do  Type1 pro použití v klasickém TeXu.

Varianta instalace fontu do sytému: Soubory *.otf umístěte někam do /usr/share/fonts/. Pak pomocí příkazu fc-cache (spuštěným pod právy roota) obnovte databázi instalovaných fontů. Pomocí příkazu fc-list se můžete přesvědčit, že font je instalován.

Varianta instalace do TeXového adresáře: Soubory *.otf umístěte někam do .../texmf-local/fonts/opentype/. Pak pomocí příkazu texhash (spuštěným pod právy roota) obnovte databázi názvů prohledávaných souborů.

Varianta převodu OpenType fontu do Type1 a jeho instalace do TeXového adresáře: Tato možnost je popsána v dodatku F knížky TeX pro pragmatiky a umožní OpenType font použít i pdfTeXem nebo klasickým TeXem. O rozšířené možnosti OpenType fontů přitom nepřicházíme, neboť pro každou generovanou metriku nastavujeme příslušný Encoding vektor a sadu <fontfeatures>. Takových metrik (navázaných na stejný Type1 font) můžeme vygenerovat libovolně mnoho.

Pomocí příkazu otfinfo -i soubor.otf je možné se podívat na základní parametry OpenType fontu (jeho plný název, komprimovaný PostScriptový název atd.). Je možné použít další přepínače příkazu a zjistit o fontu více informací. Můžete si to vyzkoušet.

Ukázka zavedení OpenType fontu příkazem \font

link

Vyzkoušejte vytvořit následující soubor:

 
% zavedení Lua-kódu pro LuaTeX. Při použití XeTeXu neuděláme nic: 
\ifx\directlua\undefined \else \input luafonts \fi 
\baselineskip=14pt % řádkování 

\font\f="Linux Libertine O Italic" at12pt 
\f Tady je textík ve vybraném fontu. 

\font\f="Linux Libertine O/I" at12pt 
\f Zavede se stejný font. 

\font\f="LinLibertineOI" at12pt 
\f Zavedený stejný font podle komprimovaného PostScriptového názvu. 

\font\f="[LinLibertine_RI]" at12pt 
\f Font zavedený podle názvu souboru. Znovu stejný font. 

\end

Tento soubor zpracujte příkazem xetex soubor nebo luatex soubor. V obou případech byste měli dostat stejný výsledek, pokud je font nainstalován v systému. Je-li font instalován jen v TeXovém adresáři, pak vyhledávání podle názvu fontu bude fungovat jen v LuaTeXu. Ten si automaticky obnovuje svou vlastní font-cache, kdykoli zjistí, že nemůže najít font. Tato font-cache se generuje jednak podle font-cache v systému a jednak podle souborů instalovaných v TeXovém adresáři.

Speciální vlastnosti OpenType fontů

link

OpenType fonty umožňují natavit tzv. „fontfeatures“ (slovo „fontfeature“ nebudu překládat, bude mít ženský rod a zkratku FF). Typické využití FF je znázorněno ve fontu Linux Libertine na  této www stránce. FF lze rozdělit do tří skupin:

Povšimněte si, že FF se oddělují středníky, zapínají se (nepovinným) prefixem + a vypínají prefixem -:

 
% Zavedení Lua-kódu pro LuaTeX. Při použití XeTeXu neuděláme nic: 
\ifx\directlua\undefined \else \input luafonts \fi 

\catcode‘-=11 % znak - může být součástí řídicí sekvence 
\baselineskip=14pt % řádkování 

% Základní font: 
\def\basefont{Linux Libertine O} \def\atsize{at12pt}
\font\f="\basefont" \atsize

% Zkouška fontfeatures: 
\font\f-caps  = "\basefont:+smcp" \atsize 
\font\f-nolig = "\basefont:-liga" \atsize 
\font\f-hligs = "\basefont:+hlig;+dlig" \atsize 
\font\f-alt   = "\basefont:+hlig;+dlig;+salt" \atsize 
\font\f-frac  = "\basefont:+frac" \atsize 
\font\f-sup   = "\basefont:+sups" \atsize 
\font\f-sub   = "\basefont:+sinf" \atsize 
\font\f-odig  = "\basefont:+pnum;+onum" \atsize 

\f 
Tady je text ve fontu \basefont. 
{\f-caps Zde jsou malé kapitálky}. 

Vidíme, že font má zapnuty ligatury fi, fl. 
{\f-nolig Nyní jsou vypnuty: fi, fl}. 

Historické ligatury st, tz, jsou vypnuty a nyní 
{\f-hligs jsou zapnuty ct, st, tz}. 

Místo některých znaků je možné použít alternativy: 
{\f-alt Y\&Y} namísto Y\&Y. 

Zlomky vypadají takto: 1/2, 3/5 a 
vytuněné zlomky vypadají jinak {\f-frac 1/2, 3/5, 1234/5678}. 

Čísla 01234 normální pro tabulky a medievalové {\f-odig 1234567890}. 

Dolní indexy: {\f-sub 123a4bc5}, horní indexy{\f-sup x}. 
CH{\f-sub3}CH{\f-sub2}OH. 

\end 

Po zpracování ukázky XeTeXem nebo LuaTeXem byste měli dostat takový výsledek.

Každý font může disponovat jinými FF, které jsou navíc seskupené do tzv. skriptů nebo jazykových skriptů s různými implicitními hodnotami. Je obtížné jednoduše zjistit, co je v obdrženém fontu dosažitelné a co je nastaveno jako implicitní. K fontu by tedy měla být přístupná dokumentace. Zavoláte-li FF, která ve fontu neexistuje, neprojeví se a žádného varování ani chyby se nedočkáte. Seznam FF včetně jejich podrobné specifikace je na  této stránce, ale písmolijny si mohou vymýšlet další a naopak zde uvedené nemusejí podporovat. Seznam FF podporovaných v daném fontu lze vypsat pomocí otfinfo -f soubor.otf.

Font loader může podporovat na fontu nezávislé další FF. Například LuaTeX nabízí FF tlig, což aktivuje TeXovské ligatury --, --- atd. XeTeX má pro stejný účel FF ve tvaru přiřazení: mapping=tex-text.

Další „jakoby FF“ může nabízet makro pro volbu fontů. V dokumentaci k balíčku fontspec je například uvedena FF pro barvu a průsvitnost fontu, FF pro velikost fontu atd. To vše je řešeno na úrovni makra.

Seriál TeX (dílů: 15)

První díl: TeX – 1 (seznamujeme se), poslední díl: TeX – 15 (mikrotypografie).
Předchozí díl: TeX – 6 (fonty)
Následující díl: TeX – 8 (život s TeXlive)

Další články z této rubriky

Týden na ScienceMag.cz: Hubbleovo napětí by mohl vyřešit pomalu rotující vesmír
Týden na ITBiz: Halucinace balíčků při programování AI
Týden na ScienceMag.cz: Kvantová elektronika v křemíku a diamantu
Týden na ITBiz: DeepSeek nic nemění, umělá inteligence vyžaduje obrovské investice do cloudové infrastruktury
Týden na ScienceMag.cz: Komplexní modely AI prý zpochybňují Occamovu břitvu

Diskuse k tomuto článku

ghibulo avatar 13.12.2013 19:35 ghibulo | skóre: 6 | blog: ghibulo
Rozbalit Rozbalit vše Re: TeX – 7 (OpenType fonty)
Odpovědět | Sbalit | Link | Blokovat | Admin
Pěkný článek, jen u toho posledního zdrojového textu je chyba, kvůli které to nejde přeložit - jde o ten znak za catcode, ... je tam použit "‘" a mělo by být "`".
olsak avatar 14.12.2013 07:53 olsak | skóre: 29
Rozbalit Rozbalit vše Re: TeX – 7 (TrueType fonty)
Odpovědět | Sbalit | Link | Blokovat | Admin
Vzhledem k tomu, že se v systémech často vyskytují TryeType fonty a zaznamenávám na ně časté dotazy a také vzhledem k tomu, že se k fontům už nechci v seriálu vracet, zmíním TTF aspoň zde v komentáři.

PdfTeX umí s TTF fonty pracovat zcela stejně jako s PFB (Type1) fonty. Tj. je třeba konverzními programy připravit TeXovou metriku *.tfm a překopírovat *.ttf soubory do TeXového adresáře. Nakonec je třeba doplnit údaje do map souboru. Postup je velmi přehledně vyložen zde. Jen doporučuji v případě pdfcsplainu použít soubor xl2.enc namísto souboru v článku zmíněném.

LuaTeX umí vše, co pdfTeX, tedy práce s TTF fonty je v něm stejná jako v pdfTeXu.

XeTeX s TTF fonty neumí pracovat způsobem jako pdfTeX. Místo toho k nim dokáže přirozeně přitoupit, jsou-li instalovány v systému.

15.12.2013 23:31 Louda
Rozbalit Rozbalit vše Re: TeX – 7 (OpenType fonty)
Odpovědět | Sbalit | Link | Blokovat | Admin
určite neco dělam špatně když se pokouším to překládat v LuaLatexu že? Skrátka je to pro LuaTex a tim je to uzavřene, beru.

No dovolte i prosim ale jednu naprosto laickou otázku kde by mi nekdo česky vysvetlil jaký je vlastně rozdíl mezi balíčkem polyglossia a babel. nemusíte zachazet do detailu jen staci v hrubých rysech, nebo klidně mě i odkázat na stránku konkrétní knihy v češtině, kde je toto rozvedeno. Děkuji.
16.12.2013 08:09 vencas | skóre: 32
Rozbalit Rozbalit vše Re: TeX – 7 (OpenType fonty)
polyglossia podporuje více jazyků než babel (zejména se jedná o jazyky nepsané latinkou včetně jazyků psaných zprava doleva) a používá fontspec pro natahování fontů pro specifický jazyk. Z hlediska funkčnosti (aspoň v češtině) jsem si žádného rozdílu nevšiml, ale používám jen základní věci.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.