Odstavec se zdobenou iniciálou v TeXu (plain) 3
Včera večer jsem bádal nad tím, jak vytvořit makro TeXu, které by sázelo odstavec se zdobenou iniciálou přes několik řádků. Co se týče plainu, na internetu nemá smysl hledat nápovědy, postupy či dokonce příklady – nejsou tam. Každý, kdo dělá v plainu, je odkázán na The TeXbook, který je jediným úplným souvislým učebním materiálem k tomuto formátu (na rozdíl od LATeXu, ke kterému na internetu existuje mnoho uživatelského materiálu, jelikož LATeX není díky svým makrům ani zpoloviny tak náročný a tvárný jako plain). A tedy všechno, co v tomto článku uvidíte, je od začátku až do konce moje vlastní práce.
V dokumentu budeme používat přechodovou antikvu Century Schoolbook. Pro náš účel by se hodila spíše antikva dynamická (Palatino), ale Century se svým sklonem stínu více hodí ke znakové sadě čtvercových iniciál, kterou jsem vybral. Na následujícím obrázku vidíte, čeho chceme dosáhnout.
Nejdříve se musíme rozhodnout, jak bude náš dokument vypadat. Rozhodl jsem se pro stejné odsazení zleva a shora, trochu větší potom zprava. Kuželka základního písma bude 10 didotových bodů (dále jen dd) a \baselineskip (tedy vertikální vzdálenost baselines – myšlených linek, na které dosedají znaky) bude 1 cicero. Není to vzdálenost, na kterou jste běžně zvyklí z časopisů, technických dokumentů a mnohých knih. S takovou vzdáleností se pracuje v kvalitních vázaných knihách, protože se takový text příjemněji čte… je měkčí. Odstavce od sebe budou vzdáleny 20dd (\parskip) a odsazení první řádky odstavce bude dlouhé 10dd (\parindent).
\input eplain \input csfonts \chyph \nopagenumbers \tolerance=10000 \hfuzz 0.1dd \vfuzz 0.1dd \overfullrule 5dd \delimitershortfall 5dd \nulldelimiterspace 1.2dd \scriptspace 0.5dd % UŽITÉ ZNAKOVÉ SADY \font\initial = yinitas at 44dd \font\nreight = cs-qcsr at 8dd \font\nrten = cs-qcsr at 10dd \font\nrtwelve = cs-qcsr at 1cc \font\nrfourteen = cs-qcsr at 14dd \font\nrsixteen = cs-qcsr at 16dd \font\nreighteen = cs-qcsr at 18dd \font\nrtwenty = cs-qcsr at 20dd \font\niten = cs-qcsri at 10dd \font\nbtwelve = cs-qcsb at 12dd \font\nbfourteen = cs-qcsb at 14dd % ZAROVNÁNÍ DOKUMENTU \topmargin=60dd \bottommargin=20dd \leftmargin=60dd \rightmargin=95dd \topskip25dd \leftskip0dd \rightskip0dd \parindent=20dd \parskip=10dd \baselineskip=1cc % NADPIS \def\h#1{\noindent{\nrtwenty #1}\vskip10dd}
Vědomosti, které potřebujete k dobrému pochopení jsou na stranách 1-85 TeXbooku (zejména kapitol o boxech a o lepidlech). Já zde nastíním jenom základní princip.
Celá sazba v TeXu se skládá z tzv. boxů, což jsou kontajnery pro různé tisknutelné i netisknutelné objekty (znaky, obrázky, atp.). Boxů existují dva druhy – horizontální a vertikální. Horizontální boxy (\hbox) se skládají vedle sebe a vytvářejí tak řádky. Vertikální boxy (\vbox) se skládají pod sebe a vytvářejí tak odstavce. Do boxů můžete vkládat boxy, které obsahují boxy, které obsahují boxy atd. Vertikální box jedné řádky bude tedy obsahovat n hboxů se znaky. Podobně se obalí boxy m vboxů s řádkami a vznikne odstavec.
Boxy od sebe mohou být různě vzálené, příčemž tato vzdálenost musí být dynamická (musí existovat „dilatační spáry“) pro případ, že by TeX na některém místě potřeboval smrštit nebo rozthánout sazbu (například mezery mezi slovy na řádce, které udávají tzv. badness, čili koeficient estetické nedokonalosti, ale o tom až jindy). Takovému dynamickému spojení se říká lepidlo. Lepidlo může být taktéž horizontální (\hglue) nebo vertikální (\vglue). Lepidlo má tři parametry – základní vzdálenost, vzdálenost, na kterou se může maximálně smrštit a vzdálenost, na kterou se může maximálně roztáhnout.
Další makra, která budeme potřebovat jsou \raise (resp. \lower a \kern), které posunuje jeden box ve druhém nahoru (resp. dolu a horizontálně) a \parshape, které udává, jak bude následující odstavec vypadat. Makru \parshape je nutno zadat parametry následovně:
\parshape n i0 j0 i1 j1 ... in jn
, kde n je počet řádek, ik je odsazení k-té řádky od levého okraje stránky a jk je horizontální délka k-té řádky.
Makro \setboxn ukládá daný box do paměťového registru. Následně pak můžeme o boxu zjistit jeho výšku (\htn), šířku (\wdn), a nebo si jej můžeme nechat zobrazit (\showboxn).
Vyzbrojeni potřebným arsenálem maker se již můžeme pokusit sestavit makro, které bude sázet odstavce s iniciálami.
\def\hrefbox#1{ \setbox3=\hbox{\kern-\wd1\vbox{\noindent\hfil }}} \def\initboxpar#1{ \setbox0=\vbox{\noindent\parshape 5 0dd \wd3 0dd \wd3 0dd \wd3 0dd \wd3 -\wd1 420dd #1 }} \def\initboxinitial#1{ \setbox1=\hbox{\initial #1\hskip4dd} } \def\castpar#1{ \hbox{\lower\ht1\vbox{\hbox{\raise\ht0\vbox{ \hbox{\initial #1}}}} \hglue1dd \box0 } } \def\inl#1#2{ \initboxinitial{#1} \hrefbox{#2} \initboxpar{#2} \castpar{#1} \vskip-40dd }
Naše makro se jmenuje \inl (jako initial). Bere si dva parametry (#1 a #2), následně volá makro \initboxinitial s parametrem #1, potom makro \hrefbox s parametrem #2, \initboxpar s parametrem #2, a nakonec makro \castpar s parametrem #1. Jak už asi tušíte, parametr #1 bude počáteční písmeno, které bude přeměněno na iniciálu, a parametr #2 bude zbytek odstavce.
Co dělá makro \initboxinitial? Vytvoří hbox s iniciálou uloží ji do paměti.
Co dělá makro \hrefbox? Vytváří referenční box, který měří na délku přesně jako šířka sazby ochuzená (pomocí \kern) o šířku aktuální iniciály (všechny iniciály nejsou stejně široké).
Co dělá makro \initboxpar? Pomocí \parshape vytvoří odstavcovou strukturu, kde první čtyři řádky nejsou odsazeny vůbec a jsou široké jako referenční box, a zbývající jsou „přesazeny“ přes levý okraj o šířku boxu s iniciálou. Vzniká tak malé okénko v levém horním rohu. Strukturu potom naplní textem předaným parametru a uloží ji do paměti ve vboxu.
Co dělá makro \castpar? V několika krocích vytvoří následující strukturu boxů a uloží jo do paměti.
Postupujeme-li od nejhlubší úrovně, nejdříve vytvoří hbox s iniciálou, který zabalí do vboxu a ten pak posune nahoru do o výšku boxu s odstavcem textu, který jsme připravili v prvním makru, a dostane se tak na úroveň, která je v obrázku popsána jako „1.“. Nyní bychom chtěli náš box posunout dolů o velikost boxu s iniciálou, který jsme si připravili ve druhém makru, ale to není možné udělat ihned, neboť jeden box může být posunut v jednom směru pouze jednou. Pomůžeme si malým trikem. Náš vbox zabalíme do hboxu (protože nelze vbox zabalit do vboxu) a ten ještě jednou zabalíme do vboxu, který potom jednoduše snížíme o úroveň boxu s iniciálou. Potom vyvoláme z paměti náš vbox s odstavcem a malým lepidlem jej spojíme s naším novým boxem, a protože řádky našeho boxu s odstavcem od páté přesahují vlevo, budou zasahovat do boxu s iniciálou a vytvoří tak dojem konsistentního obtékání. Vše zabalíme do hboxu, abychom vytvořili celek. Voila.
Tímto získáme makro, které vytvoří z obyčejného odstavce odstavec s iniciálou. Nezapomeňte, že pokud změníte font jak písma, tak iniciály, musíte upravit některá pevně daná čísla v makrech (například číslo specifikující od kolikátého řádku se bude „přesazovat“ doleva).