
		FONTY NA KONSOLI TEKSTOWEJ LINUXA
		---------------------------------


	1. O CO TU CHODZI?

Prawdopodobnie masz ju zainstalowane jakie polskie litery na konsoli
tekstowej. Nie wiem jednak, czy zdajesz sobie spraw, e zdecydowana
wikszo dostpnych fontw jest w rny sposb niekompletna albo nawet
bdna, nawet jeli na pierwszy rzut oka dziaaj dobrze. Programy,
ktre bd pracowa w Unikodzie albo przecza zestawy znakw (na razie
jest ich mniejszo, ale bdzie si robi coraz wicej), przestan si
poprawnie wywietla.

Sprawa jest bowiem bardziej skomplikowana ni si moe wydawa. Font to
nie tylko zbir rysunkw znakw! Linux wie, e wywietla akurat liter
, a nie tylko znak o numerze 204 z biecego fontu. Przy wywietlaniu
znaku bierze udzia par tablic przekodowa numerw znakw. Chocia
niektre rzeczy s z powodw historycznych bardziej skomplikowane ni
mogyby by, zalety tego rozwizania s takie, e mona (albo bdzie
mona, kiedy programy uytkowe zaczn wykorzystywa moliwoci jdra):

- Wywietla ramki i inne znaki graficzne, mimo e nie ma ich w zestawach
ISO-8859-x.

- Uywa Unikodu. Zakadam, e wiesz mniej wicej, na czym polega Unikod.
Jeli nie wiesz, odsyam do
<http://usctoux1.cto.us.edu.pl/~trzcionk/ogonkiwunicode.html>.

- Przy zaadowanym jednym foncie czyta teksty w rnych zestawach znakw,
nawet nie posugujc si Unikodem. Niedostpne znaki bd zastpione
przyblieniami, na przykad litery z akcentami zgubi akcenty, ale tekst
bdzie czytelny, bez krzakw. Program moe zada wywietlenia tekstu
np. w ISO-8859-4 adujc odpowiedni tablic znakw, a system zajmie si
znalezieniem najbliszych znakw w biecym foncie.

- Uniezaleni fizyczne pozycje znakw w foncie od numerw znakw uywanych
przez programy. Na przykad jeli uywamy karty VGA, cz ramek _musi_
by w zakresie 0xC0..0xDF, a niektre inne znaki nie powinny by w tym
zakresie. Standardowo znaki maj 9 pikseli szerokoci, a pamitanych
jest tylko 8. Ostatni piksel w znakach 0xC0..0xDF jest powieleniem
poprzedniego, a w pozostaych jest pusty, wic ramki musz tam by, eby
si czyy ze sob bez przerw, a szerokie litery sigajce prawej
krawdzi znaku nie powinny si tam znale.


	2. CZEGO BDZIEMY POTRZEBOWALI

Zaczone fonty i tablice wraz z najnowsz wersj tego dokumentu s
dostpne na <http://qrczak.home.ml.org/programy/fonty_l.tar.gz>.

Oprcz nich powinnimy zainstalowa pakiet console-tools Yanna Dirsona
<dirson@debian.org>, ktry mona cign
z <ftp://sunsite.unc.edu/pub/Linux/system/keyboards/
console-tools-1998.04.08.tar.gz>. Polski mirror sunsite.unc.edu jest na
<ftp://sunsite.icm.edu.pl/mirrors/sunsite.unc.edu/>. Pakiet ten
zastpuje standardowy pakiet kbd, dodajc troch moliwoci.


	3. TROCH TEORII

Konsola Linuxa moe pracowa w dwch podstawowych trybach jeli chodzi
o wywietlanie znakw. Zajmijmy si najpierw pierwszym, omiobitowym.

S cztery zestawy znakw, ktrych programy mog uywa:

- ISO-8859-1. Oprcz ASCII zawiera alfabety zachodnioeuropejskie i
troch dodatkowych znakw przestankowych.

- Grafika VT100. Zamiast maych liter ASCII i paru innych znakw s
ramki i rne symbole specjalne. AFAIK znakw o numerach wikszych od
126 praktycznie si nie uywa.

- CP-437. Jest to font, ktry jest dostpny od razu po wczeniu
przecitnego peceta. Ma cz liter zachodnioeuropejskich (brakuje kilku
maych i wikszoci duych), ramki, kilka liter greckich i inne symbole
graficzne. Ta opcja prawdopodobnie kiedy oznaczaa po prostu font z
ROMu karty bez adnego przekodowania, ale teraz jest to CP-437, nawet
jeli zaadowany jest jaki inny font.

- Mapa definiowana przez uytkownika. Tutaj mona zaadowa dowoln tablic
kodw znakw. Jest to jedyny "legalny" sposb, eby uzyska polskie
litery.

