Date: 2023-05-08 20:00:00
From: rpt@desudoli.cz
Subject: Troff
To: dalnopis@desudoli.cz
Tags: software OpenBSD
Desc: Sazba není žádná legrace aneb zápas s typesettery.

Troff

Potřebuju vysázet dokument a jako uživatel, co dává přednost svobodnému softwaru, nebudu přece sázet v Adobe InDesign. Nelze popřít, že jde o program neobyčejně všestranný a schopný, ale není to FOSS a Adobe je banda zlodějů. Jejich produkty jsou předražené, jejich politika připravuje uživatele o jejich práci. Proč? K otevření uživatelem vytvořených dokumentů, zdrojových souborů, je třeba Indesign a jeho licence se musí obnovovat každý měsíc či rok. Adobe sice má IDML (InDesign Markup Language), ale pokud vím, jde otevřít pouze v InDesignu. IDML je v podstatě XML, takže je alespoň editovatelný. Realisticky je toto vhodné pouze na opravu malých chyb.

Zůstaňme u svobodného softwaru. Scribus je poměrně solidní náhrada InDesignu. Pravověrní InDesignéři sice budou žbrblat, že jim chybí to či ono, ale pár dokumentů jsem v tomto programu vysázel a je zcela použitelný. Nesazeč má k dispozici Libreoffice, ale svět wordovských dokumentů, byť v otevřeném formátu, je pro člověka od fochu tabu. To je jako používat Malování namísto Photoshopu.

Jenže našinec se přece nebude zahazovat ani s VYSIWYG programy. Pro nás, unixáky je program dokument sám! Jen je třeba napsat zdrojový soubor v příslušném jazyce a zkompilovat. Máme tedy následující možnosti.

Latex

Tex je osvědčený typesetter, jehož kořeny jdou až do sedmdesátých let. Funguje na principu značkovacích jazyků, podobně jako HTML, ale lepší. Příkazy Texu jsou spíše low level. To znamená, že řeší základní typografické prvky, kam, co a jak umístit, což je pro sazbu nepraktické. Tex umí Knuth-Plassův algoritmus optimalizující „vyplnění“ odstavců, tedy sazbu do bloku. Program řeší odstavec jako celek a nikoliv po řádkách.

Sám Donald Knuth, autor Texu, vytvořil řadu maker zvaných PlainTex. V podstatě jde o nadstavbu Texu. Latex je jiná sada maker, jejímž autorem je Leslie A. Lamport. Makra pracují s low level příkazy a tím zjednodušují práci, neboť se nemusí o spoustu věcí starat. Po pravdě řečeno pro sazbu knih, reportů a dalších dokumentů je Latex asi nejvhodnější. Léty prověřený, všestranný, relativně jednoduchý a přitom velmi sofistikovaný. Jinak řečeno sázka na jistotu.

Jenže instalace a upgrady jsou peklo. Program Texlive, distribuce latexu pro Linux, má kolem 2 GB, já pomalé připojení a málo místa na disku.

Navíc existuje víc unixy typesetter.

Groff

Kdo používá OpenBSD, zná mandoc(1) a mdoc(7) a ví, že jde o implementaci roff(7) pro tvorbu a zobrazení man stránek. Roff(7) má historicky dvě implementace: nroff pro výstup do terminálu a troff pro sazbu dokumentů. Jeho moderní implementací je GNU roff čili groff(1). Groff(1) je oproti Texlive nepatrný prográmek. Ale sazba v něm není úplně triviální.

Groff funguje podobně jako Tex, tedy jako low level sázecí program. Pohodlnější sazbu zajišťují opět makra, konkrétně makro ME, MS nebo MOM. Makra jsou předdefinovaná pravidla (vzhled) pro titul, kapitoly, odstavce, poznámky pod čarou a další prvky dokumentu. Groff má velmi jemné typografické schopnosti, až 1/72000 palce. Na druhou stranu neumí Knuth-Plassův algoritmus. Někteří autističtější typografové ošem tvrdí, že zarovnávání po řádcích je pro ně lepší než po odstavcích, protože stejně musí jednotlivé řádky odtavce „dolaďovat“. Osobně nemám s Knuth-Plassovým alogritmem žádný problém, ale taky nejsem profesionální sazeč.

