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:

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