niedziela, 22 marca 2009

LaTeX: Polski skorowidz w UTF-8

Ach ta wiosna; dzisiaj napotkałem kolejny problem. Tym razem sprawa dotyczy tworzenia skorowidza w LaTeX'u.
Od jakiegoś już czasu składam dokumenty przy użyciu kodowania UTF-8. Niestety, gdy powstawał LaTeX, nie myślano jeszcze o UTF-8. Na szczęście pakiet inputenc obsługuje już UTF-8 poprzez podanie opcji utf8:
\usepackage[utf8]{inputenc}
Niestety skorowidz (indeks słów umieszczany zwykle na końcu dokumentu) jest wciąż tworzony starym programem makeindex, który nie wie co to UTF-8. W konsekwencji uzyskujemy skorowidz, w którym polskie znaki diakrytyczne są dziwnie posortowane.

Znalazłem w sieci program plmindex autorstwa Włodzimierza Macewicza; zob. np. Program plmindex, Wszystko o indeksowaniu, TeX na indeksie. Program plmindex sortoje słowa zgodnie z polskimi zasadami. Kompilacja programu przebiegła bez żadnych problemów pod moim Ubuntu. Niestety program plmindex również nie należy do najnowszych i nie zna on porządku znaków diakrytycznych kodowanych UTF-8. Potrafi natomiast sortować słowa kodowane za pomocą stron:
  • PL-mazowia,
  • PL-latin2,
  • PL-cp1250,
  • PL-cp852.
Jak już pisałem wcześniej, nie zamierzam zrezygnować z UTF-8 i przestawiać się np. na latin2 (ISO-8859-2), tylko po to, aby powstał dobrze posortowany skorowidz. Napisałem więc sobie skrypt, który tworzy skorowidz z prawidłowo posortowanymi słowami w UTF-8. Wystarczy wywołać jedną komendę, która filtruje plik thesis.idx utworzony przez LaTeX'a i w wyniku daje plik thesis.ind. Przypominam, że musimy ponownie wykonać kompilację dokumentu LaTeX'em, aby pojawił się skorowidz.
Filtrowanie odbywa się najpierw za pomocą sed'a (do latin2), a potem z powrotem za pomocą iconv'a (do UTF-8). W między czasie sortowane są słowa (kodowane w latin2) za pomocą programu plmindex.

Przejdźmy więc do rzeczy.
  1. Załóżmy, że mamy dokument dokument.tex, a nim przygotowany skorowidz (zob. komendę \makeindex)
    Kompilacja

    latex dokument.tex
    utworzy plik dokument.idx
  2. Teraz standardowo powinno się wywołać polecenie 'makeindex dokument'
    Ale nie dla dokumentów kodowanych w UTF-8. Zamiast tego wywołujemy polecenie:

    sed -f skrypt.sed dokument.idx | plmindex -L PL-latin2 | iconv --from-code=ISO-8859-2 --to-code=UTF-8 > dokument.ind
    W ten sposób otrzymamy plik dokument.ind z prawidłowo posortowanymi słowami oraz w kodowaniu UTF-8.

  3. Teraz wystarczy ponownie skompilować dokument

    latex dokument.tex
    W efekcie otrzymujemy plik dokument.dvi z prawidłowym skorowidzem.
Instrukcja w kroku 2. wymaga, oprócz programów sed, plmindex, iconv, pliku ze skryptem skrypt.sed, który umieściłem tutaj:

Mam nadzieję, że ktoś skorzysta.

3 komentarze:

TLu pisze...

Pod linuksem i zamiast pdflatexa kompilować xelatexem można użyć makeindex z opcją -L

massad pisze...

można to tez zrobić używając zamiast pakietu makeidx pakiet index i wywołujac polecenie podane(makeindex -L) Ta metoda ma tą wadę, że (moja i osoby powyżej że ź i ż są nie rozdzielone. Polecam zapoznać się z programem xindy

massad pisze...

można to tez zrobić używając zamiast pakietu makeidx pakiet index i wywołujac polecenie podane(makeindex -L) Ta metoda ma tą wadę (moja i osoby powyżej), że ź i ż są nie rozdzielone.
Polecam zapoznać się z programem xindy