Ice Bear SoftSazba dvojjazyčné sbírky poezie

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).

1. zwpoetry.sty
  1.1. Vysvětlení algoritmu řádkového zlomu
  1.2. Vysvětlení algoritmu stránkového zlomu
2. Balíčky pro dvojjazyčnou sazbu
  2.1. common.sty
  2.2. zwsizes.sty
  2.3. arunakash.sty
  2.4. Ukázka
3. Download

1. zwpoetry.sty

Tento balíček vznikal postupně kopírováním maker používaných při sazbě různých knih. Mezi \iffalse\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}

1.1. Vysvětlení algoritmu řádkového zlomu

Řá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\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\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.

 Začátek stránky 

1.2. Vysvětlení algoritmu stránkového zlomu

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\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:

  1. \penalty\z@
  2. \vskip\the\baselineskip plus \slokafil
  3. \penalty\z@
  4. \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.

 Začátek stránky 

2. Balíčky pro dvojjazyčnou sazbu

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.

2.1. common.sty

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é.

 Začátek stránky 

2.2. zwsizes.sty

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.

 Začátek stránky 

2.3. arunakash.sty

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\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.

 Začátek stránky 

2.4. Ukázka

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.

 Začátek stránky 

3. Download

bilinpoe.zip, 8 KiB.

 Začátek stránky