Hlavní navigace

Jak na LaTeX: rejstřík balíkem index II

11. 9. 2003
Doba čtení: 5 minut

Sdílet

Nyní je již čas naučit se rejstřík kompilovat. Koukneme se na nějaké další vymoženosti, které nám usnadní vytváření rejstříku. Část o rejstřících uzavřeme příkladem.

Makeindex

Pro zpracování rejstříků v dokumentaci se používá program makeindex. Tento program si prohlédne dokument a vygeneruje na jeho základě soubory obsahující rejstřík. Použití programu je jednoduché:

makeindex dokument.idx

Před spuštěním makeindexu je potřeba dokument přeložit, protože teprve při překladu vznikne idx soubor, který zpracujeme na výstupní ind soubor programem makeindex.

Program makeindex je potřeba spustit na všechny vygenerované indexové soubory, tj. pro každý rejstřík zvlášť. Je samozřejmě možné spojit více rejstříků do jednoho výstupního, více v makeindex(1). Pro více rejstříků (tak, jak jsme je definovali v předchozí kapitole) může zpracování vypadat následovně:

makeindex dokument.idx
makeindex -o dokument.and dokument.adx
makeindex -o dokument.znd dokument.zdx

Pozor, pokud neuvedete výstupní soubor (parametr -o), pak se výsledek uloží automaticky do souboru s příponou ind. Tím si ovšem můžete přepsat jiný rejstřík.

Tisk rejstříku do dokumentu

Pro tisk rejstříku v dokumentu se používá příkaz \printindex. Při použití bez parametru použije soubor s rejstříkem podle názvu překládaného dokumentu s příponou ind. Pokud chceme jiný rejstřík, pak jej musíme zadat v parametru příkazu:

\printindex      % vytiskne defaultní rejstřík
\printindex[aut] % tisk autorského rejstříku
\printindex[zkr] % tisk rejstříku zkratek

Pro každý rejstřík se založí nová stránka, kde se použije jako nečíslovaný nadpis text z posledního parametru příkazu \newindex, který jsme použili v hlavičce dokumentu pro založení rejstříku.

Pokud si prohlédnete soubor ind, zjistíte, že se jedná o texovský dokument. Z toho vyplývá, že jej lze editovat a odstranit tak neduhy rejstříku, které se nedaří odstranit jinak. Je ovšem nutné připomenout, že tento soubor je generovaný programem makeindex, proto tyto úpravy provádějte až po dokončení dokumentu. To, že je možné tyto úpravy dělat, je dobré vědět, ale asi sami cítíte, že to není to pravé ořechové.

Při psaní dokumentace nebo vytváření rejstříku v již hotovém dokumentu se hodí vědět, jaká hesla máme na dané stránce v rejstříku. Běžně se použije balík showidx, ovšem ten funguje pouze pro defaultní rejstřík. Pro balík index je vhodnější použití příkazu \proofmodetrue. Tím se zobrazí seznam rejstříkových hesel na okraji dokumentu (v oblasti pro poznámky na okraji) na stránkách, kde se na ně odkazuje, tj. tam, kde máme příkaz  \index.

Příklad

V příkladu jsem pokusně sestavil první tři díly tohoto seriálu a vytvořil dva rejstříky. První jako defaultní je klasický s hesly. Druhý je rejstřík příkazů. Pokud se podíváte do zdrojového dokumentu, zjistíte dvě věci:

  • dokument je poněkud „přeindexovaný“
  • zdrojový kód výrazně ztratil na přehlednosti

Tento dokument je extrém, normálně budete mít odkazů méně a asi se budete je snažit dávat minimálně na samostatný řádek, abyste minimalizovali ztrátu přehlednosti.

Napřed si připravíme hlavičku dokumentu:

\documentclass[12pt]{article} % trošku větší font
\usepackage[czech]{babel}     % inicializace českých zvyklostí
\usepackage[latin2]{inputenc} % vstupní kódování
\usepackage{index}     % balík pro indexování

% inicializace rejstříků
\newindex{default}{idx}{ind}{Rejstřík}
\newindex{cmnd}{cdx}{cnd}{Rejstřík příkazů}

