Archive for the 'TeX tutorial' Category


TeX tutorial: III. Základy makrojazyka, vkládání obrázků 3

Pod minulým článkem jistý Jirka psal, že by uvítal článek o vkládání obrázků do textu. Vzhledem k tomu, že toto má být prakticky zaměřený seriál, je to docela dobrý nápad. Dnes se tedy obrázků dočkáte. Ještě než se k nim dostaneme, budeme si muset osvojit základy makrojazyka TeXu.

Jednoduše řečeno, s TeXem komunikujeme pomocí maker. Makra jsou v plainu zleva uvozena znakem ‘\’ (pokud se vám tento znak nelíbí, můžete ho jednoduše vyměnit za jiný, ale tím se zabývat nebudeme, protože to věru praktické není). Následuje popis, jakým způsobem makro přijímá parametry a vlastní tělo makra. Popis vstupu může vypadat například podobně jako v tomto makru:

\def\abc#1#2#3{#1, #2, #3}

V tomto případě makro přijímá tři parametry, které jdou přesně za sebou a ve výsledku se vypíšou oddělené čárkami a mezerami. Můžeme si ale vstup nadefinovat i zábavněji, například takto:

\def\defg[#1]|#2|(#3){#1, #2, #3} \defg[text]|oddělený|(čárkami)

Pokud neposkytnuteme vstup v předepsaném formátu (na druhém řádku), nastane chyba. Skuteční vtipálci pak při definici maker mohou zajít ještě dále.

\def\abc babička #1°°°°#2[#3]{#3#2#1} \abc babička a°°°°dědeček[???]

V naprosté většině případů si ale vystačíme s definicemi podobnými prvnímu příkladu, maximálně použijeme nějaké hranaté závorky, aby naše makra vypadala opravdu krutě, ale do větších extrémů se pouštět nebudeme. V prvním příkladu bych vás ještě měl upozornit na častou začátečnickou chybu.

\def\abc#1#2#3{#1, #2, #3!} \abc Jedna dvě tři.

Pokud si myslíte, že naše volání způsobí vysázení Věty „Jedna, dvě, tři.“, mýlíte se. Pokud nejsou specifikovány oddělovače, jako první parametr se bere první skupina nebo znak, který následuje. V tomto případě není první parametr „Jedna“, ale „J“. Obdobně je to s dalšími parametry. Náprava je velmi jednoduchá.

\abc{Jedna}{dvě}{tři}.

Existuje ještě jeden velmi elegantní a praktický způsob, jak psát některá makra (zejména nadpisy), který jsem okoukal z článků pana Olšáka.

\def\nadpis#1\par{% {\velkympismem\noindent#1}% \vskip8dd\noindent% } \nadpis Velký článek Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, balónky působí jako jakási fata morgána uprostřed pouště.

Tento způsob je dosti v souladu s představou TeXu jako značkovacího jazyka, kde značky mají být pro koncového uživatele (pisatele, spisovatele) přirozené a jednoduché (čili žádné vnořené složené závorky či jiná zvěrstva). Až budete psát svá makra, pište je jednoduše a elegantně.

Dobře. A jak je to tedy s těmi obrázky?

Nejprve bychom měli k našemu zdrojovému souboru přiložit knihovnu, která obsahuje potřebná makra (protože je pochopitelně sami psát nebudeme).

\input graphicx

A potom již pouze využíváme makro \includegraphics, které za nás udělá tu nejšpinavější práci (vloží obrázek do dokumentu). S jeho zarovnáním se už musíme vyrovnat sami.

\vskip6dd \centerline{\includegraphics[scale=0.75]{spojvis2.png}} \centerline{\ita{Obr. 8. -- 9 vteřin po spuštění simulace}} \vskip10dd

Tímto makrem vložíme do dokumentu obrázek spojvis2.png v měřítku 0,75:1 a zarovnáme ho na sřed. Těsně pod něj potom vložíme jeho popis, který bude taktéž zarovnaný na sřed (\ita je nějaké vámi definované makro, které vypíše popis příslušným stylem – například kursivou). Jaké parametry má makro \includegraphics a jaká jiná makra knihovna graphicx obsahuje, si již můžete zjistit sami. My se zaměříme na sazečskou práci.

Makro \centerline expanduje na \line{\hss#1\hss}, přitom už víme, že \line exapnduje na \hbox to\hsize. \hbox to\hsize vytvoří horizontální kontajner o šířce sazebního obrazce \hss vkládá nekonečně roztažitelnou dynamickou horizontální mezeru. Pokud takovou mezeru vložíme po obou stranách nějakého objektu, potom bude takový objekt přesně uprostřed sazebního obrazce. Kdybych vás teď požádal, abyste napsali makro, které zarovná objekt napravo, určitě byste věděli jak (vložili byste onu podivnou mezeru pouze nalevo, tím pádem by objekt „přimáčkla“ napravo).

Teď už určitě rozumíte celému makru, které vkládá obrázek doprostřed stránky. Častý požadavek mnoha lidí bývá takzvané „obtékání“ textu kolem obrázku. Známá ne-moc-častá extravagantní „featura“, kterou znáte z novin či z wordovských dokumentů, které jsou dle jejich autorů až neuvěřitelně kruté. I takové obtékání se dá v TeXu implementovat, ale předem vás upozorňuji na to, že makro, které je jednoduché pro koncového uživatele, je vysoce netriviální a obsahuje řadu výpočtů. My se pokusíme napsat makro, které nám způsobí obtečení jednoho konkrétního obrázku a neměnném odstavci.

V plainu existuje primitiv \parshape, se kterým si kreativní duše jistě vydrží hrát celé dny. Specifikuje tvar následujícího odstavce, čili můžete vytvořit kulaté, trojúhelníkovité, šipkovité či jinak tvarované odstavce. Primitiv má následující tvar:

\parshape n i1 h1 i2 h2 i3 h3 ... in hn

kde n je počet řádků, i je odsazení od levého okraje příslušné řádky a h je šířka příslušné řádky.

Potřebujeme nejdříve změřit obrázek, který chceme vkládat. To uděláme tak, že zkonstruujeme kontajner, do kterého vložíme obrázek a celý kontajner následně uložíme do paměti pod číslem 1.

\setbox1\hbox{\includegraphics[scale=0.5]{impuls.png}}

Vytvoříme si nový délkový registr \a a uložíme do něj šírku boxu 1.

\newdimen\a \a=\wd1

A zamyslíme se, jak bychom mohli takové obtečení udělat. Existuje mnoho způsobů. Mě zrovna napadá tento. Vysázíme odstavec, pod něj vložíme obrázek, který posuneme nahoru dovnitř odstavce. Makrem \parshape potom „uhneme“ s řádky, které zasahují o obrázku.

\newdimen\b \b=\a \advance\b by5dd \newdimen\c \c=\hsize \advance\c by-\b \newdimen\d \d=\ht1 \advance\d by\baselineskip \parshape 21 0dd \hsize 0dd \hsize 0dd \hsize 0dd \hsize \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c 0dd \hsize \noindent Vítr skoro nefouká a tak by se na první pohled mohlo zdát, že se balónky snad vůbec nepohybují. Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, balónky působí jako jakási fata morgána uprostřed pouště. Zkrátka široko daleko nikde nic, jen zelenkavá... ...(zde záměrně chybí text) ...ani ne moc vysoko, ani moc nízko nad zemí. \vskip-254dd \box1 \hbox to \a{\hfil\ita{Obr. 4. -- Odezva systému}% \hfil} \newdimen\e \e=254dd \advance\e by-\d \vskip\e Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, ...

Jak vidíte, vytvořil jsem ještě tucet nových registrů, se kterými jsem občas provedl tajemnou operaci \advance\… by. Bystřejší z vás jistě tuší, že se bude jednat o přičítání, resp. odečítání délek s/od registrů nebo registrů navzájem. \htX je výška (HeighT) uloženého kontajneru číslo X. \boxX vysází kontajner číslo X a zároveň ho vymaže z paměti (proto všechno to ukládání). Je zřejmé, co celý kód dělá, proto neposkytnu žádné rozšiřující vysvětlení :) (pokud by měl někdo problém, budu rád, když se zeptá v komentářích). Zato poskytnu obrázek, jak takový obtečený obrázek bude vypadat.

Obtékání obrázku v TeXu
Obtékání obrázku v TeXu

Pokud přidáte nebo odeberete pár slov z odstavce, celé se vám to rozhaší :(. Je to proto, že jsme kód navrhovali pro jednu jedinou situaci. Náš kód zdaleka není universální a jak již jsem předesílal, universální kód by byl velmi velmi složitý. Obtékání obrázku textem obecně nedoporučuji používat.

To by byly obrázky. V příštím díle bych se rád věnoval praktickým dorbnostem, jako jsou funkce pdfTeXu – obarvování textu, jeho rotace, posuny (nikoli přes matice zobrazení! jsme začátečnický seriál a nevíme, co je to algebra). Dále bych vám chtěl ukázat, jak oživit vaše dokumenty (udělat je „klikací“) a jak například generovat obsah. A to vše pouze s formátem plain! A eplain :). A občas (jako dnes) ukradneme latexu některé z jeho knihoven (které v něm díky Bohu nejsou napsány, a tak některé z nich můžeme používat).

Bitstream Charter alternative 0

Kingova Temná věž (nakladatelství Beta Dobrovský, sazba SF-PRINT) je sága vázaná v sedmi knihách s pevnou vazbou o celkovém počtu stran přesahujícím tři a půl tisíce. Tento magnum opus je tak rozsáhlý, že nároky na hygieničnost četby exponenciálně vzrůstají.

Neznámá a nenalezitelná firma SF-PRINT tyto nároky splnila excelentně. Po estetické stránce je sazba velmi nadprůměrná (jedna ze sedmi knih dokonce dodržuje řádkový rejstřík). Obzvláště jsem byl nadšen použitým písmem. Pokud jsem dříve říkal, že je téměř nemožné vymyslet nové a zároveň použitelné patkové písmo, potom firma Bitstream Inc. dokázala téměř nemožné.

Když se začtete do nějaké beletrie psané tímto písmem, připadá vám čtení téměř fyzicky měkké, příjemné, komfortní. Ještě se mi nestalo, že bych měl ze čtení podobný zážitek, proto jsem se vydal ono písmo hledat. Vskutku není jednoduché najít jedno konkrétní písmo ve statisících. K výsledku mě po měsících dovedla náhoda. Při brouzdání internetem (po stránkách s problematikou TeXu) jsem si v jednom nápisu povšimnul hranatého písmene „r“. Právě nezvyklý a nezvykle hezký tvar písmene „r“ mi při čtení Temné věže utkvěl v paměti… a tak jsem poznal, že jsem po měsících skutečně došel k cíli.

Je to Bitstream Charter.

Protože v roce 1992, jak jsem se dočetl, věnoval Bitstream toto písmo X konsorciu s licencí umožňující volně distribuovat upravená písma, vznikla velice kvalitní alternativa známá jako Charis SIL. Zkušebně jsem si v tomto písmu vysázel jednu kapitolu z poslední knihy Temné věže, na kterou se můžete podívat. Zdůrazňuji, že dokument musíte vytisknout, abyste dostali pravdivý výsledek. Písmo navrhované pro tisk na tiskárnách s vysokým rozlišením nelze korektně zobrazit na LCD dispalyi. Pro ty, kterým se nechce klikat, mám aspoň obrázek:

Charis SIL

TeX tutorial: II. Znakové sady 3

V minulém díle jste se naučili vyjádřit své sbohem krutému světu, ve kterém žijete. Stačila vám na to tři slova. Dnes se pokusíte rozloučit o něco lépe a s o něco větší grácií. Již vám nepostačí pouhá tři slova a budete chtít celou větu, celý odstavec nebo rovnou celou stránku.

Z předchozího odstavce (nebo z titulku) jste si jistě domysleli, že se dnes budeme bavit o znakových sadách (fontech či písmech, chcete-li). Znakové sady existují od doby, co si lidé vyvinuli první písmo, jehož jednotlivé znaky nosili v hlavách a při nejbližší příležitosti je sázeli do nejprve kamenů, potom na papyrus, na papír, na promítací plátno a na obrazovku počítače. Za Guttenberga lidé naučili umění uchovávat a kopírovat znakové sady dřevo. Následně se tímto materiálem stalo železo, poté snadno odlévatelný tiskařský kov, poté na malou chvíli materiál podobný filmu. V posledních letech lidé pokročili a naučili uchovávat znakové sady energii v jejích nejrůznějších nehmotných formách (magnetismus, elektrický náboj, parasitní kapacity).

Jak tedy nyní sedíte u vašeho počítače a třímáte v rukou myš, měli byste si uvědomit, že pokaždé, když stisknutím klávesy zobrazujete nějaký znak, provádíte činnost, která je nepředstavitelně stará a tak nadčasová, že přetrvá i samotné lidstvo. Úctyhodné, že? A proto byste měli i k elektronické sazbě přistupovat s úctou. Pokud vytisknete dokument a objevíte nějakou hrubici… ať už gramatickou, typografickou nebo estetickou, měli byste ji opravit a dokument vytisknout znovu. Když jsem sázel svůj první domácí úkol na DSA v TeXu (se spoustou matematiky), tiskl jsem ho šestkrát. Člověk, který nějaký dokument píše, v něm potom velice obtížně hledá chyby, které by byly pro jiného očividné.

K věci. Původní plain TeX funguje tak, že máte v adresářové struktuře distribuce TeXu rozházeny tisíce souborů se znakovými sadami (ve formátu t1 – Adobe Type1 a metafontovém mf) a k nim na úplně jiných místech soubory s odpovídající metrikou (ve formátu tfm – TeX Font Metric). K tomu, aby TeX nějakou znakovou sadu použil, bezpodmínečně tyto soubory s metrikou potřebuje. Ono jeden by řekl, že by to nemusel být zas až takový problém, ale vezměte v úvahu, že souborů k jedné rodině musíte posbírat v jednom případě hned 10. V jiném připadě třeba přes 40. Vysvětlím.

Každý řez písma (roman, kurzíva, tučný, polotučný) vyžaduje vlastní t1 (popř. mf) a tfm. U precizních písmových rodin má každý řez dobrých 5 různých velikostí – čili to máme 4 soubory pro velikost 5, 4 pro 7, 4 pro 10, 4 pro 11, 4 pro 12. 4 soubory je ale mnohdy číslo značně podhodnocené. Mnoho rodin písma obsahuje vlastní znakové sady pro matematické symboly (opět v různých velikostech) a další vlastní znakové sady pro rozšířenou matematiku. Šílenství, že? Další nepříjemná věc je, že podle názvu souboru začátečník nepozná, o jaký font se vlastně jedná. Například cs-qcsr je znaková sada Century Schoolbook roman :). Tyto názvy potřebujete přesně znát, pokud chcete onen font použít.

