L^{A}TEX 2εpo polsku czyli PL^{A}TEX wersja 1.3.1

Mariusz Olko Litteræ Górczewska 94/96/7 01–117 Warszawa M.Olko@Litterae.com.pl Marcin Woliński wolinski@gust.org.pl

9 maja 2003

Spis treści

1 Informacje dla użytkowników 2 1.1 Krótki obraz całości . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Jak działa styl polski . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Dołączenie polskiego stylu do dokumentu . . . . . . . . . . . . . . 4

2 Source code of polski.sty 5 2.1 Writing banners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Category codes and all that . . . . . . . . . . . . . . . . . . . . . . 5 2.3 Hyphenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.4 Slash notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.5 Maths in Polish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.6 Dashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.7 Teaching L^{A}TEX to speak Polish . . . . . . . . . . . . . . . . . . . . 10 2.8 Macros needed later . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.9 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.9.1 Option plmath . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.9.2 Option nomathsymbols . . . . . . . . . . . . . . . . . . . . 12 2.9.3 Option MeX . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.9.4 Option T1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.9.5 Option QX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.9.6 Option OT1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.9.7 Option OT4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.9.8 Options for prefixing in verbatim . . . . . . . . . . . . . . . 14 2.9.9 Options for date ending in “today . . . . . . . . . . . . . . 14

2.10 Taking off . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3 Configuring L^{A}TEX’s hyphenation patterns 16

4 Font encoding OT4 19

1 Informacje dla użytkowników

1.1 Krótki obraz całości

Pakiet PL^{A}TEX składa się z kilku zasadniczych części.

• Pierwszą z nich stanowią pliki opisu czcionek mające standardowo rozszerzenie .fd, a generowane przez program DocStrip z pliku plfonts.fdd. Znajdują się w nich informacje na temat czcionek pl czyli polskich wersji czcionek Computer Modern (dystrybuowanych z L^{A}MEXem) oraz czcionek pc czyli polskich wersji czcionek Computer Concrete. Dzięki zawartym tam informacjom czcionki te stają się dostępne w Nowym Mechaniźmie Wyboru Czcionek (ang. New Font Selection Scheme). Z pliku plfonts.fdd można wygenerować pliki opisu czcionek zarówno w Starym Układzie (OT1) jak i w Układzie Polskim (OT4).

• Druga część plików związana jest z konfiguracją L^{A}TEXa. Na razie w skład pakietu wchodzi jedynie część pozwalająca na dołączenie do standardowego L^{A}TEXa polskich wzorców przenoszenia wyrazów. Do tego celu został przewidziany w L^{A}TEXu plik o nazwie hyphen.cfg. Jeżeli podczas generowania formatu L^{A}TEX ma dostęp do tego pliku, to użyje go zamiast swojego standardowego pliku ładującego wzorce przenoszenia. W pakiecie dostarczony jest plik hyphen.cfg wzorowany na podobnym pliku z pakietu Babel. Wczytuje on informacje o wzorcach, które mają być załadowane do formatu, z pliku language.dat. Na początku tego pliku znajduje się szczegółowy opis jego formatu.

Wzorce przenoszenia, które znajdują się w pliku plhyph.pl są tymi samymi wzorcami przenoszenia, które znajdują się w ostatnich wersjach MEXa.

• Ostatnią częścią składową pakietu jest styl polski.sty, który dostarcza wszystkich (?) elementów potrzebnych do składu w języku polskim. Pozwala na stosowanie w różnych środowiskach, z polskimi wzorcami przenoszenia i bez, z polskimi czcionkami i bez. Posiada też możliwość upodobnienia się na poziomie komend w 99% do L^{A}MEXa. Jego szczegółowy opis znajduje się w następnym rozdziale.

W pakiecie PL^{A}TEX wykorzystane zostały wzorce przenoszenia wyrazów, których autorami są Hanna Kołodziejska, Marek Ryćko i Bogusław Jackowski. Sam kod stylu polskiego bazuje na kodzie zawartym w pakiecie MEX/L^{A}MEX autorstwa Marka Ryćko i Bogusława Jackowskiego.

1.2 Jak działa styl polski

Po załadowaniu stylu zmienione zostają wewnętrzne kody TEXa dla odnośnych liter polskiego alfabetu w Nowym Układzie (T1). Te zmiany pozwalają na definiowanie makrokomend, które mają w nazwie polskie litery, umożliwiają prawidłową zamianę liter małych na duże, a także pozwalają algorytmowi przenoszenia wyrazów traktować polskie litery jako litery. Następnie podjęte zostaje poszukiwanie polskich wzorców przenoszenia, które sprowadza się do sprawdzenia czy jest zdefiniowane makro “polish lub “l@polish. Pierwsze z nich jest definiowane w pliku hyphen.cfg dostarczonym z pakietem (a’la MEX), drugie zaś jest definiowane standardowo dla języka polskiego przez format Babel. Jeżeli makra (wzorce przenoszenia) nie zostaną znalezione, polski styl wypisuje na ekranie stosowne ostrzeżenie, jeżeli zostaną to są użyte do przełączenia wzorców przenoszenia na polskie.

W kolejnym kroku zdefiniowana zostaje notacja �ciachowa”. Notacja ta, wprowadzona w MEXu przez Ryćkę i Jackowskiego, pozwala na zapisywanie polskich liter w postaci dwóch znaków ciach oraz litera. Taki zapis pozwala na przesyłanie tekstów pocztą elektroniczną oraz na pracę w miejscach gdzie nie ma wbudowanego w system wsparcia dla języka polskiego (większość instalacji UNIXowych). Styl polski uzyskuje wszystkie polskie litery zdefiniowane w standardowym TEXu (tj. ó, ż czy ł) przy pomocy standardowych makr TEXa (tzn. np. “’o, “.z czy też “l), natomiast litery takie jak ą czy ę za pomocą standardowego makra L^{A}TEXowego “k. Cała dalsza łączność pomiędzy komendą ciach litera a wydrukowanym znakiem jest zapewnione poprzez definicje układów czcionek. To właśnie w tych plikach jest zdefiniowane, że np. w Starym Układzie (OT1) literę ó otrzymuje się przez złożenie akcentu ´ oraz litery o natomiast w Układach Nowym (T1) oraz Polskim (OT4) przez postawienie znaku o kodzie 161. Daje to dużą elastyczność i pozwala na bardzo łatwe użycie czcionek w dowolnym sensownym układzie. Do korzystania z czcionek pl zdefiniowany został nowy układ czcionek nazwany OT4. Szczegółowe informacje o funkcjonowania układów czcionek można znaleźć w plikach standardowej dystrybycji L^{A}TEXa ltoutenc.dtx oraz fntguide.tex.

Polski styl pozwala na skład z różnymi zestawami czcionek w różnych układach. Początkowy układ czcionek dokumentu może zostać wybrany przez dodanie do wywołania pakietu odpowiednich opcji (patrz 1.3) lub użycie standardowego stylu fontenc. Jeśli jednak nie zmieniono początkowego układu, polski styl próbuje odszukać w systemie plik ot4cmr.fd, zawierający L^{A}TEXowe opisy czcionek pl. Jeżeli taki plik zostanie znaleziony, czynione jest założenie, że w systemie zainstalowane są również same czcionki pl i styl sam zmienia początkowy układ na OT4. Jeśli plik nie zostanie odszukany, to układ pozostaje bez zmian.