To všechno zní sice hezky, ale má to háček. Dokonce několik. V prvé řadě Unicode. Groff sice umí Unicode, ale byl implementován později a groff v něm neumí „přemýšlet“. Ani základní fonty nejsou Unicode, takže poté, co konečně zkompilujete český text s přepínačem -Kutf8 a myslíte si, že máte vyhráno, čeká vás zklamání. Výsledný text zobrazuje některé akcentované znaky a jiné zase ne. To mě přivádí k dalšímu problému a tím jsou fonty. Groff vyžaduje velmi specifický fontový formát, TTF či OTF fonty nezná. Naštěstí Peter Schaffter, autor makra MOM, naprogramoval skript, který tuto konverzi obstará. Funguje i na OpenBSD, ale pozor, je to bash skript, zatímco defaultní shell v OpenBSD je ksh(1)! Pak je třeba ve zdrojovém dokumentu změnit font, což obstará víceméně jedna řádka. Výsledkem je český text. Konečně!

Pokud jde o zmíněná makra, testoval jsem MS a MOM. MS je standardní groffovské makro na sazbu dokumentů typu kniha, report apod. Cílí na technické papíry, nikoliv beletrii, ale základní vzhled, jenž produkuje, neuráží. Pro sazbu beletrie je ovšem vhodnější makro MOM, jehož autorem je zmíněný Peter Schaffter. Velmi doporučuju jeho stránky, Schaffter je zanícený groffista a makro MOM se v mnoha ohledech vyrovná Latexu.

Nicméně jsem „nepřepral“ některé potíže a zbaběle jsem prchnul k další implementaci troffu, o které bude řeč za chvíli. Makro MOM je skutečně lepší, ale nepodařilo se mi rozchodit zarovnání do bloku a některé další fičury. Poměrně rychle jsem ztratil trpělivost, ale jinak to byl úspěch, neboť při posledním pokusu jsem uvízl na problému fontů, o kterém jsem psal výše.

Neatroff

Mluvil jsem o zbabělém útěku, ale žádný unixák se nebude stydět za to, že používá neatroff. Autorem této nejunixovější verze troffu je Ali Golami Rudi z Iránu, pokud se nepletu. Ali má na kontě hromadu dalších šikovných a minimalistických prográmků jako neatvi, neatcc nebo fbpdf. Je jedním z těch lidí, co pravděpodobně nepoužívají Xorg. A odpovídá na emaily.

Neatroff je napsaný v C, umí Unicode, směr textu zprava doleva, má jednodušší management fontů, využívá make(1), využívá Knuth-Plassův algoritmus a patrně několik dalších věcí. Není třeba se obtěžovat instalací, ačkoliv i s ní se počítá. Osobně preferuju mít složku neatroff_make mezi skripty (adresář se skripty je součástí PATH). Stačí tedy naklonovat Git na příslušném místě, zkompilovat nejprve neatroff a pak demo dokumenty (PDF). Adresář s demo dokumenty obsahuje také vzorový Makefile, který je třeba vždy nakopírovat do složky se sázeným dokumentem a příslušně upravit. Ke kompilaci sázeného dokumentu pak postačí pouhé make.

Neatroff se přitom nijak zásadně neodklání od groffu. Programátoři obou systémů jsou v kontaktu, jak jsem zaznamenal kdesi v mailing listech. Proto i v neatroffu lze používat makro MS. Mám dojem, že je mírně upravené, ale zásadní rozdíl jsem nezaznamenal, což ale může být dáno tím, že jsem dosud využil jen zlomek funkcí makra.