Proto je to v XeTeXu uděláno jinak. Fonty se identifikují systémovými názvy a jsou brány (zejména jejich tvar) ze systémové banky fontů (v MS Windows jsou to všechny „nainstalované“ fonty). Obrovskou výhodou je, že to nemusí být pouze Type1 (nebo mf) fonty, ale mohou být i TrueType, OpenType nebo AAT. Ono pokud jste dostatečně šikovní, dokážete TeX donutit spolupracovat se zcela libovolným formátem písma, protože ve skutečnosti TeX znaky jako takové vůbec nezajímají. Zajímá ho pouze metrika (tfm). To je ale první liga, kterou zatím ani nesledujete.

Jak tedy nějaký vámi vybraný font „nahrát“?

\font\a = "Jmeno:mapping=tex-text:+liga" at 10dd

XeTeX se pokusí najít v systému font Jmeno. Pokud ho nenajde, pochopitně vám začne nadávat. Pokud najde, pokusí se u nich aktivovat prvky, které specifikujete za dvojtečkami. „mapping=tex-text“ znamená, že se budou v textu tradičně nahrazovat dva spojovníky za sebou za en-pomlčku a tři spojovníky za em-pomlčku (čtverčíkovou). „+liga“ aktivuje opentypovou featuru (nevím, jak bych to česky nazval) liga (což jsou běžné ligatury – fi, fl, ffl). Slovy „at 10dd“ nebo „at10dd“ říkáte, že chcete kuželku písma o velikosti deseti bodů. Míru si můžete zvolit libovolně (některé známé míry jsou cc (Cicero=12dd), pt, pc (Pica=12pt), mm). XeTeX si následně vygeneruje tfm metriku a tu potom používá.

