Program plmindex
Author: Włodzimierz Macewicz

Przedstawiam Państwu program `plmindex`, czyli swoją implementację programu `makeindx` (wersja 2.12). Program jest dostępny w postaci pakietu spakowanego (źródła) programem `zip` w instalacji TeX Live: texmf-dist/doc/support/gustprog/plmindex.zip
Pakiety są także dostępne w archiwum GUST, pod adresem:
plmindex.zip oraz na CTAN-ach w katalogu `..../language/polish`

Program ten służy do sortowania i grupowania skorowidzów utworzonych pakietem LaTeX. Po przetworzeniu zbioru może on być dołączony do tekstu jako gotowy skorowidz.

Krótki opis opcji programu można uzyskać po wywołaniu
plmindex -h

Zmiany w programie polegają na dostosowaniu go do pracy z dowolnym ośmio-bitowym alfabetem (sposobem kodowania). Prezentowana wersja pozwala na opracowanie skorowidzów w języku polskim (kod Mazowii, cp1250, cp852 i ISO-8859-2) oraz angielskim. Zdefiniowanie nowego języka polega na zbudowaniu kilku tablic określających: porządek leksykograficzny, kategorie znaków, odpowiedniki liter małe-duże i nie wymaga modyfikacji kodu programu. Wszystkie funkcje odpowiedzialne za operowanie na ciągach znaków (,,stringach'') są sterowane tablicami. Są one całkowicie niezależne od implementacji kompilatora `C`. Program był kompilowany następującymi kompilatorami:

- Borland C++ v 4.51 -- po dodaniu kolejnych tablic wielkość programu przerosła możliwości środowiska 16-bitowego
- Watcom C++ v 10.0a
- GNU C++ v 2.8.1 (System MS-DOS) -- uwaga na wersję 2.8.0, czasami źle obsługuje przesyłanie parametrów do funkcji o niezananej liczbie parametrów
- GNU C++ v 2.8.1 (SunOS 6.5 i Linux)
- MSC C++ 6.0 (Windows 98)

dla każdego kompilatora zostały napisane odpowiednie `makefile`, łatwo rozróżniane po ostatnim członie nazwy (rozszerzeniu):

  `.wcc` -- Watcom,
  `.djg` -- GNU (MS-Dos),
  `.gcc` -- GNU (SunOS -- ogólnie Unix)
  `.msc` -- MSC C++ 6.0 (Windows 98)
  `.emx` -- GNU (DOS >>implementacja E.Mathesa<< lub OS)

odpowiedniemu zbiorowi należy zmienić nazwę na `makefile` i uruchomić program `make` (lub `wmake` w przypadku pakietu Watcom i nmake w przypadku MSC) lub wywłać
`[n|w]make -f makefile.xxx`

## Opis tablic i struktur

Została zdefiniowana struktura `_multilanguage` zawierająca tablice opisujące cechy języka. Odsyłacze przyporządkowane nazwom pól wskazują na zbiory zawierające przykładowe definicje dla kodu Mazowii. Nazwa przykładowej tablicy zawiera prefix określający definiowany język.

    struct _multilanguage
       {
                p_char_u  *day_name_ptr;		/* tablica nazw dni tygodnia  */
                p_char_u  *mon_name_ptr;		/* tablica nazw miesięcy      */
                int_u     *toascii_table;		/* tablica konwersji znaków
    	                                           o kodach > 127 na
    						   kod ASCII np. ą --> a   */
                a_char_u  *lower_table;		/* tablica konwersji małych
    	                                           liter na duże              */
                a_char_u  *upper_table;		/* tablica konwersji dużych
    	                                           liter na małe              */
                a_char_u  *char_type;               /* tablica typów znaków       */
                int_u     *order_tbl;               /* tablica definiująca
    	                                           kolejność leksykograficzną */
                word      flags;                    /* słowo flag                 */
                char_u    *(*_special)(const long); /* adres funkcji dodatkowych  */
                char      *id;                      /* identyfikator języka       */
                char      *name;                    /* nazwa języka               */
         struct decode    *decode;                  /* adres struktury opisującej
                                                       nazwy liczb                */
    };

    struct decode
       {
        p_char_u *jedn;			/* adres tablicy nazw jednostek */
        p_char_u *dies;			/* adres tablicy nazw dziesiątek */
        p_char_u *setki;			/* adres tablicy nazw setek */
        p_char_u *tys;			/* adres tablicy nazw tysięcy */
        p_char_u *mil;			/* adres tablicy nazw milionów */
       };

definicje typów

    typedef unsigned char char_u;

    typedef const unsigned char *p_char_u[];

    typedef const    unsigned char a_char_u[];
    typedef const    int      int_u[];
    typedef unsigned int      word;

Powyższe definicje znajdują się w zbiorze `mkind.h`.

W celu podłączenia nowego języka należy utworzyć nowy zbiór nagłówkowy zawierający opis języka w postaci tabel.

Utworzony zbiór należy dołączyć poleceniem `#include` do zbioru `language.c` W zbiorze `language.c` znajdują się funkcje odpowiedzialne za operacje na ciągach znaków. Są one sterowane zmienną `Language`, będącą wskazaniem na element tablicy `multilanguage` zawierającą struktury wszystkich zadeklarowanych języków. Początkowa wartość zmiennej `Language` określa domyślny język Dopuszczalna wartość zmiennej jest określona przez konstrukcję `enum _language`, tak że w przypadku definiowania nowego języka należy zdefiniować nowy element -- będzie on identyfikatorem języka.

W zbiorze `language.c` znajduje się deklaracja tablicy struktur opisu języków. Ostatnim elementem tablicy musi być opis zawierający w polu `id` wartość `NULL`

Włodzimierz Macewicz