Polski styl przedefiniowuje wszystkie napisy, które mogą pojawić się wygenerowane automatycznie przez L^{A}TEXa, takie jak: rozdział, spis treści itp. Zmieniona zostaje też definicja makra “date tak, aby data była drukowana po polsku. Ponieważ w niektórych sytuacjach na końcu daty pisze się całe słowo �roku”, czasami tylko samą literę �r.”, a czasami nic, wprowadzone zostało makro “PLdateending, które rozwija się zaraz za rokiem i w razie potrzeby może zostać łatwo przedefiniowane. Co więcej zachowanie makra “today można zmienić za pomocą następujących opcji pakietu: roku, r., noroku (ta ostatnia jest domyślna, więc domyślnie po numerze roku nie jest nic dodawane).

Dodatkowo styl definiuje makro “dywiz, które pozwala na poprawne przeniesienie wyrazów złożonych zapisanych jako biało“dywiz czerwony i dzielonych jako

biało- -czerwony.

Kolejny problem to pauzy (myślniki). Według polskich zwyczajów myślnik powinien być otoczony odstępami wielkości 2pt, oraz nie należy rozpoczynać wiersza tekstowego myślnikiem. Zalecenia te realizuje makro “pauza. Makro to zawiera w sobie potrzebne odstępy, należy więc go używać następująco:

Było zbyt ciemno“pauza powiedziała.

Uwaga: definicję tego makra traktujemy jako prowizoryczną. Może ulec zmianie!

W polskich zwyczajach typograficznych odstęp po kropce między zdaniami powinien być taki sam jak pomiędzy wyrazami w środku zdania, dlatego styl woła makro “frenchspacing.

Pewne zmiany dotyczą również matematyki. Najważniejszymi różnicami w składzie pomiędzy matematycznymi wydawnictwami polskimi i angielskojęzycznymi jest inny kształt znaków mniejsze-równe i większe-równe oraz inne skróty stosowane na oznaczenie tangensa, cotangensa i funkcji transcendentalnych. Zmianą kształtu znaków mniejsze-równe i większe-równe jest dokonywana wtedy, jeśli dostępne są matematyczne czcionki pl. Standardowo styl polski definiuje nowe makra “tg, “tgh, “ctg, “ctgh, “arc oraz “nwd a następnie — uwaga — zmienione zostają symbole drukowane przez standardowe makra L^{A}TEXa “tan, “cot, “tanh, “coth, “arcsin, “arccos, “arctan, “gcd. Dla pełności jest też definiowane makro “arccot, którego z tajemniczych przyczyn nie ma w wersji oryginalnej. Przedefiniowanie tych makr pozwala na cytowanie tych samych wzorów w pracy polskiej i angielskiej bez konieczności zmieniania ich zapisu. Standardowe symbole są zmieniane ponieważ L^{A}TEX (czy też TEX) dawno przestał być tylko systemem składu. Stał się obecnie językiem, w którym zapisywane są wzory matematyczne i jest bardzo ważne jest aby, jeśli jest to możliwe, nie zmieniać �standardu” zapisu tego języka, lecz co najwyżej dostosowywać sposób w jaki jest on prezentowany na wydruku.

1.3 Dołączenie polskiego stylu do dokumentu

Styl polski jest ładowany przez umieszczenie w preambule dokumentu zlecenia

“usepackage[opcje]–polski˝

Użycie w wywołaniu stylu opcji pozwala na dopasowanie jego zachowania do istniejącego środowiska i potrzeb.

OT1 świadomie nie chcemy zmieniać układu czcionek z układu podstawowego wbudowanego w L^{A}TEXa.

OT4 przełącza układ czcionek na polski (OT4). Oznacza to, że w dokumencie będą wykorzystane czcionki pl.

T1 zmienia układ czcionek na Nowy Układ Czcionek. Opcja jest wygodna np. w połączeniu z pakietem czcionek PostScriptowych w układzie T1.

QX zmienia układ czcionek na QX. Użyteczna przy składzie fontami produkcji JNS Team: QuasiTimes, QuasiSwiss, QuasiBookman itd.

plmath przełącza czcionki matematyczne na pl, tzn. przedefiniowuje alfabety matematyczne i zestawy symboli. Dodatkowo zmienia L^{A}TEXową definicję symboli większe-równe oraz mniejsze-równe.

nomathsymbols blokuje spolonizowanie przez styl znaczenia standardowych L^{A}TEXowych symboli określających funkcje trygonometryczne oraz relacje większe-równe i mniejsze-równe

prefixinginverb powoduje, że notacja prefiksowa nie jest wyłączana w obrębie środowiska verbatim i w argumencie polecenia “verb. (Domyślnie aktywna). noprefixinginverb powoduje, że notacja prefiksowa jest wyłączana w tych kon-

tekstach.

MeX jest to tryb 100% zgodności z MEXem. Ta opcja definiuje wszystkie makra, które są normalnie dostępne dla użytkownika w MEXu. Pozwala to na kompilację dokumentów MEXowych bez dokonywania żadnych zmian.

Jeżeli nie użyto żadnej z opcji wyboru układu fontów, polski.sty próbuje włączyć fonty PL, jeżeli są one zainstalowane. Dotyczy to zarówno fontów tekstowych, jak i matematycznych. W instalacji zawierającej fonty PL wywołanie pakietu bez opcji jest równoważne wywołaniu

“usepackage[OT4,plmath]–polski˝

Opcja OT1 służy do powiedzenia pakietowi, że użytkownik świadomie używa układu nie zawierającego kompletu znaków potrzebnych do składu po polsku.

Dalsza część dokumentu opisuje kod samego stylu oraz plików potrzebnych do instalacji czcionek polskich i wzorców przenoszenia w L^{A}TEXu. Dokumentacja jest w języku angielskim.

2 Source code of polski.sty

2.1 Writing banners

This package should work only with L^{A}TEX 2ε, so we make sure the appropriate message is displayed when another TEX format is used.

1 ⟨∗style⟩ 2 “NeedsTeXFormat–LaTeX2e˝ [1996/12/01]

Announce the name of the package to the world

3 “ProvidesPackage–polski˝ [2003/05/09 v1.3.1 Polish language package]

and write its banner on the display

4 “typeout–Document Language Style ‘polski’ v1.3.1 ¡2003/05/09¿˝

2.2 Category codes and all that

Here we will define the codes for Polish diacritical characters. There are several codes we need to set for each of them. The most important one is the category code (catcode), which identifies the character as a letter to TEX. Other codes to set are lowercase and uppercase equivalents (lccode and uccode) used to determine the proper character when lower and upper casing the string. These are now properly set in the kernel.