Písmo si samozřejmě můžete vybrat jaké chcete. Nejlépe byste udělali s Baskervillem nebo Jannonem, ale pravděpodobně je nemáte k disposici. Zde nabízím malý vzorník ucházejících volně dostupných písem a porovnání s Baskervillem (kde je jasně nejhezčí):

Vzorník písem
Vzorník písem

Jsou seřazeny podle jejich kvality (souzeno mnou). Kdybych neměl Baskerville, stále bych používal Century Schoolbook – je výborně čitelný. Následující výpis uvádí celé definice. Stačí si jen vybrat.

\font\schola = "TeX Gyre Schola:mapping=% tex-text:+liga" at 10dd \font\pagella = "TeX Gyre Pagella:mapping=% tex-text:+liga" at 10dd \font\bonum = "TeX Gyre Bonum:mapping=% tex-text:+liga" at 10dd \font\termes = "TeX Gyre Termes:mapping=% tex-text:+liga" at 10dd \font\century = "Century Schoolbook:mapping=% tex-text:+liga" at 10dd

Tyto fonty bohužel neobsahují žádné nadstandardní opentype featury, jako volitelné ligatury (:+dlig), vzácné ligatury (:+rlig), historické ligatury (:+hlig), stylistické alternativy (:+salt), skákavé číslice (:+onum), proporcionální číslice, tabulkové číslice, apod. Baskerville ale všechno toto obsahuje, takže definice by mohly vypadat následovně.