% pomocné příkazy
\def\cindex{\index*[cmnd]}        % zařazení do rejstříku příkazů
\newcommand{\hla}[1]{\textit{#1}} % pro vysvětlení pojmu

V těle dokumentu použijeme příkazy \index a \cindex pro vytvoření obou rejstříků. Na místě, kde budeme chtít rejstřík vytisknout, pak použijeme příkazy:

\printindex       % vytiskne defaultní rejstřík
\printindex[cmnd] % tisk rejstříku příkazů

Na závěr dokument přeložíme, necháme zpracovat rejstříky, a pak znovu přeložíme. Jednotlivé fáze překladu jsou s komentářem v tabulce:

Tabulka č. 486
tex  kompletní zdrojový kód
dvips 

latex doc.tex
dvips -o doc.ps doc.dvi

první překlad, ve výsledném dokumentu nejsou rejstříky
vytištěny, protože při prvním průchodu se teprve vytváří
do externích souborů.

idxind 

makeindex doc.idx

zpracování defaultního rejstříku, výstup je uložen
do souboru  doc.ind.

cdxcnd 

makeindex -o doc.cnd doc.cdx

zpracování rejstříku příkazů, výsledek je v souboru  doc.cnd.

dvips 

latex doc.tex
dvips -o doc.ps doc.dvi

druhý překlad, teprve nyní se nám zpracovaný
rejstřík vloží do dokumentu.

dvips 

latex doc.tex s příkazem \proofmodetrue
dvips -o doc.ps doc.dvi

jen pro ukázku je zde výsledek po překladu s příkazem
\proofmodetrue uvedeným v hlavičce
dokumentu.


Jak již bylo řečeno dříve, je potřeba kompletní překlad provést minimálně dvakrát (lépe pro jistotu třikrát). Důvodem je, že při prvním průchodu se místo rejstříků nebudou vkládat žádné stránky (protože rejstřík není vytvořen). Druhý překlad (s již přeloženými rejstříky) zajistí vložení rejstříků, ovšem to může posunout číslování stránek následujícího textu. Tudíž třetí překlad nám zajistí správně vygenerované obsahy dokumentu a křížové odkazy.

Normálně dva překlady stačí, protože většinou máme jen jeden rejstřík a za rejstříkem by neměl být už žádný text vztahující se k tématu dokumentu (dál mohou být například prázdné stránky pro poznámky nebo tiráž). Z toho plyne, že vložením rejstříku neměníme číslování stránek/kapitol v žádné jiné části dokumentu.

České řazení pojmů

Čeština je pro programátory z anglosaských zemí stále nepřekonatelným oříškem. A tak při kompilaci zjistíte, že makeindex zrovna podle české abecedy neřadí. Chytří čeští programátoři nelenili a napsali csindex , který už našim potřebám vyhovuje lépe. Ovládání je shodné s programem makeindex, ale umožňuje různá vstupní kódování (keybcs2, il2, koi8cs) parametrem <code>-z <code>, kde code je právě název vstupního kódování.

A zde se můžete podívat na rozdíly mezi příkazem makeindex doc.idx (první a druhá stránka rejstříku) a českou variantou csindex -z il2 doc.idx(první a druhá stránka rejstříku). Všimnout si můžete hesel, jako jsou část, Československé sdružení, čítač, při použití makeindex jsou až na konci rejstříku (druhá stránka), kdežto při csindex jsou na svém místě.

Závěr

Nyní umíte vytvořit několik různých rejstříků v dokumentu. Příště se vrátíme více k technickému dokumentu a pronikneme na místo, kde se ukrývá největší síla TeXu.

CS24_early

Oprava

Jedna oprava k předchozímu dílu. Příkaz \index*[typ]{pojem} slouží k tomu, abychom nemuseli pojem psát dvakrát. Ale použil se v dokumentu text pojem právě z příkazu index. Tudíž vzniknou dva ekvivalentní zápisy:

Příkaz command \index{command} se nepoužívá.
Příkaz \index*{command} se nepoužívá.

Typ rejstříku lze zvolit u příkazu \index i \index*  nepovinným parametrem:

Slunce \index[hvezda]{Slunce} je středem sluneční soustavy.
\index*[hvezda]{Slunce} je středem sluneční soustavy.

Seriál: Jak na LaTeX

Byl pro vás článek přínosný?