TeX tutorial: III. Základy makrojazyka, vkládání obrázků 3
Pod minulým článkem jistý Jirka psal, že by uvítal článek o vkládání obrázků do textu. Vzhledem k tomu, že toto má být prakticky zaměřený seriál, je to docela dobrý nápad. Dnes se tedy obrázků dočkáte. Ještě než se k nim dostaneme, budeme si muset osvojit základy makrojazyka TeXu.
Jednoduše řečeno, s TeXem komunikujeme pomocí maker. Makra jsou v plainu zleva uvozena znakem ‘\’ (pokud se vám tento znak nelíbí, můžete ho jednoduše vyměnit za jiný, ale tím se zabývat nebudeme, protože to věru praktické není). Následuje popis, jakým způsobem makro přijímá parametry a vlastní tělo makra. Popis vstupu může vypadat například podobně jako v tomto makru:
\def\abc#1#2#3{#1, #2, #3}
V tomto případě makro přijímá tři parametry, které jdou přesně za sebou a ve výsledku se vypíšou oddělené čárkami a mezerami. Můžeme si ale vstup nadefinovat i zábavněji, například takto:
\def\defg[#1]|#2|(#3){#1, #2, #3} \defg[text]|oddělený|(čárkami)
Pokud neposkytnuteme vstup v předepsaném formátu (na druhém řádku), nastane chyba. Skuteční vtipálci pak při definici maker mohou zajít ještě dále.
\def\abc babička #1°°°°#2[#3]{#3#2#1} \abc babička a°°°°dědeček[???]
V naprosté většině případů si ale vystačíme s definicemi podobnými prvnímu příkladu, maximálně použijeme nějaké hranaté závorky, aby naše makra vypadala opravdu krutě, ale do větších extrémů se pouštět nebudeme. V prvním příkladu bych vás ještě měl upozornit na častou začátečnickou chybu.
\def\abc#1#2#3{#1, #2, #3!} \abc Jedna dvě tři.
Pokud si myslíte, že naše volání způsobí vysázení Věty „Jedna, dvě, tři.“, mýlíte se. Pokud nejsou specifikovány oddělovače, jako první parametr se bere první skupina nebo znak, který následuje. V tomto případě není první parametr „Jedna“, ale „J“. Obdobně je to s dalšími parametry. Náprava je velmi jednoduchá.
\abc{Jedna}{dvě}{tři}.
Existuje ještě jeden velmi elegantní a praktický způsob, jak psát některá makra (zejména nadpisy), který jsem okoukal z článků pana Olšáka.
\def\nadpis#1\par{% {\velkympismem\noindent#1}% \vskip8dd\noindent% } \nadpis Velký článek Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, balónky působí jako jakási fata morgána uprostřed pouště.
Tento způsob je dosti v souladu s představou TeXu jako značkovacího jazyka, kde značky mají být pro koncového uživatele (pisatele, spisovatele) přirozené a jednoduché (čili žádné vnořené složené závorky či jiná zvěrstva). Až budete psát svá makra, pište je jednoduše a elegantně.
Dobře. A jak je to tedy s těmi obrázky?
Nejprve bychom měli k našemu zdrojovému souboru přiložit knihovnu, která obsahuje potřebná makra (protože je pochopitelně sami psát nebudeme).
\input graphicx
A potom již pouze využíváme makro \includegraphics, které za nás udělá tu nejšpinavější práci (vloží obrázek do dokumentu). S jeho zarovnáním se už musíme vyrovnat sami.
\vskip6dd \centerline{\includegraphics[scale=0.75]{spojvis2.png}} \centerline{\ita{Obr. 8. -- 9 vteřin po spuštění simulace}} \vskip10dd
Tímto makrem vložíme do dokumentu obrázek spojvis2.png v měřítku 0,75:1 a zarovnáme ho na sřed. Těsně pod něj potom vložíme jeho popis, který bude taktéž zarovnaný na sřed (\ita je nějaké vámi definované makro, které vypíše popis příslušným stylem – například kursivou). Jaké parametry má makro \includegraphics a jaká jiná makra knihovna graphicx obsahuje, si již můžete zjistit sami. My se zaměříme na sazečskou práci.
Makro \centerline expanduje na \line{\hss#1\hss}, přitom už víme, že \line exapnduje na \hbox to\hsize. \hbox to\hsize vytvoří horizontální kontajner o šířce sazebního obrazce \hss vkládá nekonečně roztažitelnou dynamickou horizontální mezeru. Pokud takovou mezeru vložíme po obou stranách nějakého objektu, potom bude takový objekt přesně uprostřed sazebního obrazce. Kdybych vás teď požádal, abyste napsali makro, které zarovná objekt napravo, určitě byste věděli jak (vložili byste onu podivnou mezeru pouze nalevo, tím pádem by objekt „přimáčkla“ napravo).
Teď už určitě rozumíte celému makru, které vkládá obrázek doprostřed stránky. Častý požadavek mnoha lidí bývá takzvané „obtékání“ textu kolem obrázku. Známá ne-moc-častá extravagantní „featura“, kterou znáte z novin či z wordovských dokumentů, které jsou dle jejich autorů až neuvěřitelně kruté. I takové obtékání se dá v TeXu implementovat, ale předem vás upozorňuji na to, že makro, které je jednoduché pro koncového uživatele, je vysoce netriviální a obsahuje řadu výpočtů. My se pokusíme napsat makro, které nám způsobí obtečení jednoho konkrétního obrázku a neměnném odstavci.
V plainu existuje primitiv \parshape, se kterým si kreativní duše jistě vydrží hrát celé dny. Specifikuje tvar následujícího odstavce, čili můžete vytvořit kulaté, trojúhelníkovité, šipkovité či jinak tvarované odstavce. Primitiv má následující tvar:
\parshape n i1 h1 i2 h2 i3 h3 ... in hn
kde n je počet řádků, i je odsazení od levého okraje příslušné řádky a h je šířka příslušné řádky.
Potřebujeme nejdříve změřit obrázek, který chceme vkládat. To uděláme tak, že zkonstruujeme kontajner, do kterého vložíme obrázek a celý kontajner následně uložíme do paměti pod číslem 1.
\setbox1\hbox{\includegraphics[scale=0.5]{impuls.png}}
Vytvoříme si nový délkový registr \a a uložíme do něj šírku boxu 1.
\newdimen\a \a=\wd1
A zamyslíme se, jak bychom mohli takové obtečení udělat. Existuje mnoho způsobů. Mě zrovna napadá tento. Vysázíme odstavec, pod něj vložíme obrázek, který posuneme nahoru dovnitř odstavce. Makrem \parshape potom „uhneme“ s řádky, které zasahují o obrázku.
\newdimen\b \b=\a \advance\b by5dd \newdimen\c \c=\hsize \advance\c by-\b \newdimen\d \d=\ht1 \advance\d by\baselineskip \parshape 21 0dd \hsize 0dd \hsize 0dd \hsize 0dd \hsize \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c \b \c 0dd \hsize \noindent Vítr skoro nefouká a tak by se na první pohled mohlo zdát, že se balónky snad vůbec nepohybují. Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, balónky působí jako jakási fata morgána uprostřed pouště. Zkrátka široko daleko nikde nic, jen zelenkavá... ...(zde záměrně chybí text) ...ani ne moc vysoko, ani moc nízko nad zemí. \vskip-254dd \box1 \hbox to \a{\hfil\ita{Obr. 4. -- Odezva systému}% \hfil} \newdimen\e \e=254dd \advance\e by-\d \vskip\e Jenom tak klidně levitují ve vzduchu. Jelikož slunce jasně září a na obloze byste od východu k západu hledali mráček marně, ...
Jak vidíte, vytvořil jsem ještě tucet nových registrů, se kterými jsem občas provedl tajemnou operaci \advance\… by. Bystřejší z vás jistě tuší, že se bude jednat o přičítání, resp. odečítání délek s/od registrů nebo registrů navzájem. \htX je výška (HeighT) uloženého kontajneru číslo X. \boxX vysází kontajner číslo X a zároveň ho vymaže z paměti (proto všechno to ukládání). Je zřejmé, co celý kód dělá, proto neposkytnu žádné rozšiřující vysvětlení :) (pokud by měl někdo problém, budu rád, když se zeptá v komentářích). Zato poskytnu obrázek, jak takový obtečený obrázek bude vypadat.

Obtékání obrázku v TeXu
Pokud přidáte nebo odeberete pár slov z odstavce, celé se vám to rozhaší :(. Je to proto, že jsme kód navrhovali pro jednu jedinou situaci. Náš kód zdaleka není universální a jak již jsem předesílal, universální kód by byl velmi velmi složitý. Obtékání obrázku textem obecně nedoporučuji používat.
To by byly obrázky. V příštím díle bych se rád věnoval praktickým dorbnostem, jako jsou funkce pdfTeXu – obarvování textu, jeho rotace, posuny (nikoli přes matice zobrazení! jsme začátečnický seriál a nevíme, co je to algebra). Dále bych vám chtěl ukázat, jak oživit vaše dokumenty (udělat je „klikací“) a jak například generovat obsah. A to vše pouze s formátem plain! A eplain :). A občas (jako dnes) ukradneme latexu některé z jeho knihoven (které v něm díky Bohu nejsou napsány, a tak některé z nich můžeme používat).