eby bardziej spraw zagmatwa, nie wybiera si powyszych zestaww
bezporednio. S za to dwie mapy (o nazwach G0 i G1) i mona pod kad z
nich podcza jeden z powyszych zestaww, a potem przecza si
midzy nimi.

Powysze mapy (nazywaj si ACM - Application-Charset Map) tumacz
znaki uywane przez programy na Unikod. Do wywietlenia znaku jest
jeszcze uywana inna mapa (zwykle wbudowana w font, ale moe by w
osobnym pliku), ktra mwi, jakich znakw z fontu ekranowego uy, eby
wywietli dany unikod (SFM - Screen Font Map). Nie musi by
rnowartociowa, tzn. rnym unikodom mog odpowiada te same znaki
fizycznego fontu - dziki temu jeli font nie cakiem pasuje do mapy
ACM, otrzymamy np. litery bez akcentw zamiast jakich kwadracikw albo
pytajnikw (uywanych normalnie gdy jaki znak nie jest dostpny). Tak
wic kady znak, cznie z ASCII, jest tumaczony z jednego
omiobitowego zestawu przez Unikod na inny omiobitowy zestaw.

Domylnie G0 wskazuje na ISO-8859-1, a G1 - na grafik VT100. Domyln
zawartoci definiowalnej mapy ACM jest specjalna mapa oznaczajca
kolejne fizyczne znaki z fontu, nie patrzc na ich kody.

eby wywietla polskie litery, trzeba wic zrobi co nastpuje:

- Zaadowa odpowiedni font na ekran. Razem z fontem zaadowa map SFM,
ktra opisuje kody poszczeglnych znakw fontu.

- Zaadowa map ACM z ISO-8859-2.

- Przestawi G0 na map definiowan przez uytkownika, bo domylnie bya
ustawiona na ISO-8859-1. Niestety trzeba to robi po kadym resecie
konsoli (w szczeglnoci po kadym wylogowaniu si).

Jeli font bdzie mia ramki, programy bd mogy je wykorzystywa
przeczajc si na G1, ktre zwykle pokazuje na grafik VT100.
Ewentualnie przez CP-437.


	4. UNIKOD

Oprcz zabawy w przeczanie si midzy G0 a G1, podczanie rnych
zestaww pod G0 i G1 i adowania map ACM, mona pisa bezporednio w
Unikodzie. Wystarczy przeczy konsol w tryb unikodowy i produkowa
tekst w UTF-8 (ASCII pozostaje bez zmian, a znaki spoza ASCII s
zakodowane w parach i trjkach bajtw z przedziau 0x80..0xFF).

O ile istniejce programy zwykle mona bez trudu przystosowywa do
wszelkich omiobitowych zestaww znakw (przynajmniej do alfabetw
pisanych od lewej do prawej), z Unikodem jest troch gorzej, bo wysanie
na ekran kilku bajtw moe powodowa wywietlenie mniejszej liczby
znakw. Wszystkie edytory i programy starajce si rozmieszcza tekst w
okrelonych miejscach ekranu trzeba specjalnie przystosowywa do Unikodu
i uczy, e jeden znak ju nie musi mieci si w jednym bajcie.
Niektrych nie przystosowanych programw tego typu mona mimo to uywa
na si w trybie unikodowym, a efekty bd zadowalajce, cho nie
idealne - w tej grupie jest np. less i stary lynx. Programy, ktre tylko
pisz na stdout, dziaaj z reguy bez problemw.


	5. PRAKTYKA

Zainstalowalimy ju console-tools. W standardowej konfiguracji fonty
wyldoway w /usr/share/consolefonts, a tablice ACM i SFM (te ostatnie
s praktycznie zbdne, o ile uywamy dobrych fontw z wbudowanymi
tablicami) w /usr/share/consoletrans. W pakiecie kbd byo to w
/usr/lib/kbd/console{fonts,trans}.