\font\bask = "Baskerville10Pro:mapping=tex-text% :+dlig:+hlig:+liga:+rlig:+clig:+salt:+onum" at 10dd \font\baskk = "Baskerville10Pro:mapping=tex-text:% -liga" at 10dd

Kdybychom použili každou zvlášť, výstup by vypadal následovně.

Ligatury
S a bez OpenType Fetures

Definiční řádky jsou zlomeny komentářem (znak %), aby nepřelezly řádku. Ve vašem kódu procento odmažte a definici napište na jeden řádek. Lámání řádků komentářem je TeXový fenomén a určitě jste se s ním nesetkali naposledy. Dělá se to proto, že TeX bere znak pro nový řádek jako součást textu určeného k sazbě a může se vám stát, že když budete vaše makra lámat „enterem“, objeví se vám v dokumentech nežádoucí mezery, které se posléze těžko hledají. Pokud před enterem napíšete znak pro uvození komentáře (%), je znak pro odřádkování zakomentován a nemůže se tudíž objevit v sazbě.

Jak definované fonty používat? Na to už jste zřejmě přišli během článku (užitím \jmeno). Uvedu ale ještě pár dobrých zvyklostí.

V TeXu se vyskytují skupiny (bloky kódu), které vytvářejí obory názvů (namespaces) a platnosti. Skupina je uvozena znaky „{“ a „}“. Vše, co se mezi těmito znaky stane (s mnoha a mnoha výjimkami :) ) mezi nimi zůstává. Čili změníte-li aktuální font v jednom oboru názvů, který skončí, změna už nebude platit. Je dobré definovat si font v oboru názvů nejvyšší úrovně – čili ihned na začátku – a veškeré změny fontů realizovat ve skupinách. Mohli byste sice napsat

\hlavnifont Ahoj, \jinyfont jak to jde? \hlavnifont Měj se.

,ale lépe je napsat

\hlavnifont Ahoj, {\jinyfont jak to jde?} Měj se.

, což vyprodukuje naprosto stejný výstup.

Existuje věc, kterou musíte udělat okamžitě po nastavení písma s velikostí kuželky n. Pokud to neuděláte, vaše sazba bude ošklivá a zcela nepoužitelná. Musíte nastavit vzálenost účaří jednotlivých řádek (laicky řečeno nastavit řádkový proklad). Pokud použijete kuželku písma 10dd a ponecháte standardní vzdálenost účaří, budou na sobě řádky sedět a v tomto nastavení ještě nepravidelně, takže výsledek bude opravdu ošklivý. Potřebujete nastavit registr \baselineskip. Hodnota tohoto registru by u běžné literatury standardní velikosti písma nikdy neměla být větší než n+3, spíše by měla být n+2. Pokud máte kuželku písma 10dd, musíte nastavit \baselineskip=12dd!

Nyní, když už si umíte vybrat znakovou sadu dle vašich představ, vás to svádí k produkování celých vět… odstavců… stránek, či dokonce kapitol! To ale ještě nemůžete. Váš výstup by neodpovídal normě a v horším případě by ani nebyl hezký. Vzpomínáte, jak jsem v prvním díle psal o dělení slov?

\uselanguage{czech}

Nebylo to úplně všechno, co potřebujete k tomu, abyste dodrželi standardy a tradice. Za tento řádek je bezpodmínečně nutné vložit ještě tyto:

\frenchspacing \lefthyphenmin=2 \righthyphenmin=3