5 “@ifpackageloaded–inputenc˝ –“typeout–“space“space“space 6 Inputenc package detected. Catcodes not changed.˝ ˝ –% 7 “catcode‘“ˆ ˆ a1=11 %“lccode‘“ˆ ˆ a1=‘“ˆ ˆ a1 “uccode‘“ˆ ˆ a1=‘“ˆ ˆ 81 % a ogonek 8 “catcode‘“ˆ ˆ a2=11 %“lccode‘“ˆ ˆ a2=‘“ˆ ˆ a2 “uccode‘“ˆ ˆ a2=‘“ˆ ˆ 82 % c acute 9 “catcode‘“ˆ ˆ a6=11 %“lccode‘“ˆ ˆ a6=‘“ˆ ˆ a6 “uccode‘“ˆ ˆ a6=‘“ˆ ˆ 86 % e ogonek 10 “catcode‘“ˆ ˆ aa=11 %“lccode‘“ˆ ˆ aa=‘“ˆ ˆ aa “uccode‘“ˆ ˆ aa=‘“ˆ ˆ 8a % l crossed 11 “catcode‘“ˆ ˆ ab=11 %“lccode‘“ˆ ˆ ab=‘“ˆ ˆ ab “uccode‘“ˆ ˆ ab=‘“ˆ ˆ 8b % n acute 12 “catcode‘“ˆ ˆ f3=11 %“lccode‘“ˆ ˆ f3=‘“ˆ ˆ f3 “uccode‘“ˆ ˆ f3=‘“ˆ ˆ d3 % o acute 13 “catcode‘“ˆ ˆ b1=11 %“lccode‘“ˆ ˆ b1=‘“ˆ ˆ b1 “uccode‘“ˆ ˆ b1=‘“ˆ ˆ 91 % s acute 14 “catcode‘“ˆ ˆ bb=11 %“lccode‘“ˆ ˆ bb=‘“ˆ ˆ bb “uccode‘“ˆ ˆ bb=‘“ˆ ˆ 9b % z dot 15 “catcode‘“ˆ ˆ b9=11 %“lccode‘“ˆ ˆ b9=‘“ˆ ˆ b9 “uccode‘“ˆ ˆ b9=‘“ˆ ˆ 99 % z acute

Now the same for uppercase letters.

16 “catcode‘“ˆ ˆ 81=11 %“lccode‘“ˆ ˆ 81=‘“ˆ ˆ a1 “uccode‘“ˆ ˆ 81=‘“ˆ ˆ 81 % A ogonek 17 “catcode‘“ˆ ˆ 82=11 %“lccode‘“ˆ ˆ 82=‘“ˆ ˆ a2 “uccode‘“ˆ ˆ 82=‘“ˆ ˆ 82 % C accute 18 “catcode‘“ˆ ˆ 86=11 %“lccode‘“ˆ ˆ 86=‘“ˆ ˆ a6 “uccode‘“ˆ ˆ 86=‘“ˆ ˆ 86 % E ogonek 19 “catcode‘“ˆ ˆ 8a=11 %“lccode‘“ˆ ˆ 8a=‘“ˆ ˆ aa “uccode‘“ˆ ˆ 8a=‘“ˆ ˆ 8a % L crossed 20 “catcode‘“ˆ ˆ 8b=11 %“lccode‘“ˆ ˆ 8b=‘“ˆ ˆ ab “uccode‘“ˆ ˆ 8b=‘“ˆ ˆ 8b % N accute 21 “catcode‘“ˆ ˆ d3=11 %“lccode‘“ˆ ˆ d3=‘“ˆ ˆ f3 “uccode‘“ˆ ˆ d3=‘“ˆ ˆ d3 % O acute 22 “catcode‘“ˆ ˆ 91=11 %“lccode‘“ˆ ˆ 91=‘“ˆ ˆ b1 “uccode‘“ˆ ˆ 91=‘“ˆ ˆ 91 % S acute 23 “catcode‘“ˆ ˆ 9b=11 %“lccode‘“ˆ ˆ 9b=‘“ˆ ˆ bb “uccode‘“ˆ ˆ 9b=‘“ˆ ˆ 9b % Z dot 24 “catcode‘“ˆ ˆ 99=11 %“lccode‘“ˆ ˆ 99=‘“ˆ ˆ b9 “uccode‘“ˆ ˆ 99=‘“ˆ ˆ 99 % Z acute 25 ˝

We finish by setting space factor codes (sfcode) for uppercase letters. When French spacing is turned off, TEX treats interword spacing after full stop in a special manner. If the last character before the period is lowercase letter then TEX assumes it is the end of the sentence, and makes the space wider (and more stretchable). However, if the last letter is uppercase, then TEX assumes it is an abbreviation and doesn’t widen the space. (This is not the whole truth. Consult the TEXbook pages 285–287 for details.) We set sfcode for Polish capital letters.

26 “sfcode‘“ˆ ˆ 81=999 % A ogonek 27 “sfcode‘“ˆ ˆ 82=999 % C acute 28 “sfcode‘“ˆ ˆ 86=999 % E ogonek 29 “sfcode‘“ˆ ˆ 8a=999 % L crossed 30 “sfcode‘“ˆ ˆ 8b=999 % N acute 31 “sfcode‘“ˆ ˆ d3=999 % O acute 32 “sfcode‘“ˆ ˆ 91=999 % S acute 33 “sfcode‘“ˆ ˆ 9b=999 % Z dot 34 “sfcode‘“ˆ ˆ 99=999 % Z acute

This provides for “mathit and friends to work correctly for Polish characters (when used with TCX).

35 “DeclareMathSymbol–ˆ ˆ a1˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ a1˝ 36 “DeclareMathSymbol–ˆ ˆ a2˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ a2˝ 37 “DeclareMathSymbol–ˆ ˆ a6˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ a6˝ 38 “DeclareMathSymbol–ˆ ˆ aa˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ aa˝ 39 “DeclareMathSymbol–ˆ ˆ ab˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ ab˝ 40 “DeclareMathSymbol–ˆ ˆ f3˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ f3˝ 41 “DeclareMathSymbol–ˆ ˆ b1˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ b1˝ 42 “DeclareMathSymbol–ˆ ˆ bb˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ bb˝ 43 “DeclareMathSymbol–ˆ ˆ b9˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ b9˝ 44 “DeclareMathSymbol–ˆ ˆ 81˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 81˝ 45 “DeclareMathSymbol–ˆ ˆ 82˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 82˝ 46 “DeclareMathSymbol–ˆ ˆ 86˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 86˝ 47 “DeclareMathSymbol–ˆ ˆ 8a˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 8a˝ 48 “DeclareMathSymbol–ˆ ˆ 8b˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 8b˝ 49 “DeclareMathSymbol–ˆ ˆ d3˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ d3˝ 50 “DeclareMathSymbol–ˆ ˆ 91˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 91˝ 51 “DeclareMathSymbol–ˆ ˆ 9b˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 9b˝ 52 “DeclareMathSymbol–ˆ ˆ 99˝ –“mathalpha˝ –letters˝ –‘ˆ ˆ 99˝

2.3 Hyphenation

“selecthyphenation Here we define the hyphenation selecting operator. If a set of hyphenation patterns for a particular language is unavaiable, hyphenation in that language is turned off. For that we use following trick: a new language is allocated with no hyphenation patterns. Then switching to this language effectively switches hyphenation off (many thanks to Marek Ryćko).

53 “ifx“l@nohyphenation“@undefined 54 “newlanguage“l@nohyphenation 55 “fi 56 “def“selecthyphenation#1–% 57 “expandafter“ifx“csname l@#1“endcsname“relax 58 “PackageError–polski˝ –No hyphenation patterns for language ‘#1’˝ 59 –Hyphenation in this language will be disabled.˝ % 60 “selecthyphenation–nohyphenation˝ % 61 “else 62 “language“csname l@#1“endcsname 63 “fi 64 ˝

We try to switch to polish hyphenation patterns looking either for patterns name used by hyphen.cfg from old versions of PL^{A}TEX bundle or for new Babellike name.

