Portál AbcLinuxu, 6. května 2025 16:19
Předvedeme jednoduchý a typický dokument s odkazy, poznámkami, generovaným obsahem, obrázkem, tabulkou a vzorcem vytvořený třemi způsoby: pomocí CSplainu+OPmac, pomocí XeLaTeXu a pomocí ConTeXtu. Kromě toho si mohou čtenáři tohoto dílu trochu zasoutěžit, ovšem ceny nejsou vypsány žádné.
Jak bylo řečeno v prvním díle seriálu, autor připraví smluveným způsobem označkovaný zdrojový dokument ke zpracování TeXem. Příklady, jak může zdrojový dokument vypadat a jak následně vypadá výstup po zpracování, jsou shrnuty zde:
formát | zdrojový text | výstup |
CSplain+OPmac | priklad-opmac.tex | priklad-opmac.pdf |
XeLaTeX | priklad-latex.tex | priklad-latex.pdf |
ConTeXt | priklad-context.tex | priklad-context.pdf |
Vše včetně obrázku | priklady.zip |
O značkování v jednotlivých příkladech si nyní řekneme více. Ve všech
ukázkách je deklarační část. Obsah této části ovlivní globálně celý dokument.
V této části jsem za procenta umístil komentáře vysvětlující, k čemu
konkrétní řádek deklarační části slouží. Poznámka pro čtenáře, kteří vidí TeX
poprvé: znak procento uvozuje komentář, který TeX při zpracování ignoruje (od
procenta do konce řádku). Chce-li autor procento do textu napsat, musí použít
\%
nebo něco podobného. Implicitně jsou nastaveny jako „TeXovsky
specifické“ ještě tyto znaky: \
, {
, }
,
$
, &
, #
, ^
, _
a ~
. To se uživatel dozví v úvodu každé příručky o TeXu.
Ve všech ukázkách se vyskytuje:
Pokud chce typograf pouze vyzkoušet, jak vypadá font, návrh stránky atd.
a nemá po ruce konkrétní text (resp. nechce, aby byl čtenář textem
rozptylován), použije text „Lorem ipsum ... est laborum“. Je to vykousaný
text z Cicera. V ukázkách je vytvořena
zkratka \lorem
expandující na tento text například takto:
\def\lorem{Lorem ipsum ... est laborum} A nyní můžeme text použít: \lorem. A třeba ještě dvakrát: \lorem. \lorem.
Podíváte-li se do jednotlivých ukázek, zjistíte, že primitivní příkaz
\def
je použit jen v ukázce s OPmac. Na druhé straně například
uživatel LaTeXu použije \newcommand
(toto makro pochopitelně interně
provede \def
). Proč LaTeXista nepoužije \def
rovnou? Je
to jednak proto, že v LaTeXových příručkách je zmíněno makro LaTeXu
\newcomand
a zatajen primitivní příkaz \def
, dále proto,
že \newcommand
pohlídá, zda uživatel něco omylem nepředefinuje,
a konečně proto, že se sluší v LaTeXovém dokumentu použít lexikální prvky
z LaTeXu, třebaže by primitivní příkazy fungovaly také. Je to podobné, jako
když programátor, který užívá vyšší programovací jazyk, přejde z ničeho nic do
assembleru: může to udělat, ale nesluší se to.
CSplain i OPmac jsou má práce, jsou tedy mému srdci nejbližší, takže popis značkování začnu u tohoto příkladu.
CSplain je základní rozšíření Knuthova plainTeXu. Samotné použití tohoto formátu
znamená, že všechny vlastnosti dokumentu (nadpisy, odkazy, generování obsahu) si
musí uživatel naprogramovat sám. Každý uživatel si tak vytvoří svou sadu maker, do
kterých vidí, kterým rozumí a která odpovídají jeho stupni pochopení, jak
funguje TeX. Pro začátečníka, který se nechce spoléhat na rozsáhlejší hotová řešení
v balíčcích maker typu LaTeX nebo ConTeXt, je zde ale velká vstupní překážka.
Naprogramovat třeba jen automatické generování obsahu není úplně jednoduché. Proto
jsem loni zveřejnil svá makra, která jsem nazval OPmac, podrobně je dokumentoval
(pro autory i pro experty) a nabídl je uživatelům, kteří chtějí zůstat
u jednoduchosti plainTeXu, ale rádi využijí Olšákova hotová řešení. Po zavedení
makra pomocí \input opmac
je tedy k dispozici zhruba to, co nabízí
LaTeX+hyperref+graphicx+amsmath+color, ale vše je výrazně jednodušší.
Příkazem \input cs-schola
v záhlaví dokumentu se zavádí fontová
rodina Schola projektu TeXGyre.
V tomto projektu se autoři rozhodli přepsat obvyklé fonty Times, Helvetica,
Courier, Bookman, Palatino, Avantgarde, New Century do moderního formátu (OTF),
přidat jim další vlastnosti, opravit drobné chyby a nazvat je mírně jinak:
Termes, Heros, Cursor, Bonum, Pagella, Adventor, Schola. CSplain nabízí sadu
„fontových souborů“, kterými se zvolená rodina fontů zavede. V tomto příkladě
tedy \input cs-schola
.
Dokument psaný v OPmac se člení například na sekce označené příkazem
\sec
a podsekce označené příkazem \secc
. Za tímto příkazem
následuje název sekce/podsekce a ten je ukončen prázdným řádkem. Analogicky
pomocí \tit
vytvoříme titul.
Obsah vytvoříme příkazem \maketoc
. Pro výčty je použita dvojice
\begitems
a \enditems
s tím, že mezi touto dvojicí je
hvězdička aktivní a zahájí další položku výčtu. Pro výpisy kódů slouží dvojice
\begtt
a \endtt
, kterou jsem popsal už před mnoha lety
v knize TeXbook naruby.
Odkazy (dopředné i zpětné) se řeší pomocí \label
, \ref
a \pgref
. Lejblík, který se používá pro propojení odkazů ve zdrojovém
dokumentu, ale ve výstupu není vidět, je třeba zapouzdřit do hranatých závorek.
Obrázky se zařadí příkazem \inspic
a tabulky lze vytvořit příkazem
\table
. Přímé použití primitivních příkazů TeXu nebo maker plainTeXu se
nepovažuje za projev neslušného vychování, ale je to běžný vyjadřovací prostředek.
Uživatel tím dosáhne na páky přímo spojené s TeXem bez toho, aby byl od nich
oddělen dodatečným makro-polštářem.
Vzhled ukázkového dokumentu je „implicitní pro OPmac“. Při použití OPmac se
předpokládá, že typograf přetáhne některá makra z OPmac do svého souboru
a tam je předefinuje k obrazu svému a k obrazu cíleného dokumentu.
Ve zdrojovém textu pak bude napsáno \input opmac
následované například
\input styl
, kde proběhne předefinování. Proto jsou makra OPmac napsána
srozumitelně a bez zbytečných parametrů.
LaTeX v záhlaví dokumentu zavádí tzv.
balíčky pomocí \usepackage
. Přesněji: makro \usepackage
použije primitivní příkaz \input
k načtení specifikovaného souboru
maker. Uživatel LaTeXu teoreticky nemusí nic nestandardního řešit: jakýkoli
požadavek, na který si vzpomene, je pravděpodobně už vyřešen v nějakém
balíčku. Takže uživateli stačí přijít na to, který to je balíček
(CTAN je poměrně rozsáhlý), nastudovat dokumentaci
k vybranému balíčku a balíček použít. Nicméně velká většina balíčků řeší
úkol, který je na úrovni TeXu samotného řešitelný jen pár řádky maker (je jen
potřeba vědět, jakými). OPmac proto místo takových krátkých balíčků používá www
stránku OPmac triků.
Čtenáři, kteří znají LaTeX, si ve zdrojovém dokumentu v ukázce povšimnou
několika podstatných změn, které jsou typické pro XeLaTeX: místo balíčku
babel
pro vícejazyčnou sazbu je použit balíček polyglossia
,
dále se nepoužívá balíček fontenc
ani inputenc
, protože XeTeX
nekompromisně předpokládá vstup v UTF-8 a textové fonty v UNICODE.
K zavedení rodin fontů je třeba použít balíček fontspec
, který je
nově vytvořen pro UNICODE fonty.
Prvním povelem LaTeXu \documentclass
se specifikuje základní typ
dokumentu (tzv. třída dokumentu). Obvykle se používá jedna z možností
article
, report
, book
, letter
nebo
slides
. Povel \documentclass
přečte soubor odpovídajícího názvu
s příponou cls
(například article.cls
), kde jsou makra
nastavující výchozí stav dokumentu podle požadované třídy a dodatečných
parametrů specifikovaných v hranaté závorce.
LaTeX nutí uživatele dodržovat strukturu do sebe vnořených tzv. prostředí
obklopených příkazy \begin{něco}
a \end{něco}
. Pro
zahájení sekce se používá příkaz \section
a pro podsekci
\subsection
. Nadpis následuje uzavřený ve svorkách. Obrázek načteme
pomocí \includegraphics
(toto makro je definováno v balíčku
graphicx
). Tabulku tvoříme v prostředí tabular
. Zájemcům
o LaTeX doporučuji Satrapovu knížku LaTeX
pro pragmatiky.
Svůj soukromý vztah LaTeXu jsem shrnul v článku Proč nerad používám LaTeX. Ačkoli jsem článek napsal před 16 lety, nic bych v něm neměnil ani dnes.
Podíváte-li se do ukázkového zdrojového souboru, shledáte, že prostředí
v ConTeXtu se vymezují příkazy \startněco
a \stopněco
.
Nejpodstatnějším rysem ConTeXtu je možnost nastavení parametrů sazby příkazem
\setupněco
následovaným údaji ve tvaru klíč=hodnota
v hranatých závorkách. Pro sekce a podsekce se používají příkazy
\section
a \subsection
stejně jako v LaTeXu. Na rozdíl
od něj ale může za těmito příkazy v hranaté závorce následovat lejblík pro
odkaz bez nutnosti psát slovo \label
.
Záměrem ConTeXtu je umožnit uživateli nastavovat typografické a další parametry sazby pomocí dokumentovaných parametrů. Tím se liší od LaTeXu, kde se předpokládá, že použitím stylového souboru jsou typografické parametry nastaveny a uživatel se o to nestará. ConTeXt se liší pochopitelně taky od OPmac, kde si typografické parametry uživatel nastaví přímo na úrovni primitivních registrů TeXu a není nucen hledat v dokumentaci, jak se která vlastnost jmenuje a jak ji nastavit v nové vrstvě, která se nad TeXem rozprostírá a jmenuje se ConTeXt.
ConTeXt (ve verzi MKIV) je silně propojen s Lua skriptováním a (v obou verzích MKIV i MKII) s Metapostem, což je (zhruba řečeno) jazyk na „programování obrázků“. Grafické prvky tak kooperují se samotnou sazbou prostřednictvím Metapostu. K této problematice se vrátím až v díle věnovaném grafice. K verzi ConTeXtu MKII vyšel před léty seriál na rootu.
Osobně nejsem ani jedním z uvedených expertů. Proto jsem s ukázkami
LaTeXu a ConTeXtu měl jisté potíže. Například v LaTeXu nevím, jak
přesvědčit tabulku, aby měla kolem vodorovných čar více vertikálního prostoru
a zejména aby ty vodorovné čáry neprotínaly dvojitou svislou čáru. Kdo první
v diskusi pod tímto článkem ukáže LaTeXové řešení (tj. nikoli TeXové, na úrovni
\halign
, \strut
atd. to umím taky), toho budu nazývat
LaTeXovým expertem.
Dále je zde druhá XeLaTeXová úloha: matematické
fonty zůstaly v Computer Modern, což se k písmu Schola poněkud
nehodí. Chtěl bych tam mít (jako v ukázce s OPmac) TXfonty. Použití
\usepackage{txfonts}
se nesnáší s balíčkem fontspec
. Kdo
vyřeší tento problém, toho budu nazývat XeLaTeX-fontovým expertem. Komu se
podaří vytvořit tabulku se dvojitými čarami dle vzoru z OPmac-ukázky
v ConTeXtu, toho budu nazývat ConTeXtovým expertem.
pdffonts
se můžete přesvědčit: TeXGyreSchola-Regular/Bold/Italic.
Já nevidím rozházený text ani různé velikosti písmen v jednotlivých ukázkách. To asi taky záleží na PDF prohlížeči...
\renewcommand{\arraystretch}{1.3}
hhline
a pak místo příslušných \hline použít
\hhline{||-|--||}
\documentclass[a4paper,11pt]{article} \usepackage{polyglossia} % nastavení jazyka (náhrada za babel) \setdefaultlanguage{czech} % české vzory dělení, atd. \usepackage{amsmath} \usepackage{amsfonts} \usepackage{fontspec} \setmainfont{XITS} \usepackage{unicode-math} \setmathfont{XITS Math} \usepackage{hhline} \begin{document} \begin{tabular}{||l|cc||} \hline & \multicolumn{2}{c||}{počet \qquad\null}\\ makro & řádků kódu & stran dokumentace \\ \hhline{||-|--||} &&\\ [-2ex] plain & 1241 & 100 \\ OPmac & 1600 & 19 \\ \hhline{||-|--||} &&\\ [-2ex] \LaTeX{} (jádro) & 8000 & 240 \\ hyperref & 24773 & 423 \\ color + graphics & 2469 & 81 \\ \hhline{||-|--||} &&\\ [-2ex] Ti\textit{k}Z & 1\,634\,882 & 726 \\ \hhline{||-|--||} &&\\ [-2ex] Con\TeX{}t & 1\,155\,673 & 547 \\ \hline \end{tabular} V řádku se píše matematika mezi dolary: $a^2+b^2=c^2$. Nebo je možno sestavit samostatnou rovnici obklopenou dvojicí dolarů: \begin{equation} \int x^\alpha \mathrm{d}x = \begin{cases} \frac{x^{\alpha+1}}{\alpha+1} & \mbox{pro } \alpha\not=-1 \\ \ln x & \mbox{pro } \alpha=-1 \end{cases} \label{rce} \end{equation} Vzorce se zapisují zhruba tak, jak bychom je anglicky přečetli. \[ \mathbb{A} = \begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} \] Toť na úvod vše. \end{document}Nastavení math fontů:
\usepackage{unicode-math}
\setmathfont{XITS Math}
(u mě funguje jen po přesunu amsmath
a amsfont
před)
dříve diskutované \hhline
a za ním vložený "fake" řádek zmenčený &&\\ [-2ex]
(no dobře to moc elegantní není :))
\documentclass[a4paper,11pt]{article} % V LaTeXu povinné \usepackage{polyglossia} % nastavení jazyka (náhrada za babel) \setdefaultlanguage{czech} % české vzory dělení, atd. \usepackage{amsmath} \usepackage{amsfonts} \usepackage{fontspec} % nastavení fontu \setmainfont[Ligatures=TeX, Extension=.otf, UprightFont= *-regular, BoldFont=*-bold, ItalicFont=*-italic, BoldItalicFont=*-bolditalic ]{texgyreschola} % fontová rodina TeXGyre Schola \usepackage{unicode-math} % nastavení matematického fontu \setmathfont{xits-math.otf} \setmathfont[range=\mathit]{texgyreschola-italic.otf}Kompletní výsledek je na priklad-latex-b.tex a priklad-latex-b.pdf. Je možné si všimnout, že to stále není úplně totéž, jako v OPmac ukázce. Například jednička není z fontu Schola ale z xits fontu, což nepůsobí dobře. A otázka, jak zavést do xelatexu matematický TXfont (který není unicode) taky není zodpovězena. Přitom XeTeX tomu technickou překážku neklade: za použití XeTeX+OPmac tam ten TXfont mám snadno. Nevylučuji, že problém je jen v tom, že LaTeXu příliš nerozumím, takže do něj neumím vpravit TXfont.
\setmathfont[range=\mathup]{texgyreschola-regular.otf}
popř. i nastavit další range=\mathbfup
\renewcommand{\arraystretch}{1.3}
. Chápu to tedy tak, že potom mezi řádky, kde se nevyskytuje vodorovná linka a tudíž tak velký prostor není potřeba, je nutné vrazit něco jako \vspace
se záporným argumentem.
Psát si vlastní makra na obsah, no, kdo chce tam, pomozme mu tamTrochu mi to pripada jako NIH syndrom.
Pan Olšák to třeba vysvětlí...Výhody OPmac jsou shrnuty na první a druhé stránce dokumentace. Vlastnosti, které má LaTeX rozprostřeny v desítkách balíčků s celkovým počtem stotisíců řádků kódu, jsou naprogramovány v jediném souboru s 1600 řádky. Chtěl jsem hlavně ukázat, že se věci dají dělat jednoduše. A nemusíme jen srovnávat počty řádků kódu, ale též počet stran dokumentace. OPmac je na 19 stranách. Když ale chcete třeba použít beamer (typicky proto, aby člověk na slídu napsal: nadpis, * výkřik první, * výkřik druhý), musí se prokousat více než dvěma sty stránkami dokumentace.
jsou jednotlivé názvy maker používané v OPmac v souladu s těmi, co se obecně používají v TeX komunitě? A má vůbec TeX komunita běžně užívané názvy pro makra? (např. * jako odrážka, to je inovace jen v OPmac, nebo běžná praxe i u ostatních?)TeXová komunita obecně používá (bohužel) LaTeXové značkování. OPmac jsem zveřejnil v prosinci 2012 na setkání uživatelů TeXu v Brně a pak v dubnu mi o tom vyšel podrobný článek v americkém TUGboatu. Je to tedy relativně nové, takže zatím asi málo užívané.
Po pravdě jsem velmi zvědav na Vaše řešení konverze do html - jestli to zvládne matiku/obsahy/rejstříky/citace jako odkazy atd. Třeba již zmíněný AsciiDoc je v této věci hodně silnou konkurencí.Moje html řešení je šité na jednu konkrétní úlohu a matematiku v něm neřeším. To jen, abyste neměl příliš vysoká očekávání...
Součísti HTML je třeba JavaScript
wat
Nebo tím myslíš buzzword HTML5?
Se vším co píšete, plně souhlasím. Vaší pragmatický volbě rozumím. Kdysi jsem totiž z podobných důvodů 'vystřízlivěl' a přešel od plainTeXu k značkovacím jednoduchostem. Cítil jsem bolestně na jedné straně nedokonalost svých TeX-maker a na druhé daleko efektnější výstupy (s daleko menší námahou) z AsciiDocu.
Teď mi nicméně přijde, že je to podobné, jako když si člověk vytváří databázi fotek v JPG, hudby v MP3... pro nějakou snadnou použitelnost, místo aby na archivaci používal nějaké bezztrátové formáty. Přitom ty těžkosti, které nás v současné době lákají obětovat sazbu, jsou ve své podstatě snadno řešitelné. Nebo byste si nevybral plainTeX, kdybyste v něm měl nadefinovanou podmnožinu příkazů à la Sphinx, obdobné možnosti konverze a navíc byste v případě potřeby mohl sáhnout po nástrojích, které by Vaše možnosti posunuli o několik levelů výš? Je pak ještě vůbec představitelné, že by Vás něco v budoucnu mohlo donutit změnit vaše ustálené zvyky tvorby dokumentů?
Co se týče mého "osamělého odhodlání" :) ... domnívám se, že to nestojí za řeč. Spíš to asi zatím vidím jen na nějaké temporary řešení pro rychlej přístup k velkému množství formátů (plain+opmac -> txt2tags) a pokud mi nebude stačit pdfko, tak se budu krotit a používat jenom to, co mi můj konvertor sežvejká a přímej export do hlavních výstupních formátů (html, odt) v rozumné kvalitě ve svém případě vidím spíš jen jako takové pokusničení a dokonalou vizi budoucnosti :D
Děkuji za vynikající článek. Mám jeden dotaz a jednu připomínku.ad 1) OPmac jazyk neneřeší s výjimkou dvou věcí: má připravena slova Kapitola, Tabulka a Obrázek v uvedených třech jazycích a není problém přidat další, např. \sdef{mt:chap:de}{Kapitel}. Druhá věc je řazení do rejstříku, které je připraveno pro angličtinu a podle české normy. Řazení podle norem jiných jazyků by se muselo dodělat modifikací stávajících maker. Možná ale Váš dotaz se týkal možnosti psát v daném jazyce a používat dělení slov. To je pak dotaz na CSplain, ne na OPmac. CSplain pod 8bitovým TeXem dovolí načíst všechna dostupná dělení slov jazyků, jejichž abecedy se schovají do evropského kódování T1, což představuje 29 jazyků. CSplain pod 16bitovým TeXem (v Unicode) dovolí načíst všechna dostupná delení slov, což představuje nyní 54 jazyků včetně ruštiny, řečtiny atd. ad 2) Tím, že jste zmínil uvedené slovo v souvislosti s OPmac, uvedl jste mě do nepohody až stavu naštvanosti:). Pokud maintaineři dister přijmou TeXlive jako celek, který je z pohledu této problematiky velmi různobarevný, pak tam OPmac najdete. ad OKTeX: s touto myšlenkou jsem si pohrával zhruba před deseti lety, pro jednu věc jsem to použil. Nemám zprávy, že by to někdo jiný použil, takže jsem se tím přestal zabývat a dále jsem to nerozvíjel.
Pro vyřešení "soutěžních" otázek (i všemožných dalších problémů s *TeXem) doporučuji tex.stackexchange.com.Že by ta nápověda nezabrala? Chtěl bych zdůraznit, že TXfonty sice nejsou unicodové, ale pro matematiku to v XeTeXu nevadí. Připomínám další nezodpovězenou otázku: jak zajistit nekřížení čar v tabulce v ConTeXtu. Nějak mě to utvrzuje v názoru, že přiohnout si sazbu k obrazu svému ve složitějších nadstavbách opravdu není jednoduché...
rm czech.sty
.
CSplain negeneruje žádná slova automaticky, takže tam nemá smysl se ptát, jak přeponout automaticky generovaná slova do příslušného jazyka. Na druhé straně OPmac generuje tři slova: Tabulka, Obrázek a Kapitola ve třech jazycích. V jakém jazyce to vyleze, záleží na tom, jaké máte zapnuto dělení slov: implicitně anglické, nebo \chyph české, nebo \shyph slovenské. Rozšíření o další slova nebo jazyky dle potřeby je v OPmac snadné a je popsáno v dokumentaci.
\chyph české, nebo \shyph slovenskéMožná jsem hnidopich, ale nebylo by lepší označovat jazyky standardními kódy dle ISO 639-1? Tj \cshyph a \skhyph. Je to, myslím, v zájmu budoucího rozšiřování.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.