Makro \frenchspacing nastaví evropské „mezerování“ za interpunkčními znaménky. Podle americké typografické normy (kterou TeX pochopitelně rád svým uživatelům vnucuje) se za interpunkčními znaménky nechávají mírně větší mezery než jak je tomu zvyklostí v evropě, kde se naopak používají mezery kratší. Protože my dodržujeme tradice za každou cenu, pochopitelně \frenchspacing zapneme. \righthyphenmin určuje kolikapísmenný zbytek minimálně musí po dělení slova zůstat na vrchní řádce, zatímco \lefthyphenmin určuje, kolikapísmenný zbytek minimálně musí pokračovat na řádce nové. Podle české normy jsou tato čísla 3 a 2.

Dále ještě musíme definovat české uvozovky, protože v XeTeXu nemáme tu možnost používat styl czech.sty, který je výsadou csTeXu (a i kdybychom měli, stejně by nám nefungovaly, protože v unicode jsou namapovány jinde).

\def\uv#1{{}\char8222{}#1{}\char8220{}}

Tímto kódem trochu předbíhám tento díl tutoriálu, ale chci, aby vaše následující pokusy již měly nějakou úroveň. Vždy, když při psaní budete chtít dát nějaký text do uvozovek, vložíte jej jako parametr makru \uv například takto – \uv{Sbohem, krutý světe,} řekl a následně stiskl tlačítko, které spustilo sazbu.

Dnešní díl byl poněkud delší, za to se omlouvám, ale stále mám pocit, že bych mohl psát dál. To, co jsem v dnešním článku popsal, vystihuje danou problematiku jenom nekonečně malým kouskem… jako jedno dx v určitém integrálu nebo podobně :).

Na závěr bych si dovolil uvést úplný dokument složený z toho, co jsme se zatím naučili (a pár… inu… dost věcí, které ještě neumíme, abych vám dal příležitost hrát si a zkoumat). Zdrůrazňuji, že dokument je určen ke zpracování XeTeXem a zdůrazňuji, že musíte použít kvalitní distribuci (například TeXlive), která obsahuje použitý font (TeX Gyre Schola).

Zdrojový soubor lze stáhnout zde: basker.tex.
Výstup by měl (bude) vypadat takto: basker.pdf.

Dejte se do toho :). Experimentujte, nastavujte různé hodnoty, přepisujte podle vaší libosti :).

Intermezzo: Baskerville ze Střešovic 6

Není možné bavit se o kvalitní typografii bez účasti kvalitní znakové sady (písma nebo fontu, chcete-li). Pokud vezmete do ruky kvalitní (nikoli co do obsahu) knihu a otevřete ji, téměř nikdy neuvidíte jeden z fontů, které znáte a které běžně používáte v té variantě, kterou máte v počítači. To pouze ministerstvo školství vydává otřesně vypadající příručky a dokumenty psané dvěma fonty, které jsou nastaveny jako výchozí v každé instalaci MS Office 2007. Ministerstvo školství vůbec nezajímá, že tyto fonty absolutně nejsou navrženy pro tisk, nýbrž pro zobrazování na LCD obrazovkách (zvláště po letošních volbách sedí na ministerstvech amatéři a lidé z ulice (nejvíce mě baví ministr dopravy, co se v tomto oboru začal vzdělávat až poté, co byl do této funkce obsazen)).

Baskerville typeface
Nestandardní ligatura fk

Návrh znakových sad je precizní umělecká práce, která však musí mít určitou formu (písmeno ‘a’ musí velmi blízce připomínat původní podobu minusky z roku 800 A.D.) a musí být optimalisovaná nejen esteticky, ale i hygienicky (je velice jednoduché přijít o dobrý zrak jeho namáháním). Právě proto je vytvořit nové a zároveň prakticky použitelné písmo téměř nemožné a designeři tak stále znovuoživují standardy, které položili géniové svého oboru, jako byli William Caslon, John Baskerville, G. Bodoni a F. Didot. W. Caslon jako zástupce písem, kterým se říká renesanční antikva (dnešní zástupce je např. Palatino), Baskerville jako zástupce barokní antikvy (např. dnešní Times) a poslední jako zástupce moderní antikvy (např. Computer Modern).

Long s in Baskerville typeface
Dlouhé s

Některé dnes zdarma dostupné znakové sady jsou výsledkem přílišného zjednodušování na úkor pohody při čtení (groteska Arial). Jiná písma jsou tak nadužívaná ve všem možném, včetně běžných dokumentů, že nevybuzují estetický prožitek z čtení a naopak vyvolávají pocit amatérismu (Times New Roman). Zvláště v poslední době se ale objevují i písma velmi kvalitní (Adobe Garamond Pro), na které lze získat určitou licenci dohromady se zakoupením nějakého produktu firmy Adobe (například Photoshopu, InDesignu). I když jsou tato písma velmi propracovaná a obsahují české akcenty, nejsou česká, a tedy se v některých důležitých detailech mohou lišit od tradičního českého stylu sazby. Kvalitní zahraniční písma mi nevyhovují ještě v jednom ohledu. Mnohdy totiž postrádají dnes již řídce používané znaky, které by se dle mého názoru měly co nejdříve opět běžně objevovat v tisku (jinými slovy, nejsou až tak ortodoxní, co se týče typografie, jak bych si přál).

Discretionary ligatures in Baskerville typeface
Volitelné ligatury

