Na této stránce je popsán způsob sazby sbírky poezie v hindštině a češtině s použitím XeLaTeXu. Makra byla vytvořena pro knihu Cesta do červánků (Aruna Rai a Zdeněk Wagner).
Tento balíček vznikal postupně kopírováním maker používaných při sazbě různých
knih. Mezi \iffalse
a \fi
jsou proto uvedeny příklady maker, které
lze použít ve specifických situacích, ale bez vysvětlivek. Balíček podléhá licencí LPPL a pravděpodobně bude v budoucnu zveřejněn
na CTAN.
Balíček je vhodný jak pro sazbu samotné poezie, tak pro prózu, která je
proložena básněmi. Sazeč obvykle dostává zdrojové texty v jiném formátu, rozhodně ne v TeXu.
Makra jsou tedy připravena tak, aby maximálně šetřila práci. Ztěží by někdo chtěl doplňovat
\\
na konec každého verše v knize, která má 100+ stran poezie. Postupem času
tedy vznikl konfigurovatelný balíček.
\VerseLeftIndent
, \VerseRightIndent
:
Pokud jsou básně vkládány do prózy, pak mají obvykle jiné odsazení vlevo a vpravo než prozaický text. Odsazení je nastavováno
pomocí těchto rozměrů, jejichž výchozí
hodnota je nulová.
\ExtraIndent
:
V některých básních je požadováno, aby vybrané sloky měly vlevo větší odsazení.
Hodnota se nastavuje v tomto rozměru. Výchozí hodnota je
5 mm.
\AboveVerse\Skip
, \BelowVerseSkip
:
Tyto délkové registry se používají v případě, kdy je poezie vkládána do prózy.
Definuje roztažitelnou vertikální mezeru nad a pod prózou. Výchozí hodnota je nulová.
\VerseFont
definuje font používaný v poezii, zejména pokud se liší od fontu pro prózu.
Výchozí definice je prázdná.
\slokafil
je roztažitelná část mezery mezi slokami, jejíž význam bude vysvětlen později.
Téměř jistě budete muset hodnotu změnit, jak je ukázáno v kapitole
arunakash.sty.
Verse
jsou základním prostředím, v němž každý řádek je verš, prázdné řádky oddělují
sloky. Pokud je verš delší než šířka sazby, musí být druhá část zarovnána vpravo. V prostředí je to řešeno automaticky, ale
někdy se nenajde nejvhodnější místo pro zlom. Makro
\\
je definováno tak, aby místo zlomu dlouhého verše mohlo být nastaveno ručně.
posun
je prostředí, v němž je odsazení slok zvětšeno o
\ExtraIndent
.
escape
se používá pro přerušení básně textem v próze. Je to užitečné pro scénické
poznámky v divadelní hře psané ve formě básně. Může obsahovat několik odstavců.
\Esc
má stejný účel jako předchozí prostředí, ale slouží pro vložení krátkého textu
\Page
:
V některých situacích je vhodné vnutit jiný stránkový zlom. Uvnitř prostředí
Verse
je nutno použít toto makro.
\bv
, \ev
, \cbv
jsou užitečné zkratky s těmito definicemi
\def\bv{\begin{Verse}} \def\ev{\end{Verse}} \def\cbv{\clearpage\bv} |
Řádkový zlom je implementován dvěma mechanismy, makrem
\ObeyEndlines
a definicí tvaru odstavce. Makro \ObeyEndlines
zajišťuje, že každý verš je jednořádkovým odstavcem a konec verše je ve zdrojovém souboru
označován koncem řádku. Definice je inspirována makrem \obeylines
, viz
Donald E. Knuth: The TeXbook.
Tvar odstavce je definován uvnitř prostředí Verse
. Rozměry
\VerseLeftIndent
a \VerseRightIndent
jsou pevné takže při
zkoumání účinku jednotlivých parametrů je můžeme považovat za nulové. Každý řádek má na
levé straně mezeru velikosti \leftskip
, na pravé straně
\rightskip
. Začátek odstavce má navíc na levé straně \parindent
,
konec odstavce má na pravé straně navíc \parfillskip
. Mezeru
\parindent
i \parfillskip
jsme vynulovali. Při přechodu do horizontálního režimu, tedy při
zahájení odstavce, se na jeho začátek vkládá obsah registru \everypar
. V něm
je vložena mezera stejného typu roztažitelnosti, jakou definuje \leftskip
, ale
roztažitelnost má opačné znaménko. Roztažitelnosti se tedy navzájem vyruší a na levé
straně zbývá pevná mezera. Na pravé straně máme nekonečně roztažitelnou mezeru
\rightskip
, proto bude verš zarovnán vlevo. Pokud je však verš delší, dojde k řádkovému zlomu. Situace na prvním řádku bude stejná,
avšak na druhém nebude obsah registru
\everypar
, ale pouze nekonečně roztažitelná mezera \leftskip
s vyšším řádem nekonečnosti, než má \rightskip
, proto bude tento řádek zarovnán
vpravo.
Při sazbě poezie by stránkový zlom měl být nejlépe mezi slokami, uvnitř sloky
jen v případě, že jsou sloky dlouhé a na stránce by zůstalo příliš velké volné místo.
Pokud sázíme jen poezii, mohli bychom použít \raggedbottom
a zlom vyřešit
vhodnými penalizacemi. Pokud ale sázíme kombinaci poezie a prózy, potřebujeme
\flushbottom
a stránkový zlom je nutno řešit jiným způsobem. Pamatujte si, že
každý verš je odstavec, takže penalizace \clubpenalty
a \widowpenalty
zde nemají smysl. Naproti tomu nekonečná penalizace
\interlinepenalty
zabraňuje stránkovému zlomu mezi řádky dlouhého, zlomeného
verše.
Stránkový zlom je řešen v makru \auto@par
, které obsahuje dva
podmíněné příkazy. Podmínka \ifhmode
testuje, v jakém okamžiku je makro
voláno. V horizontálním režimu, tedy na konci verše, ukončuje odstavec a vkládá penaltu
\slokapenalty
, která znevýhodňuje stránkový zlom uvnitř sloky. Ve vertikálním
režimu se vkládá materiáln umožňující stránkový zlom. Mezi slokami je však mezera o výšce
jednoho řádku. Kdybychom ve zdrojovém textu měli mezi slokami více prázdných řádků, měli
bychom stejný počet vertikálních mezer i v sazbě, což je nežádoucí, proto si podmínkou
\ifDoSkip@
kontrolujeme, že je vertikální materiál vložen pouze jednou. Sloka
vždy končí penaltou o velikosti \slokapenalty
, která musí být kladná, jinak
by to nedávalo smysl. Pokud se potkají dvě penalty, vyhrává ta s nižší hodnotou. Mezi
slokami tedy budeme mít:
\penalty\z@
\vskip\the\baselineskip plus \slokafil
\penalty\z@
\vskip\z@ plus -\slokafil
Roztažitelnosti ve výplních 2 a 4 mají opačná znaménka. Pokud v tomto místě
nedojde ke stránkovému zlomu a na stránce pokračuje další sloka, vzájemně se vyruší a mezera bude mít výšku jednoho řádku.
Stránkový zlom je možný pouze v penaltách 1 a 3. K prvnímu případu dojde, pokud sloka končí na spodním okraji stránky. Ke
druhému případu
dojde, pokud je na stránce místo nejméně na jeden řádek, ale nelze pokračovat v sazbě
další sloky. V obou případech budou odstraněny všechny následující elementy a další
stránka bude začínat prvním veršem následující sloky. Výchozí nastavení makra
\slokafil
zabraňuje zlomu uvnitř sloky, pokud není sloka delší než stránka.
Vhodnější nastavení bude ukázáno v popisu balíčku
arunakash.sty.
Licence těchto souborů je Public Domain, to znamená, že s nimi můžete nakládat, jak chcete. Téměř jistě je pro vlastní použití budete muset modifikovat.
Makra pro knižní obálku musí být odlišná od maker pro knižní blok, především se liší rozměry. Některá makra jsou však společná, především je to nastavení písem. Všimněte si, že pro latinku je použit komerční font, pro hindštinu se používá mapování arabských číslic na dévanágarské.
Rozměry stránky budou definovány pomocí balíčku zwpagelayout
,
který potřebuje znát velikosti písem. Proto jsou velikosti definovány v samostatném
souboru.
Makra v tomto balíčku neslouží pro kritická vydání. Jejich jediným účelem je sazba, kde jedna jazyková je na levé stránce, druhá na pravé. Teoreticky se ve výjimečných případech může lišit i počet stran některých částí knihy. V následujícím textu budou vysvětlena hlavní makra.
\ZWnormalsize
definuje velikost řádkového prokladu. Hodnotu budeme potřebovat na několika
místech a při tvorbě sazby jsem ji několikrát měnil.
Většina básní se vejde na jednu stránku, jen výjimečně zbývá menší část na
další stránku. Proto je sazba řešena tak, aby první verš byl vždy na stejné pozici na
stránce, nadpisy jsou výše. Je toho dosaženo nastavením odpovídající hodnoty
\splittopskip
.
Jméno autora bude uvedeno latinkou v české verzi a dévanágarským písmem v hindské verzi. Interní makro \zw@aut
uloží obě varianty do maker
\Author
a \Rachnakar
(hindský překlad slova autor). Pro
skutečné použití máme definována pohodlná makra
\aruna
, \zw
.
\pagestyle{kitab}
je zajímavý tím, že paginace na sudých (hindských) stránkách je umístěna v makru \texthindi
. Jak bylo zmíněno v sekci common.sty, číslice tak
budou převedeny automaticky do dévanágarí.
\firstlang
, \secondlang
, \endlangs
slouží jako oddělovače jazykovýcgh verzí. V každé verzi se odpovídajícím
způsobem přiřadí jméno autora do pomocného makra \zw@autname
. Obsah se načte
do boxu a současně se v makru \zw@tn
nadefinuje, to kterého obsahu se budou
informace zapisovat. Na sudých stránkách je zapnuta hindština.
\zw@testlang
po kontrole aktuálního stavu provede vlastní sazbu. Jak jsme si řekli, makra
nejsou určena pro kritické vydání a při sazbě prózy může být jedna verze o stránku kratší
než druhá. Nejprve tedy zkontrolujeme, ve které variantě ještě máme obsah. Podmínka
\ifvoid
je pravdivá, pokud je příslušný box prázdný. Do pomocného čítače,
který byl nejprve vynulován, přičteme jedničku, pokud je neprázdný box s hindštinou, a dvojku, pokud je neprázdný box s češtinou.
Pokud je obsah čítače kladný, pokračujeme v algoritmu sazby, v opačném případě jsme hotovi.
\zw@dolang
vynutí přechod na novou stránku. Pokud je hodnota pomocného čítače lichá,
vytiskneme stránky hindského textu, v opačném případě vynecháme prázdnou stránku. Pokud je
hodnota čítače větší než 1, vytiskneme českou stránku, jinak opět stránku vynecháme.
Nakonec znovu použijeme
\zw@testlang
.
\zw@split
pracuje s obsahem příslušného boxu. Pokud je vyšší než tisková oblast, odlomí
se příslušná část a zbytek zůstane v boxu, v opačném případě vytiskneme celý box. Při
odlamování byly vypuštěny odstranitelné elementy a výsledek je tedy skoro vždy menší než
výška stránky, proto ji musíme doplnit mezerou
\vfill
.
\slokafil
určuje, jak velká je minimální část neúplné sloky. Proč zrovna 60pt? Protože
je to chyba. Původní řádkový proklad byl 15pt a minimální část měla obsahovat čtyři řádky.
Při změně řádkového prokladu jsem tuto hodnotu zapomněl změnit, ale výsledke vypadal dobře,
proto jsem si toho nevšiml. Hodnotu nelze definovat jako 4\ZWnormalsize pt
. To
by expandovalo na 418pt, což není to, co chceme. LaTeX nabízí pomocný čítač
\@tempdima
, takže by mohl být použit např. následující kód:
\@tempcnta=\ZWnormalsize \multiply\@tempcnta by 4 \edef\slokafil{\the\@tempcnta pt} |
\bv
je předefinovaná zkratka, která umožňuje vložení názvu a zápis do obsahu.
\shirshak
je použit pro sazbu názvu předmluvy a jména jejího autora.
\tableofcontents
vysází již vysvětleným postupem obě jazykové varianty obsahu. Makro
\@dottedtocline
před sazbou stránkové číslice přepne na
\normalfont
, což v hindské variantě nechceme. Proto s využitím
\ifdvng
předefinujeme tento přepínač na
\relax
.
Tato ukázka demonstruje, jak byla zapsána první a poslední báseň a obsah. Kvůli stručnosti zde zdrojový kód úvodních stránek, předmluvy a tiráže není.
\zw \firstlang \bv{ताजमहल} हे ताजमहल! तुम्हारे रत्नों में क्या मोहक फ़साना छिपा हुआ है? बिना कुछ कहे अकेले खड़े हो तुम यमुना के किनारे पर। तुम्हारी दीवारों में शांति से सो रहा है किसी का अमर प्यार। दिलों में मुमताज और शाहजहाँ को लेकर लोग यहाँ रोज़ आया करते हैं। दिलों में मोहब्बत महसूस करके लोग प्यार का स्मारक देखते हैं हे ताजमहल! जो इश्क़ की यादें तुम्हारे अंदर ढूँढ रहे हैं वे प्यार से मिलेंगे ख़ूबसूरत मक़बरे में। हे ताजमहल! मेरा भी सवाल है। आज मेरी मुमताज़ कहाँ खो गई है? शायद चली गई है वह अरुणाकाश में। \ev \secondlang \bv{Tádžmahal} Ach, Tádžmahal! V tvých zdobných skvostech jaký se skrývá půvabný příběh? Zamlkle stojíš, samotný na břehu řeky Jamuny. A ve tvých zdech v poklidu spí nesmrtné čísi lásky dech. S Mumtáz a Šáhdžahánem v srdcích lidé sem denně vcházejí. Se srdcem milostně planoucím památník lásky vídají. Ach, Tádžmahal! Kdo lásek památku vyhledá v tobě, ten s láskou setká se v nádherném hrobě. Ach, Tádžmahal! Mám taky otázku. Kde moje Mumtáz dneska se ztratila? Snad včera odešla do červánků. \ev \endlangs \aruna \firstlang \bv{मेरी रोशनी} कुछ प्रकाशवर्षों तक पहुँचती रहेगी मेरी रोशनी तुम तक तब भी जब नहीं रहेगा मेरा अस्तित्व उस रोशनी को ढूँढते जब पहुँचोगे मंजिल तक मैं बदल चुकी होऊँगी एक ब्लैकहोल में फिर तुम ना पहुँच सकोगे मुझ तक न वापिस जा सकोगे कहीं भी इस असीम ब्रह्मांड में… \ev \secondlang \bv{Mé světlo} Za několik světelných let dotkne se mé světlo tebe, až tehdy, kdy existovat nebudu. Když budeš hledat to světlo, až svého cíle dojdeš, již proměněna budu v černou díru. Pak ty nebudeš se moci mě dotknout ani zpět jít moci nebudeš, nikam, v tomto neomezeném vesmíru… \ev \endlangs \clearpage \tableofcontents |
Při prohlížení ukázky v PDF si zapněte režim facing pages, center first.
bilinpoe.zip, 8 KiB.