Jeli przy uywaniu spakowanych fontw bd komunikaty bdu gzipa,
to znaczy, e mamy za star wersj libca, z pewnym bdem dotyczcym
buforowania plikw przy forku. libc-5.3.12 ma ten bd, a libc-5.4.33
ju nie. Jeli mamy starego libca, powinnimy rozpakowa
/usr/share/{consolefonts,consoletrans,keytables}/*.gz.

Kopiujemy tam moje fonty i tablice. Moje tablice iso*q.acm prawie
pokrywaj si z oryginalnymi iso*.acm, ale maj poprawionych kilka
bdw.

W RedHacie skrypty startowe adujce font na ekran s w pakiecie kbd.
Jeli ich nie mamy, musimy napisa wasne. Jeli mamy, musimy pozmienia
cieki i nazwy programw, bo w console-tools zamiast programu setfont
znanego z kbd jest consolechars o nieco innej skadni.

Mj font z ISO-8859-2 adujemy przez:
	consolechars -f iso02q-16
Tablica SFM jest wbudowana w ten font.

Teraz tablica ACM:
	consolechars -m iso02q
Takie wywoanie rwnoczenie podcza map definiowan przez uytkownika
pod zestaw G0, ale po resecie konsoli dostaniemy z powrotem ISO-8859-1.
Dlatego np. w /etc/profile musimy dopisa:
	echo -ne '\033(K'
co ustawi G0 na zaadowan map ACM po zalogowaniu.

Mona rwnie zmieni terminfo, eby po kadym resecie konsoli bya
wczana mapa uzytkownika:
	infocmp linux >linux
(zamiast linux wpisz nazw uywanego terminalu), dodaj \E(K po kadym
\Ec, zamie \E(B na \E(K i:
	tic linux
Nie jest jasne, czy tak si powinno robi. Prawdopodobnie reset konsoli
powinien jednak przywraca domylne ustawienie ISO-8859-1 zamiast
przecza na z gry nieznan map uytkownika. Ryzykujemy wtedy
konieczno ponownego uaktywnienia mapy uytkownika.

Warto razem z fontem zaadowa tzw. tablic fallback, pomagajc
przyblia niedostpne znaki najbardziej podobnymi. Jest to opisane
w dokumentacji do console-tools (doc/lct.txt). Doczam moj tablic -
s w niej przyblienia liter innych alfabetw, symboli, semigrafiki itp.
adujemy j przez:
	consolechars -k qrczak.fallback

Wszystkie elementy mona zaadowa jednym wywoaniem.


	6. KLAWIATURA

Map klawiatury adujemy przez:
	loadkeys nazwa-pliku

Jeli wolimy polskie litery tylko prawym Altem, musimy poprawi
oryginaln map /usr/share/keytables/pl.kmap, ktra podcza polskie
litery pod oba Alty (wywali ogonki z Alt, zostawi z AltGr).

eby mc pisa ogonki w bashu, musimy o tym powiedzie w pliku
~/.inputrc. Zaczam przykadow wersj tego pliku.


	7. KOPIOWANIE TEKSTU MYSZ

Jeli uywamy gpm do kopiowania tekstu mysz, jdro musi przekodowywa
znaki w drug stron. S tutaj dwie moliwoci przekama.

Po pierwsze, jeli znak by wypisany na ekran uywajc innej mapy ACM
albo przez Unikod, nie mona go przepuci przez odwrotn ACM. Wyjd
wtedy krzaki.

Po drugie, mapa SFM nie musi by rowartociowa, wic jeli jeden
fizyczny znak na ekranie odpowiada kilku unikodom, przy sczytywaniu tego
z ekranu zostanie uyty niekoniecznie ten z nich, za pomoc ktrego ten
znak by wyprodukowany. Dlatego fonty nie powinny bez potrzeby wsadza
tak samo wygldajcych znakw do jednego - co prawda wygldaoby
poprawnie, ale le by si kopiowao mysz.


	8. MOJE FONTY

Fonty iso{0{1,2,3,4,5,7,9},10}q-16 zawieraj pene i poprawne ISO-8859-x
oraz grafik VT100, w tym ramki. Pozostae wolne miejsca wykorzystaem
na znaki z odpowiednich zestaww windowsowych (CP-125x) - zwykle mog
by uyte tylko poprzez Unikod. Wszystkie te znaki s "jednokrotne",
wic dobrze przenosz si mysz.

Font iso1234567910q-16 zawiera wszystkie znaki z odpowiednich zestaww,
w sumie 512. Znaki wygldajce tak samo s uwsplnione. Niestety karta
VGA do wywietlania 512 znakw naraz uywa tego bitu atrybutu, ktry
zwykle suy do rozjaniania tekstu, wic jasne teksty bd
przyciemnione. Rad na to moe by program filterm z filterm 512bold
z <http://qrczak.home.ml.org/programy/linux/konwert/konwert-1.4.tar.gz>.


	10. KODY STERUJCE KONSOLI

s opisane w man console_codes.


	11. JELI CHCEMY ZMIENIA FONTY I ADOWA TABLICE PRZEKODOWA
	    WE WASNYCH PROGRAMACH

przeczytajmy man console_ioctl.


	12. ZAKOCZENIE

Mam nadziej, e na co si przydaem. Bd wdziczny za wszelkie
sugestie. Wicej fontw, lepsze opisy itd. bd, ale pniej.


-- 
 __("<   Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.home.ml.org/
 \__/       GCS/M d- s+:-- a21 C+++>+++$ UL++>++++$ P+++ L++>++++$ E->++
  ^^                W++ N+++ o? K? w(---) O? M- V? PS-- PE++ Y? PGP->+ t
QRCZAK                  5? X- R tv-- b+>++ DI D- G+ e>++++ h! r--%>++ y-