Písmo, které vidíte na všech obrázcích v tomto článku, je Baskerville 10 Pro od pana Štorma ze Střešovické písmolijny, které jsem si od prvního pohledu zamiloval. Je to nejhezčí a nejobsáhlejší klasické písmo, jaké jsem kdy viděl. Uspokojuje mě po stránce češtiny a zejména po stránce ligatur a zapomenutých znaků. Obsahuje dokonce ligatury pro dlouhé s (viz druhý obrázek)! Kdo a proč by dnes dělal ligatury pro dlouhé s? Když jsem viděl kompletní znakovou sadu, nemohl jsem věřit svým očím.

Toto ladné a detailně propracované písmo samozřejmě není k disposici zdarma. Licenci lze zakoupit na Storm Type Foundry.

Příští díl: TeX tutorial: II. Znakové sady

TeX tutorial: I. Úvod 5

Nedávno mi Smonty psal návrh na článek… jak bych cosi řešil v TeXu. Uvědomil jsem si ale, že články o TeXu, které se zde čas od času objeví, nikdo nečte, protože

  • je nikdo nehledá a
  • vyžadují od čtenáře znalosti, které nemá.

Je to tedy jenom jakási exhibice. Pěkné obrázky a kusy nesrozumitelného kódu. To bych chtěl dnešním článkem napravit, a proto otevírám malý DIY seriál o TeXu. Vezmu to od úplného začátku a budu se, pokud možno, vyhýbat technickým detailům, protože ty už jsou velmi kvalitně zpracovány v češtině i v angličtině. Pokud má tedy čtenář zájem dozvědět se o kouzlech, která se odehrávají v zákulisí, nechť si koupí knížky pana Olšáka (tuto a tuto).

První, co potřebujete, abyste mohli začít úspěšně TeXovat,… je TeX. Ušetří vám mnoho času, když dáte na moji radu a stáhnete si balík TeX live. V současné době je k dispozici verze 2010. Já používám 2009, ale už z principu byste neměli narazit na problém v kompatibilitě. Po úspěšném nainstalování byste měli mít k dispozici i šikovný editor zvaný TeXworks, který pro vás od této chvíle zcela nahrazuje Word, Writer, InDesign a QuarkXPress. Pokaždé, když budete chtít vytvořit dokument, okamžitě sáhnete po TeXworks.

Pokud jste připraveni, můžeme si vyzkoušet napsat první a nejjednodušší program, který se dá v TeXu vytvořit a který zároveň produkuje výstup.

Sbohem, krutý světe.\bye

Pokud vše proběhne v pořádku, měli byste dostat takovýto výstup v menším měřítku:

Seznamte se se znakovou sadou Computer Modern! Zároveň se s ní však rozlučte, protože toto je jediný díl seriálu, ve kterém ho uvidíte. Autor totiž nemá moderní antikvy rád. Špatně se čtou.

Zpět k věci. Na výstupu se nám nelíbí jedna věc, a to je absence českých znaků. Pokud váš výstup obsahuje i české znaky, pravděpodobně se vám nějakým způsobem podařilo TeXworks přesvědčit, aby ke zpracování kódu použil csplain (což je vysoce kvalitní varianta TeXu z dílny pana Olšáka, která používá českými akcenty obohacenou znakovou sadu Computer Modern). Navzdory kvalitě této varianty ji ale používat nebudeme.

Pokud váš program negeneruje výstup a konzole vám sprostě nadává, vyberte z nabídky v horní liště „pdfTeX“.

Nejprve bychom si ale měli vyjasnit názvosloví. Když dnes někdo říká, že umí sázet v TeXu, velmi pravděpodobně tím říká něco jiného. Buď je takový člověk velmi naivní a považuje TeX pouze za zkratku pro LaTeX, a nebo v dobré víře takto zkracuje formát plain. Sázení v tom nejčistším a nejzákladnějším TeXu znamená, že operátor (ten, kdo obsluhuje sázecí stroj) využívá pouze tzv. primitivy, což jsou elementární příkazy TeXu. Protože jsou tyto primitivy často velmi nízkoúrovňové, a tedy je jich nutno použít více, abychom získali požadovaný výsledek, sdružují se do maker.

Abychom dosáhli vyšší úrovně jazyka TeXu, je nutno sestavit takzvaný formát. Formát je velká a všepokrývající sada maker, která redukuje složitost výsledného kódu a také náročnost jeho sestavení. Jako analogii lze uvést vztah mezi strojovým kódem, jazykem symbolických adres a jazykem c. Narozdíl od této analogie však mezi formáty TeXu neexistuje překlad, nemění se gramatika ani syntaxe (leč už jsem o něčem podobném slyšel).

Základním formátem, který je postaven nad primitivy TeXu (a je do TeXu samotného integrován) je formát plain. Jeho autorem je Donald Knuth a je to jediný formát, se kterým budeme pracovat. Od tohoto okamžiku, vždy, když se zmíním o TeXu, budu mít na mysli formát plain.

V TeXu tedy platí, že

  • každý příkaz, který není primitiv, je makro a
  • každé makro lze konečným počtem kroků expandovat na primitivy.

Chcete-li zjistit, jestli je některý z vašich oblíbených příkazů (popř. těch, které se někdy v budoucnu stanou vašimi oblíbenými) primitiv nebo makro, spusťte konzoli (ať už je to command.com, cmd.exe, powershell… nebo bash (víte, že TeX původně existoval ve verzi pouze pro MS-DOS?)) a spusťte tex. Často stačí pouze napsat „tex“ a odeslat.