65 “ifx“polish“undefined 66 “selecthyphenation–polish˝ 67 “else 68 “language“polish 69 “fi 70 “lefthyphenmin=2 71 “righthyphenmin=2

2.4 Slash notation

The slash notation was introduced in the macro package LEX by Bogusław Jackowski and Marek Ryćko. It has been used since then in many places and became Polish TEX User’s Group GUST “standard”. What follows is the implementation of active slash or Polish slash macro.

“Slash We start by storing slash character (catcode 12 meaning ¡other¿) in apropriately named macro.

72 “def“Slash–/˝

“PLSlash Now we define macro “PLSlash which will actually be used in input files to access polish letters. It does not need to be robust. If it is, it breaks kerns (pointed out by Marcin Woliński).

73 “def“PLSlash#1–%

The first thing we do is to check whether the slash character is followed by an allowed character. The first test is for the second slash (or macro “PLSlash), in which case we just return slash character with category code ¡other¿.

74 “ifx#1“PLSlash 75 “ifx“protect“@typeset@protect“else“protect“string“fi“Slash 76 “else

If it was not a slash we test for a letter. We assume that there are defined macros which expand to the current definitions of Polish letters. We will give them names “PLSlash@¡character¿, so now we look if it is defined. If comparison with “relax is true the macro is not defined. We issue an error message with some help.

77 “expandafter “ifx “csname PLSlash@“string#1“endcsname “relax 78 “PLSlash@error#1% 79 “else

If we got here, we can now expand polish character. However, we do that after completing all “ifs.

80 “expandafter“expandafter“expandafter“PLSlash@letter 81 “expandafter“expandafter“expandafter#1% 82 “fi 83 “fi 84 ˝

85

86 “def“PLSlash@error#1–“PackageError–polski˝ –% 87 Illegal pair of characters /“noexpand#1 occurred˝ –% 88 Only a character from the set [acelnosxzACELNOSXZ,’¡¿/-] 89 can appear after “Slash.“MessageBreak 90 Proceed, I will omit both “Slash“ and the character following it.“MessageBreak 91 You can also correct your mistake NOW, typing I followed by“MessageBreak 92 whatever should be in the place of the offending pair.˝ ˝

“PlPrIeC This macro is needed to protect against removing white space in TOC by Polish characters that have definition ending with a macro call (“l and “L). The macro is identical to “IeC from inputenc package, but we have to define it here not to depend on inputenc. The name is different not to cause conflict in case inputenc is loaded after plprefix.

93 “def“PlPrIeC–% 94 “ifx“protect“@typeset@protect 95 “expandafter“@firstofone 96 “else 97 “noexpand“PlPrIeC 98 “fi 99 ˝

“PLSlash@letter This macro is very simple: it just invokes another macro with some wild name.

100 “def“PLSlash@letter#1–“csname PLSlash@#1“endcsname˝

Next come the definitions of all Polish diacritics and special symbols. For each “slashed” character we define a macro expanding to its proper definition. Polish characters are defined as normal accented letters, and we expect that they will expand according to their definitions in the current font encoding. This allows us to use the same slash notation with any (decent) font encoding. For example T1 and OT4 encodings will use letters, but OT1 will do what it can —ie. insert simple accented characters (with a and e left untouched). For more information on the work of encoding engine consult L^{A}TEX file ltoutenc.dtx.

The following macro is just a helper which will be undefined after use.

101 “def“PL@accent@def#1#2–% 102 “expandafter“def “csname PLSlash@“string #1“endcsname–#2˝ ˝

The real definition will take place at the beginning of the document. This is small optimization. We assume that the encoding at this stage is what will be default for the rest of the document. If document starts in OT1 encoding we warn user that he can loose some information from the printout.

103 “PL@accent@def–a˝ –“k a˝ 104 “PL@accent@def–c˝ –“@tabacckludge’c˝ 105 “PL@accent@def–e˝ –“k e˝ 106 “PL@accent@def–l˝ –“PlPrIeC–“l˝ ˝ 107 “PL@accent@def–n˝ –“@tabacckludge’n˝ 108 “PL@accent@def–o˝ –“@tabacckludge’o˝ 109 “PL@accent@def–s˝ –“@tabacckludge’s˝ 110 “PL@accent@def–x˝ –“@tabacckludge’z˝ 111 “PL@accent@def–z˝ –“.z˝ 112 “PL@accent@def–A˝ –“k A˝ 113 “PL@accent@def–C˝ –“@tabacckludge’C˝ 114 “PL@accent@def–E˝ –“k E˝ 115 “PL@accent@def–L˝ –“PlPrIeC–“L˝ ˝ 116 “PL@accent@def–N˝ –“@tabacckludge’N˝ 117 “PL@accent@def–O˝ –“@tabacckludge’O˝ 118 “PL@accent@def–S˝ –“@tabacckludge’S˝ 119 “PL@accent@def–X˝ –“@tabacckludge’Z˝ 120 “PL@accent@def–Z˝ –“.Z˝ 121 “PL@accent@def–¡˝ –“PlPrIeC–“guillemotleft˝ ˝ 122 “PL@accent@def–¿˝ –“PlPrIeC–“guillemotright˝ ˝ 123 “PL@accent@def–,˝ –“PlPrIeC–“quotedblbase˝ ˝ 124 “PL@accent@def–’˝ –“PlPrIeC–“textquotedblright˝ ˝ 125 “PL@accent@def–-˝ –“PlPrIeC–“dywiz˝ ˝ 126 % 127 “let “PL@accent@def “undefined

“prefixing The last touch is the definition of the “prefixing macro which activates the slash, but only if plprefix package was’t loaded before. We manage prefixing flag “pr@fix for compatibility with MEX.

128 “@ifpackageloaded–plprefix˝ –˝ –% 129 “def“prefixing–“catcode‘/=“active 130 “bgroup “uccode‘“˜ =‘/ “uppercase–“egroup “let˜ “PLSlash˝ % 131 “let“pr@fix=T˝

“nonprefixing and “nonprefixing macro which deactivates the slash.

132 “def“nonprefixing–“catcode‘/=12 “let“pr@fix=F˝ 133 ˝

2.5 Maths in Polish

The next few macros are provided to typeset maths in Polish. “arc In Polish, transcendental functions are written with a tiny space after arc or

ar. Here we define macro “arc which when followed by eg. “sin typesets arc sin.

134 “def“arc#1–“mathop–“operator@font 135 arc“thinspace“escapechar-1 “string#1˝ “nolimits˝ 136 “def“ar#1–“mathop–“operator@font 137 ar“thinspace“escapechar-1 “string#1˝ “nolimits˝

“tg We also use different abbreviations for tangent and cotangent.

“tgh “ctg “ctgh 138 “def“tg–“mathop–“operator@font tg˝ “nolimits˝ 139 “def“ctg–“mathop–“operator@font ctg˝ “nolimits˝ 140 “def“tgh–“mathop–“operator@font tgh˝ “nolimits˝ 141 “def“ctgh–“mathop–“operator@font ctgh˝ “nolimits˝ 142 “def“nwd–“mathop–“operator@font nwd˝ ˝

Finally we take a drastic step and redefine L^{A}TEX’s definitions of mathematical functions. This will allow us to keep the markup independent of the language in which the document is typeset. We think that this is very important, because TEX is today much more than just a typesetting tool, it is also a language which is used to exchange mathematical formulæ. Redefinition will be suppressed when option nomathsnames is used.

