plmindex
, czyli
swoją implementację programu makeindx
(wersja 2.12).
Program jest dostępny w postaci pakietu spakowanego (źródła)
programem zip
jest on dostępny pod następującym adresem
plmindex.zipProgram 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:
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)
makefile
i uruchomić program make
(lub wmake
w przypadku
pakietu Watcom i nmake w przypadku MSC) lub wywłać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
skorowidza (jest ona zadeklarowana w zbiorze mkind.c
).
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