Microsoft Windows [Version 6.1.7600] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Users\Michael>tex This is TeX, Version 3.1415926 (Web2C 2009) **\ *\show\vskip > \vskip=\vskip. <*> \show\vskip ? *\show\line > \line=macro: ->\hbox to\hsize . <*> \show\line ? *

Pravděpodobně jste již odhadli, co dělá příkaz \show. Ano, epxanduje makra a na konzoli ukazuje, jak expanze vypadá. V předchozím příkladu vidíte, že \vskip už nijak neexpanduje, zatímco \line expanduje na \hbox to\hsize. \vskip je tedy primitiv a \line je makro.

Možná se teď zlobíte, že jsem vás hned po slibu, že se nebudu zaobírat technickými detaily, zaplavil spoustou technických detailů. Mně se ale tato vědomost již nespočetně mnohokrát hodila, shledávám ji velmi praktickou, a proto jsem vás s ní seznámil.

Nyní ale skutečně začneme s něčím užitečným. Z nabídky v horní liště vyberte XeTeX. XeTeX je variantou TeXu, se kterou budeme odteď pracovat. Tato varianta umožňuje zpracovávání vstupu ve formátu UTF-8 a využití znakových sad, které UTF-8 podporují. Více o tom, v čem se XeTeX odlišuje od TeXu lze nalézt v jednom z předchozích článků.

Zkuste si tento mírně upravený program Hello World:

\uselanguage{czech} \font\a = "Century Schoolbook:mapping=tex-text" at 10dd \a Sbohem, krutý světe.\bye

Váš výstup by nyní měl vypadat takto (ve zmenšeném měřítku samozřejmě):

\uselanguage je šikovné makro, které nahrazuje \chyph csplainu. Toto makro aktivuje české schéma dělení slov. Jak to dělá, to vám zatím prozrazovat nechci. Však by se vám to ani nelíbilo (zkuste si v konzoli \show\uselanguage ;-) ). Pokud se ptáte, odkud se to makro vzalo, ptáte se správně (a máte ode mě pochvalu). Není totiž ve formátu plain a takových maker, které nejsou ve formátu plain a přesto existují, je víc. Implicitně je totiž připojuje samotný XeTeX… nevím odkud, domnívám se jak, ale to teď není podstatné.

\font je primitiv TeXu. Zde však lze říci, že je to primitiv XeTeXu, protože použitý mechanismus se od svého vzoru velmi liší. Fontům se budeme věnovat v následujícím dílu. Pro dnešek vám stačí, že řádka začínající \font deklaruje font Century Schoolbook (který bere z banky operačního systému) o velikosti 10 bodů jako \a. Od té řádky kdykoli TeX narazí na \a změní aktuální font na Century Schoolbook o velikosti 10 bodů.

O \bye si zatím (a asi i s konečnou platností) řekneme, že ukončuje činnost TeXu.

Potřeboval bych vědět, jesli vám tento článek něco přinesl a jestli má cenu pokračovat psaním dalších. Tento článek beru jako pilotní díl.

TeX: Pevný řádkový rejstřík 2

Chceme-li připravit sazbu pro oboustranný tisk, musíme přizpůsobit sazební obrazec tak, aby se na obou stranách listu kryl (aby na sebe prosvítal) – tomu se říká pevný stránkový rejstřík. Pevný stránkový rejstřík najdeme v knihách a kvalitnějších tiskovinách (velice vzácně v diplomových pracích studentů FELu).

Nejpreciznější sazba vyžaduje i pevný řádkový rejstřík, což je věc, kterou dnes nalezneme už jen u vybrané beletrie. Pevný řádkový rejstřík znamená, že na sebe prosívatají všechna účaří jednotlivých řádek textu (laicky řečeno se všechny řádky stoprocentně a bezchybně překrývají). Ve Wordu to nelze a ani v TeXu to není zcela triviální záležitost. V prvé řadě si musíte vzít kalkulačku a spočítat rozměry sazebního obrazce, resp. jeho výšku. Ta totiž musí být celočíselným násobkem vzáleností účaří (\baselineskip).

TeX je velice chytrý program, ale někdy je až moc chytrý. Snaží se narvat pružné mezery (glue) všude, kam to jde, a když se mu něco nezdá dostatečně esteticky správně, mezery natahuje a smršťuje. Co se týče horizontálních pružných mezer, bez těch bychom nebyli schopni správně vysázet jediný odstavec, ale ty vertikální? V našem případě bychom je raději neměli, protože s nimi nikdy nedokážeme pevného řádkového rejstříku docílit. Proč?

Pokud TeX vyhodnotí, že na sobě dvě řádky sedí až moc těsně (zasaují do sebe o \lineskiplimit), vloží mezi ně pružnou mezeru velikosti \lineskip. To se stane například, když máte relativně malý \baselineskip a do některého řádku vložíte vzorec obsahující odmocinu nebo itegrál (nebo obecně jakýkoliv znak, který je vyšší než vzdálenost účaří). To nechceme. Nastavíme tedy \lineskip=0dd.

Dále nám dělají problémy pružné mezery mezi odstavci (a tedy i mezi odstavci a nadpisy či jinými boxy). Zbavíme se jich podobným způsobem. Nastavíme \parskip=0dd.

Na začátku stránky, těsně za \voffset (Eplain: \topmargin) a těsně před začátkem prvního odstavce existuje další pružná mezera, která se používá k doladění. My ale máme všechno přesně vypočtené, takže žadné doladění nepotřeujeme, nastavíme tedy tuto mezeru na násobek \baselineskip, třeba \topskip=\baselineskip.