143 “def“PL@redef@funcnames–% 144 “let“tan=“tg “let“cot=“ctg 145 “let“tanh=“tgh “let“coth=“ctgh 146 “def“arcsin–“arc“sin˝ 147 “def“arccos–“arc“cos˝ 148 “def“arctan–“arc“tg˝ 149 “def“arccot–“arc“ctg˝ 150 “let“gcd“nwd 151 ˝

These redefinitions should be supplemented by appropriate greater-than-or-equal and less-than-or-equal symbols. They are introduced by the plmath option or autodetection, when we are sure we have those symbols available in our fonts.

2.6 Dashes

“dywiz When a Polish compound word is split at the hyphen, it should be typeset with two hyphens: one at the end of line and the second at the beginning of the new line. We provide macro “dywiz which gives proper hyphenation of compound words. Kerns before and after “discretionary allow both parts of the word to be considered for hyphenation.

152 “def“dywiz–“kern0sp“discretionary–-˝ –-˝ –-˝ “penalty10000“hskip0sp“relax˝

“pauza Polish typographical rules require to put a fixed space of .2em around dashes and forbid breaking a line before a dash.

153 “newcommand*“pauza–“unskip“kern.2em“textemdash“hskip.2em“ignorespaces˝ 154 “newcommand*“ppauza–“unskip“kern.2em“textendash“hskip.2em“ignorespaces˝

2.7 Teaching L^{A}TEX to speak Polish

In early versions of L^{A}TEX there were problems when one wanted to customize predefined texts which were inserted automatically by L^{A}TEX(such as Bibliography or Chapter). They were all hidden deep in the definitions of sectioning or other commands. Now they are all defined as simple macros which can easily be redefined in language packages. We will do that here.

155 “def“prefacename–Przedmowa˝ 156 “def“refname–Literatura˝ 157 “def“abstractname–Streszczenie˝ 158 “def“bibname–Bibliografia˝ 159 “def“chaptername–Rozdzia“PLSlash l˝ % uppercasing in running head must work 160 “def“appendixname–Dodatek˝ 161 “def“contentsname–Spis tre“’sci˝ 162 “def“listfigurename–Spis rysunk“’ow˝ 163 “def“listtablename–Spis tabel˝ 164 “def“indexname–Skorowidz˝ 165 “def“figurename–Rysunek˝ 166 “def“tablename–Tabela˝ 167 “def“partname–Cz“k e“’s“’c˝ 168 “def“enclname–Za“l“k aczniki˝ 169 “def“ccname–Do wiadomo“’sci˝ 170 “def“headtoname–Do˝ 171 “def“pagename–Strona˝ 172 “def“seename–zob.˝ 173 “def“proofname–Dow“’od˝

“today Finally we redefine the macro “today to print the current date in Polish. In Polish documents in some situations it is more appropriate to use the full word roku (meaning year) at the end of the date and sometimes it is more natural to use an abbreviation. The macro “PLdateending which expands at the end of the date can be easily redefined to suit particular needs.

174 “def“today–“number“day˜ “ifcase“month“or 175 stycznia“or lutego“or marca“or kwietnia“or maja“or czerwca“or 176 lipca“or sierpnia“or wrze“’snia“or pa“’zdziernika“or 177 listopada“or grudnia“fi “space“number“year “PLdateending˝

2.8 Macros needed later

This macro redefines all standard maths fonts. Now pl maths fonts will be used instead of cm maths fonts.

178 “def“PL@setmaths–%

We start by leaving sign that we have fonts avaiable to redefine “ge and “le macros.

179 “def“PLm@ths–˝