Všechny potíže, které jsem měl s groffem se najednou vypařily a navíc mi neatroff připadá svižnější. Neatroff prý umí „pouze“ 1/720 palce, pokud jde o management detailů v dokumentu. Asi s tím dokážu žít.

Zkušenosti

Jsem začínajícím uživatelem roffovské rodiny typesetterů a zatím je to dobrá zkušenost.

Připadá mi, že potenciál roffu je podobný jako u Texu, ale nevyužitý. Latex je velmi pokročilé makro a je znát, že se mu dostává mnohem lepší péče. Groff, byť nejznámější implementace roffu, má hodně omezený počet uživatelů a jeho vývoji se věnuje úzká skupina programátorů. Neatroff je a asi i zůstane one-man-show, takže budoucnost má spíš groff. Na druhou stranu, groff by potřeboval modernizovat, což je u tak starého programu vždycky problém, vzhledem ke zpětné kompatibilitě. Mezi výhody groffu počítám i makro MOM, které nelze v neatroff použít. Alespoň se domnívám, že ne, ale mohu se mýlit. Groff je GNU standard, to je další nezanedbatelná výhoda. Kdyby se podařilo groff modernizovat ve stejném duchu, jako je koncipován neatroff, neměl bych s ním vůbec žádný problém.

Syntax je poněkud nezvyklý. Příkazy se píšou vždy na začátek řádku, kde stojí buď osamoceně nebo před textem, jak se sluší na Unix, a začínají tečkou. To platí paradoxně i pro typografii uvnitř řádku, takže změnu řezu na tučný či kurzívu u jednotlivých slov je třeba provést na nové řádce. I tak je zdrojový dokument stále dobře čitelný.

Zatím jsem nezalamoval obrázky, ani nesázel tabulky. Nicméně nepříjemné překvapení neočekávám.

Texinfo

Na závěr chci zmínit další program z dílny GNU, o kterém jsem věděl, ale nikdy jsem ho nepoužil. Až donedávna. Je to námět na další povídání, ale svou pozitivní zkušenost zmíním už nyní.

Texinfo je GNU program na tvorbu manuálů. Je to obdoba man(1), ale sofistikovanější. Jde o dnes již starý značkovací jazyk, který má leccos společného s roffem či spíš latexem. Idea je mít jeden zdrojový soubor, source code, chcete-li, a několik výstupních formátů. Těmi jsou v tuto chvíli terminál, HTML a PDF. Pro výstup do PDF používá jakousi latexovou knihovnu, HTML generuje patrně sám. Výstup do terminálu se provádí s pomocí příkazu info a v tomto výstupu fungují odkazy, podobně jako v HTML. To umožňuje mít k dispozici komplexní, hierarchicky uspořádaný manuál, kde je možné vyhledávat. Texinfo je součástí Emacsu a mnoho dalších GNU programů má mimo standardní man stránku také texinfo manuál.

Protože věc, na které pracuju, by mohla mít i webovou verzi, na okamžik jsem texinfo jako zdrojový kód zvažoval. Nakonec jsem od tohoto nápadu upustil, ale jediným důvodem bylo mít nadstandardní kontrolu nad sázeným textem, což umožňuje jedině typesetter. Web je pro mne v tomto případě podružný. Naopak s úspěchem používám texinfo na dokumentaci v práci, včetně webového výstupu. Na myšlenku použít texinfo mě přivedl tento chlapík, který z něj generuje svůj web.

Velice silně uvažuju o tom, že začnu psát své poznámky v tomto formátu. Znamenalo by to zahodit markdown, ale to by mě asi netížilo, neboť jsem na něj už mnohokrát nadával. Odrazuje mě pouze množství práce s tím spojené a jednoduchost stávajícího systému textových souborů a standardních unixovských nástrojů jako grep(1) či find(1).

EOF