No a na konec TeXu řekneme příkazem \raggedbottom, aby všechny stránky vysázel v přesně takové velikosti, jaká je výška veškerého texu na stránce a nevkládal na konec stránky žádný dodatečný prostor.

Když jsou všechni tito „pomocníci“ vypnuti, musíte si již sami ohlídat, aby výška veškerého materiálu na stránce jiného než základního textu, byla násobkem \baselineskip. Například pokud je \baselineskip=12dd, potom správná cesta jak vysázet nadpis velikosti 22dd (nebo podobné) je takováto:

\vskip24dd\noindent{\twentytwo Nadpis\vskip12dd}\par

Jinak… jinak se stane něco strašného.

XeTeX, Stormtype – krok zpět a kupředu zároveň 7

Motivační prolog. Ve formátech TeXu nalézám tak trochu analogii s životem. Kdo by se dnes zajímal o to, jak se dělá například chleba, a pokusil se na základě toho vytvořit takový recept, jehož výsledkem by byl chleba, který by nejlépe vyhovoval jeho osobním potřebám jak chuťově, tak rozměrově? Moc lidí ne. Ve dnešní době zabírá snaha o precisnost zkrátka příliš mnoho času na to, aby se vyplatila, a tak lidé raději vytočí číslo a nechají si dovézt normalizovaný nakrájený chleba v igelitovém obalu. Takový chleba je ale mnohdy zatuchlý, je na něm moc kmínu a chutná jako mazlavý válečný komisárek.

Stejně je to s Plainem a LaTeXem. Proč by se lidé složitě a dlouho učili, jak docílit takové a takové sazby za pomoci Plainu a primitivů TeXu, když mohou jednoduše použít jakési záhadné LaTeXové makro \magic{make stuff work}, aby docílili přibližně toho, co chtěli? Pro běžného uživatele, který nemá čas, náladu ani předpoklady stát se nadšeným sazečem, TeXovým wizardem, skutečně nemá smysl používat Plain. Takových uživatelů je většina – bez LaTeXu by v současné době o TeXu nebylo pomalu ani vidu ani slechu.

JENŽE. Začnete-li s plainem, budete-li se s ním den co den prát, naučíte se kromě výroby prvotřídího pečiva i obsluhovat pec, sklízet a mlátit pšenici… naučíte se pracovat s těmi nejzákladnějšími nástroji sazby v TeXu, proniknete do zákulisí formátů fontů, komunikace jednotlivých součástí celého procesu sazby. Pokud si zkušenostmi osvojíte tyto základy, budete potom schopni vytvořit si svůj vlastní formát, který bude sedět na míru přesně vašim potřebám… a třeba se jednou stane tak slavným jako je LaTeX.

A nyní k věci.

Je tomu teprve krátký čas, co jsem objevil Střešovickou písmolijnu (Storm type foundry). Něco tak přelomového jsem objevil naposledy v době, kdy jsem do vyhledávače poprvé zadal „TeX“. Stormtype produkuje neuvěřitelně kvalitní a neobyčejně nádherné znakové sady obsahující správné české akcenty, a to není jediná věc, která mě na Stormtype tak zaujala. Zaujal mě především vztah majitele písmolijny k historii a elegantní způsob, jakým se z ní přesunuje do současnosti a zase zpět. Prolíná moderní technologii s velmi starými aspekty písma a tím je oživuje… přivádí zpět k existenci. Za to mu patří veškerý můj obdiv. Pro příklad uvedu odkaz na vzorník písma Baskerville 10 Pro. Toto písmo obsahuje rozšířenou kolekci ligatur. Obsahuje nejen dnes (nelze říct běžně) používané ligatury jako fi, fl a ffl, ale také „discretionary ligatures“ sp, st, ct, Th a Ti, a další již zcela vzácné ligatury.

Což je výborné! Přivádět téměř zapomenuté a hodnotné části historie zpět do současnosti, kterou zpevní svojí kvalitou. S tím ale TeX nepočítal. Ani csTeX, ani LaTeX. Všechny varianty totiž využívají původní Knuthův osmibitový formát písma – TeX font metrics ve spojení s formátem Adobe Type1. Tento formát sice dokáže za jistých okolností pojmout „nadupanou“ znakovou sadu (jako třeba onen Baskerville 10), jak ukázal RNDr. Petr Olšák, ale již nedokáže efektivně využít všechny její možnosti (například plynulé přepínání alternativních znaků a znakových sad, vypínání a zapínání historických a vzácných ligatur).

Na efektivní využití profesionálních znakových sad je doslova dělaný formát Microsoft (Adobe) OpenType. Je samozřejmě plně unicodový, a navíc obsahuje „OpenType Features“, což jsou právě ony „přepínače“, o kterých jsem se zmiňoval v minulém odstavci.

K čemu to ale je, když TeX pracuje s TFM a T1, a implementovat podporu pro Opentype Features by znamenalo úpravu zdrojových kódů? Podobnou otázku si před lety položil [jméno:)] a vytvořil k ní svoji vlastní odpověď – XeTeX [zýtech]. TeX s předefinovaným primitivem \font (a množstvím dalších věcí), který umí pracovat s formátem (původně) AAT (Apple Advanced Typography) a OpenType. Pro mě je důležité, že umí pracovat s OpenType features, a že celý formát Plain je v něm beze ztráty zachován.

Přechod na znakové sady ze Střešovic tedy bude nádherně plynulý.