sobota, 28 marca 2009

III Olimpiada Informatyczna Gimnazjalistów (2. etap)

Dzisiaj odbył się 2. etap III OIG.

Najlepsi byli moi uczniowie (z 49. Gimnazjum we Wrocławiu):
  • Mateusz Gołębiewski
  • Bartek Dudek
Szczegółowy ranking dostępny jest na stronie OIG: http://www.oi.edu.pl/html/oig3/wyniki_e2.html

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.

sobota, 21 marca 2009

pdfcrop

Dzisiaj stanąłem przeciwko następującemu zadaniu. Oczywiście wszystko udało się wykonać za pomocą darmowych programów dostępnych, np. z Ubuntu.

Opis problemu:
Mam pewną książkę w pliku PDF i chciałbym ją sobie wydrukować. Wydaje się, że to żaden problem. Otwierasz np. w programie evince i dajesz Drukuj. Problem jest w tym, że dokument PDF zawiera zeskanowane strony, które nie zawsze mają odpowiedni margines. Chciałbym bowiem włożyć sobie wydrukowaną książkę do segregatora, a więc chciałbym podziurkować kartki dziurkaczem. Ponieważ czasami margines jest na tyle mały, więc miejscami mógłbym mieć dziury w tekscie.
Jak więc zmienić marginesy w dokumencie PDF?

Rozwiązanie:
Znalazłem w Google kilka rozwiązań. Najbardziej odpowiadało mi to, w którym używa się programu pdfcrop. Jego składnia jest bardzo prosta:
pdfcrop --margins '<left> <top> <right> <bottom>' in.pdf out.pdf
Użyłem zatem polecenia
pdfcrop --margins '30 10 30 10' in.pdf out.pdf
i z pliku in.pdf powstał out.pdf z szerszymi marginesami. Wydruk prezentuje się super, oczywiście w segregatorze.