We redefine math alphabets for both math versions. We don’t have to redefine “mathrm, “mathnormal or “mathcal alphabets, as they bound to operators, letters and symbols fonts by default (see fontdef.dtx.

We must define OT4 encoding if it is not defined yet.

180 “@ifundefined–T@OT4˝ –% 181 “input ot4enc.def 182 ˝ –˝ 183 “SetMathAlphabet–“mathbf˝ –normal˝ –OT4˝ –cmr˝ –bx˝ –n˝ 184 “SetMathAlphabet–“mathsf˝ –normal˝ –OT4˝ –cmss˝ –m˝ –n˝ 185 “SetMathAlphabet–“mathit˝ –normal˝ –OT4˝ –cmr˝ –m˝ –it˝ 186 “SetMathAlphabet–“mathtt˝ –normal˝ –OT4˝ –cmtt˝ –m˝ –n˝

We set math alphabets for bold version.

187 “SetMathAlphabet–“mathsf˝ –bold˝ –OT4˝ –cmss˝ –bx˝ –n˝ 188 “SetMathAlphabet–“mathit˝ –bold˝ –OT4˝ –cmr˝ –bx˝ –it˝

We redeclare all standard symbol fonts. We change the definition of “@font@warning macro to not to scare the user with warning messages on the screen about encoding change.

189 “bgroup“let“@font@warning“@font@info

190  “SetSymbolFont–operators˝  –normal˝ –OT4˝ –cmr˝ –m˝ –n˝
191  “SetSymbolFont–letters˝  –normal˝ –OML˝ –plm˝ –m˝ –it˝
192  “SetSymbolFont–symbols˝  –normal˝ –OMS˝ –plsy˝ –m˝ –n˝

193 “SetSymbolFont–largesymbols˝ –normal˝ –OMX˝ –plex˝ –m˝ –n˝

194  “SetSymbolFont–operators˝  –bold˝ –OT4˝ –cmr˝ –bx˝ –n˝
195  “SetSymbolFont–letters˝  –bold˝ –OML˝ –plm˝ –b˝ –it˝
196  “SetSymbolFont–symbols˝  –bold˝ –OMS˝ –plsy˝ –b˝ –n˝

197 “egroup

As we have just reloaded the maths fonts, we have some new symbols available. We redefine greater-than-or-equal and less-than-or-equal signs to conform to Polish typographical conventions. This is by analogy with that which was done in section 2.5. Redefinition will be suppressed when option nomathsnames is used.

198 “DeclareMathSymbol–“xleq˝ –3˝ –symbols˝ –172˝ 199 “DeclareMathSymbol–“xgeq˝ –3˝ –symbols˝ –173˝ 200 ˝ 201 % 202 “def“PL@redef@relations– 203 “let“leq=“xleq 204 “let“geq=“xgeq 205 “let“le=“leq 206 “let“ge=“geq 207 ˝

2.9 Options

Style polski provides a number of options which customize it to the specific environment or needs. They switch L^{A}TEX to different encodings, provide additional macros, etc.

2.9.1 Option plmath

This option redefines all standard maths fonts. Now pl maths fonts will be used instead of cm maths fonts.

208 “DeclareOption–plmath˝ –% 209 “PL@setmaths 210 ˝

2.9.2 Option nomathsymbols

This option supresses redefinition of standard L^{A}TEX’s macros for trigonometric functions and for less-or-equal signs.

211 “DeclareOption–nomathsymbols˝ –% 212 “def“PLn@m@thsn@mes–˝ 213 ˝

2.9.3 Option MeX

This mode should prepare everything to be markup compatible with L^{A}MEX. This includes macron redefinition.

214 % “changes–v1.2.2˝ –2001/08/31˝ –Redefinition of macron was too early. OT4 215 % may be not known yet.˝ 216 “DeclareOption–MeX˝ –% 217 “AtBeginDocument–% 218 “@ifundefined–T@OT1˝ –˝ –% 219 “DeclareTextCommand–“=˝ –OT1˝ –“dywiz˝ % 220 “DeclareTextAccent–“macron˝ –OT1˝ –22˝ ˝ % 221 “@ifundefined–T@T1˝ –˝ –% 222 “DeclareTextCommand–“=˝ –T1˝ –“dywiz˝ % 223 “DeclareTextAccent–“macron˝ –T1˝ –9˝ ˝ % 224 “@ifundefined–T@OT4˝ –˝ –% 225 “DeclareTextCommand–“=˝ –OT4˝ –“dywiz˝ % 226 “DeclareTextAccent–“macron˝ –OT4˝ –22˝ ˝ % 227 “@ifundefined–T@QX˝ –˝ –% 228 “DeclareTextCommand–“=˝ –QX˝ –“dywiz˝ % 229 “DeclareTextAccent–“macron˝ –QX˝ –9˝ ˝ % 230 ˝ % 231 “let“xle“xleq 232 “let“xge“xgeq 233 “let“polish“l@polish 234 “let“english“l@english 235 “def“MeX–M“kern-.111em“lower.6ex“hbox–E˝ “kern-.075emX˝ 236 “DeclareRobustCommand“LaMeX–% after latex.dtx 237 L“kern-.36em 238 –“setbox0“hbox–T˝ % 239 “vbox to“ht0–“hbox–% 240 “csname S@“f@size“endcsname 241 “fontsize“sf@size“z@ 242 “math@fontsfalse“selectfont 243 A˝ 244 “vss˝ % 245 ˝ % 246 “kern-.15em 247 “MeX“@˝ % 248 ˝

2.9.4 Option T1

This will select T1 encoding for the document.

249 “DeclareOption–T1˝ –% 250 “@ifundefined–T@T1˝ –“input–t1enc.def˝ ˝ –˝ 251 “def“encodingdefault–T1˝ “fontencoding–T1˝ % 252 “def“PL@ncodingd@fined–˝ 253 ˝

2.9.5 Option QX

This will select QX encoding for the document.

254 “DeclareOption–QX˝ –% 255 “@ifundefined–T@QX˝ –“input–qxenc.def˝ ˝ –˝ 256 “def“encodingdefault–QX˝ “fontencoding–QX˝ % 257 “def“PL@ncodingd@fined–˝ 258 ˝

2.9.6 Option OT1

This will select OT1 encoding for the document.

259 “DeclareOption–OT1˝ –% 260 “def“encodingdefault–OT1˝ “fontencoding–OT1˝ % 261 “def“PL@ncodingd@fined–˝

2.9.7 Option OT4

This will select OT4 encoding for the document.

263 “DeclareOption–OT4˝ –% 264 “@ifundefined–T@OT4˝ –“input–ot4enc.def˝ ˝ –˝ % 265 “def“encodingdefault–OT4˝ % 266 “fontencoding–OT4˝ % 267 “def“PL@ncodingd@fined–˝ % 268 ˝

2.9.8 Options for prefixing in verbatim

These decide if prefixing is active in verbatim:

269 “DeclareOption–prefixinginverb˝ –% 270 “def“PL@prefixinginverb–1˝ % 271 ˝ 272 “DeclareOption–noprefixinginverb˝ –% 273 “def“PL@prefixinginverb–0˝ % 274 ˝

2.9.9 Options for date ending in “today

275 “DeclareOption–roku˝ –% 276 “def“PLdateending–“nobreakspace roku˝ 277 ˝ 278 “DeclareOption–r.˝ –% 279 “def“PLdateending–“nobreakspace r.˝ 280 ˝ 281 “DeclareOption–noroku˝ –% 282 “def“PLdateending–˝ 283 ˝

2.10 Taking off …

This is almost the end. We process all the options in the order of their definition and switch to french spacing which is also Polish traditional spacing.

284 “ExecuteOptions–prefixinginverb,noroku˝ 285 “ProcessOptions 286 “frenchspacing

We now try to autodetect whether the pl fonts reside on the system. We assume, that if there is OT4cmr.def file on the system, there are also fonts installed. The autodetection is suppressed if any encoding was switched by package options, or redefined before the package was loaded.

287 “def“tempa–OT1˝ 288 “ifx“tempa“f@encoding 289 “@ifundefined–PL@ncodingd@fined˝ –% 290 “IfFileExists–ot4cmr.fd˝ –% 291 “typeout–“space“space“space 292 Switching to Polish text encoding and Polish maths fonts.˝ 293 “@ifundefined–T@OT4˝ –% 294 “input ot4enc.def 295 ˝ –˝ % 296 “def“encodingdefault–OT4˝ 297 “fontencoding–OT4˝ “selectfont 298 “PL@setmaths 299 ˝ –% 300 “typeout–“space“space“space 301 Can’t locate Polish fonts. Will use default encoding.˝ 302 ˝ %

We set a checkpoint to warn the user if she enters the document in OT1 encoding.

303 “def“@PL@OT@check–% 304 “bgroup 305 “def“tempa–OT1˝ “ifx“tempa“cf@encoding 306 “@ifpackageloaded–ot1patch˝ –˝ –% 307 “PackageError–polski˝ –% 308 Zaczynasz skladac dokument uzywajac oryginalnych“MessageBreak 309 czcionek TeXa. Czcionki te nie maja kompletu polskich“MessageBreak 310 znakow. W zwiazku z tym LaTeX bedzie zglaszal bledy.“MessageBreak 311 “MessageBreak 312 Zainstaluj czcionki z dystrybucji MeXa dostepne“MessageBreak 313 na ftp://ftp.gust.org.pl, sprobuj uzyc czcionek EC“MessageBreak 314 dodajac opcje T1 do wywolania stylu polski’ego“MessageBreak 315 lub w ostatecznosci uzyj stylu ot1patch.˝ –˝ ˝ % 316 “fi 317 “egroup 318 “let“@PL@OT@check=“undefined˝ % 319 “AtBeginDocument–“@PL@OT@check˝ % 320 ˝ –% 321 “let“PL@ncodingd@fined=“undefined 322 ˝ % 323 “fi

Now we can redefine L^{A}TEXnames for some maths functions and relations if it was not suppressed.

324 “@ifundefined–PLn@m@thsn@mes˝ – 325 “PL@redef@funcnames 326 “@ifundefined–PLm@ths˝ –˝ –“PL@redef@relations˝ 327 ˝ –˝

If prefixing is not to be active in verb, we have to add slash to “dospecials:

328 “if 0“PL@prefixinginverb 329 “expandafter“def“expandafter“dospecials“expandafter–“dospecials“do“/˝ 330 “fi

Cleaning up and undefining some local macros.

331 “let“PLn@m@thn@mes=“undefined 332 “let“PLm@ths=“undefined 333 “let“PL@setmaths=“undefined 334 “let“PL@redef@relations=“undefined 335 “let“PL@redef@funcnames=“undefined 336 “let“PL@prefixinginverb=“undefined 337 ⟨/style⟩

3 Configuring L^{A}TEX’s hyphenation patterns

(This section was written by Marcin Woliński. He is to be blamed for errors.) This code will go to file hyphen.cfg which, if found, will be read by IniTEX during format generation instead of the standard L^{A}TEX hyphenation patterns configuration.

First we have to adjust language allocation counter (“count19) since kernel (incorrectly) causes “newlanguage to start allocation from 1.

338 ⟨∗hyphenation⟩ 339 “global“count19=-1

The rest of actions is put into a group, so our auxiliary macros will automatically disappear when they are no longer needed. Allocations done by “newlanguage are global and so are “patterns and “hyphenation.

340 “begingroup

Here I define a few auxiliary macros needed to process language.dat. Every time TEX sees a new name he puts it into his name pool and it is never freed. For that reason I don’t want to introduce new names for my auxiliary macros. So my first idea was to use control sequences of length 1 (which are not put into the pool). But this approach is risky since “hyphenation files” commonly contain small pieces of code to adjust their behaviour to format or TEX version used. So I’ve decided to redefine locally a few of standard L^{A}TEX macros. This causes code to be less readable, but I’ll try to make these names somehow mnemonic. (I’ve chosen macros which contribute directly to the current page, which means for sure they’re not used by hyphenation files.)

“@stopline will be used as a sentinel delimiting line end.

341 “def“@stopline–“@stopline˝

“line is main macro processing line read from language.dat. The line is passed to “line as argument with a space and “@stopline appended. “line checks if the line starts with = (synonym definition) and based on that passes the line to “leftline or “rightline.

342 “def“line#1#2“@stopline–% 343 “ifx=#1% 344 “leftline#2“@stopline 345 “else 346 “rightline#1#2“@stopline 347 “fi 348 ˝

“leftline is called for synonym lines (with = removed). Such lines should contain only a name for the synonym. So “leftline first checks if there is anything after the name and raises and error.

349 “def“leftline#1 #2“@stopline–% 350 “ifx“@stopline#2“@stopline“else 351 “errhelp–The line should contain only an equals sign followed by 352 the synonym name.˝ % 353 “errmessage–Extra stuff on a synonym line in language.dat:ˆ ˆ J 354 =#1 #2˝ “fi

Next check if the language name wasn’t already used:

355 “expandafter“ifx“csname l@#1“endcsname“relax “else 356 “errhelp–This probably means your ‘‘language.dat’’ contains many 357 lines starting with ‘#1’ or ‘=#1’. ˆ ˆ JThe language ‘#1’ will 358 be redefined. This may not be what you want.˝ % 359 “errmessage–Language ‘#1’ already defined˝ “fi

Synonyms make no sense when no real language was defined yet. This is checked next. If “count19 is −1 an error is raised and no definition takes place.

360 “ifnum“count19=“m@ne 361 “errhelp–You cannot put synonyms before first real 362 language definition in language.dat.˝ 363 “errmessage–Cannot define ‘#1’ as a language synonym: no language 364 defined yet˝ % 365 “else

Finally the real definition takes place: l@¡language¿ is defined with “chardef to be last allocated language number.

366 “global“expandafter“chardef“csname l@#1“endcsname“count19 367 “wlog–“string“l@#1=“string“language“number“count19˝ 368 “fi 369 ˝

“rightline processes lines that don’t start with =. Such lines instruct iniTEX to read one or more hyphenation files.

The line is split on first space, #1 being language name, #2 list of file names. Note that there is at least one space in input line since we’ve put one just before “@stopline.

370 “def“rightline#1 #2“@stopline–%

First check if the language is already defined. If the language name is new it is allocated.

371 “expandafter“ifx“csname l@#1“endcsname“relax 372 “expandafter“newlanguage“csname l@#1“endcsname 373 “else 374 “errhelp–This probably means your ‘‘language.dat’’ contains many 375 lines starting with ‘#1’ or ‘=#1’. ˆ ˆ JThe patterns will be 376 merged with the ones already loaded. This may not be what you 377 want.˝ % 378 “errmessage–Language ‘#1’ already defined˝ % 379 “fi

Then the language is set as current to begin loading of hyphenation patterns.

380 “language“csname l@#1“endcsname

The language name is added to the list of defined languages kept in “displaylines.

381 “edef“displaylines–“displaylines, #1˝ %

For every language there should be at least one patterns file specified. So if #2 is empty we raise an error.

382 “ifx“@stopline#2“@stopline 383 “errhelp–Hyphenation will be inhibited in language ‘#1’.˝ % 384 “errmessage–No pattern files specified for language ‘#1’˝ %

Now “centerline processes list of file names delimited with “@stopline.

385 “else 386 “begingroup 387 “message–Loading hyphenation patterns for #1.˝ 388 “centerline#2“@stopline 389 “endgroup 390 “fi 391 ˝

Macro “centerline calls itself recursively until no file name remains on input line. For each name it tries to load the file. Absence of file is considered to be a fatal error.

392 “def“centerline#1 #2“@stopline–% 393 “InputIfFileExists–#1˝ –˝ –% 394 “errhelp–Your language.dat file says I should load a file named 395 ‘#1’.ˆ ˆ J Check whether this name is correct and the file is 396 installed. ˆ ˆ JThe format will not be generated.˝ % 397 “errmessage–Fatal error: patterns file #1 not found˝ % 398 “endgroup“endgroup“@@end˝ 399 “ifx“@stopline#2“@stopline“else “centerline#2“@stopline“fi 400 ˝

“addvspace This macro is used to ensure that the line from language.dat ends with exactly one space character.

401 “def“addvspace #1 “*#2“@stopline–% 402 “ifx“@stopline#2“@stopline 403 “expandafter“def“expandafter“*“expandafter–“* ˝ % 404 “fi 405 ˝

With these auxiliaries we can start actual processing. First the existence of file language.dat is checked and the file is opened.

406 “openin1 = language.dat 407 “ifeof1 408 “errhelp–You should have a file named language.dat on your system. 409 This file specifies for what languages hyphenation patterns should 410 be loaded and where these are kept. Without this file the format 411 will not be generated.˝ % 412 “errmessage–Fatal error: language.dat not found˝ % 413 “endgroup“@@end 414 “fi

“displaylines is initialized in such a way that language list won’t contain starting comma:

415 “let“displaylines“@gobble

Now lines from language.dat are read one by one. “endlinechar is set to −1 to avoid a space that may get on the end of input line. But after a line is read “endlinechar is reset again since code in patterns files may be fragile to such a condition.

416 “loop 417 “endlinechar“m@ne 418 “read1 to “*% 419 “endlinechar‘“ˆ ˆ M

Empty lines are skipped and others are passed to “line with appended single space and the sentinel. Line is read to “*. This is safe since this macro is only used locally here, and normal value of “* is of no use for hyphenation files.

420 “ifx“*“empty 421 “else 422 “expandafter“addvspace“*“* “*“@stopline 423 “expandafter“line“*“@stopline 424 “fi

Processing takes place until end of language.dat is found.

425 “ifeof1“else 426 “repeat 427 “closein1

Now another sanity check is made: any reasonable language.dat should contain at least one language definition. So we refuse to generate format without any hyphenation patterns.

428 “ifnum“count19=-1 429 “errhelp–Your language.dat does not instruct LaTeX to load any 430 hyphenation patterns. Since format with no hyphenation patterns 431 is hardly usable I refuse to generate it. Check your language.dat 432 and try again.˝ % 433 “errmessage–Fatal error: No languages defined in language.dat˝ % 434 “endgroup“@@end 435 “fi

Then code to display list of loaded languages is added to “everyjob and the group ends.

436 “edef“displaylines–“the“everyjob 437 “noexpand“wlog–Loaded hyphenation patterns for“displaylines.˝ ˝ 438 “global“everyjob“expandafter–“displaylines˝ 439 “endgroup 440 “language0 441 “lefthyphenmin=2 “righthyphenmin=3 442 ⟨/hyphenation⟩

4 Font encoding OT4

Here we define a new encoding. Its main purpose is to provide the link between standard accents such as “’,“. or “k (ogonek), and the corresponding characters in the font. Jackowski’s fonts will be called cms and ccs in this encoding.

443 ⟨∗encoding⟩ 444 “ProvidesFile–ot4enc.def˝ [2003/05/09 v1.3.1 Output encoding for polish fonts]

Declare the encoding.

445 “DeclareFontEncoding–OT4˝ –˝ –˝

Declare the accents.

446 “DeclareTextAccent–“”˝ –OT4˝ –127˝ 447 “DeclareTextAccent–“’˝ –OT4˝ –19˝ 448 “DeclareTextAccent–“.˝ –OT4˝ –95˝ 449 “DeclareTextAccent–“=˝ –OT4˝ –22˝ 450 “DeclareTextAccent–“ˆ ˝ –OT4˝ –94˝ 451 “DeclareTextAccent–“‘˝ –OT4˝ –18˝ 452 “DeclareTextAccent–“˜ ˝ –OT4˝ –126˝ 453 “DeclareTextAccent–“H˝ –OT4˝ –125˝ 454 “DeclareTextAccent–“u˝ –OT4˝ –21˝ 455 “DeclareTextAccent–“v˝ –OT4˝ –20˝ 456 “DeclareTextAccent–“r˝ –OT4˝ –23˝

The ogonek accent is available only under a e A & E. But we have to provide some definition for “k. Some accents have to be built by hand as in OT1:

457 “DeclareTextCommand–“k˝ –OT4˝ [1]–% 458 “TextSymbolUnavailable–“k–#1˝ ˝ #1˝ 459 “DeclareTextCommand–“b˝ –OT4˝ [1] 460 ––“o@lign–“relax#1“crcr“hidewidth“sh@ft–29˝ % 461 “vbox to.2ex–“hbox–“char22˝ “vss˝ “hidewidth˝ ˝ ˝ 462 “DeclareTextCommand–“c˝ –OT4˝ [1] 463 –“leavevmode“setbox“z@“hbox–#1˝ “ifdim“ht“z@=1ex“accent24 #1% 464 “else–“ooalign–“unhbox“z@“crcr“hidewidth“char24“hidewidth˝ ˝ “fi˝ 465 “DeclareTextCommand–“d˝ –OT4˝ [1] 466 ––“o@lign–“relax#1“crcr“hidewidth“sh@ft–10˝ .“hidewidth˝ ˝ ˝

Declare the text symbols.

467 “DeclareTextSymbol–“AE˝ –OT4˝ –29˝ 468 “DeclareTextSymbol–“OE˝ –OT4˝ –30˝ 469 “DeclareTextSymbol–“O˝ –OT4˝ –31˝ 470 “DeclareTextSymbol–“L˝ –OT4˝ –138˝ 471 “DeclareTextSymbol–“ae˝ –OT4˝ –26˝ 472 “DeclareTextSymbol–“guillemotleft˝ –OT4˝ –174˝ 473 “DeclareTextSymbol–“guillemotright˝ –OT4˝ –175˝ 474 “DeclareTextSymbol–“i˝ –OT4˝ –16˝ 475 “DeclareTextSymbol–“j˝ –OT4˝ –17˝ 476 “DeclareTextSymbol–“l˝ –OT4˝ –170˝ 477 “DeclareTextSymbol–“o˝ –OT4˝ –28˝ 478 “DeclareTextSymbol–“oe˝ –OT4˝ –27˝ 479 “DeclareTextSymbol–“quotedblbase˝ –OT4˝ –255˝ 480 “DeclareTextSymbol–“ss˝ –OT4˝ –25˝ 481 “DeclareTextSymbol–“textemdash˝ –OT4˝ –124˝ 482 “DeclareTextSymbol–“textendash˝ –OT4˝ –123˝ 483 “DeclareTextSymbol–“textexclamdown˝ –OT4˝ –60˝ 484 %“DeclareTextSymbol–“texthyphenchar˝ –OT4˝ –‘“-˝ 485 %“DeclareTextSymbol–“texthyphen˝ –OT4˝ –‘“-˝ 486 “DeclareTextSymbol–“textquestiondown˝ –OT4˝ –62˝ 487 “DeclareTextSymbol–“textquotedblleft˝ –OT4˝ –92˝ 488 “DeclareTextSymbol–“textquotedblright˝ –OT4˝ –‘“”˝ 489 “DeclareTextSymbol–“textquoteleft˝ –OT4˝ –‘“‘˝ 490 “DeclareTextSymbol–“textquoteright˝ –OT4˝ –‘“’˝

Some symbols are faked from others:

491 “DeclareTextCommand–“aa˝ –OT4˝ 492 ––“accent23a˝ ˝ 493 “DeclareTextCommand–“AA˝ –OT4˝ 494 –“leavevmode“setbox0“hbox–h˝ “dimen@“ht0“advance“dimen@-1ex% 495 “rlap–“raise.67“dimen@“hbox–“char’27˝ ˝ A˝ 496 “DeclareTextCommand–“SS˝ –OT4˝ 497 –SS˝

In the OT4 encoding, $ and $ share a slot.

498 “DeclareTextCommand–“textdollar˝ –OT4˝ –“nfss@text–% 499 “ifdim “fontdimen“@ne“font ¿“z@ 500 “slshape 501 “else 502 “upshape 503 “fi 504 “char‘“$˝ ˝ 505 “DeclareTextCommand–“textsterling˝ –OT4˝ –“nfss@text–% 506 “ifdim “fontdimen“@ne“font ¿“z@ 507 “itshape 508 “else 509 “fontshape–ui˝ “selectfont 510 “fi 511 “char‘“$˝ ˝

Declare the composites.

512 “DeclareTextComposite–“k˝ –OT4˝ –A˝ –129˝ 513 “DeclareTextComposite–“’˝ –OT4˝ –C˝ –130˝ 514 “DeclareTextComposite–“k˝ –OT4˝ –E˝ –134˝ 515 “DeclareTextComposite–“’˝ –OT4˝ –N˝ –139˝ 516 “DeclareTextComposite–“’˝ –OT4˝ –S˝ –145˝ 517 “DeclareTextComposite–“’˝ –OT4˝ –Z˝ –153˝ 518 “DeclareTextComposite–“.˝ –OT4˝ –Z˝ –155˝ 519 “DeclareTextComposite–“k˝ –OT4˝ –a˝ –161˝ 520 “DeclareTextComposite–“’˝ –OT4˝ –c˝ –162˝ 521 “DeclareTextComposite–“k˝ –OT4˝ –e˝ –166˝ 522 “DeclareTextComposite–“’˝ –OT4˝ –n˝ –171˝ 523 “DeclareTextComposite–“’˝ –OT4˝ –s˝ –177˝ 524 “DeclareTextComposite–“’˝ –OT4˝ –z˝ –185˝ 525 “DeclareTextComposite–“.˝ –OT4˝ –z˝ –187˝ 526 “DeclareTextComposite–“’˝ –OT4˝ –O˝ –211˝ 527 “DeclareTextComposite–“’˝ –OT4˝ –o˝ –243˝ 528 ⟨/encoding⟩