PIC i Troff

niedziela, 1 kwietnia 2012

Ten tekst, mimo że powstał w ramach 1 kwietnia, ma pewne znamiona użyteczności.
Myślę że to bardzo dobry dzień by ponownie reaktywować ten blog, w razie czego będę mógł wszystkiego się wyprzeć...

Pewna książka

Wczoraj, trafiłem na interesującą książkę:
Unix Text Processing

Opisuje tradycyjne narzędzia do przetwarzania tekstu, takie jak vi, sed, awk, troff i to co mnie najbardziej zaintrygowało: pic.

Pic, służy do tworzenia diagramów. To co mnie w nim zauroczyło, to niezwykle prosty język opisu:

.PS
ellipse "text"
arrow
box "pic"
arrow
box "troff"
arrow
ellipse "postscript"
.PE

Powyższy przykład, właściwie nie potrzebuje żadnych wyjaśnień. By zobaczyć rezultaty wystarczy wydać następujące polecenie:

pic <input.me | groff >output.ps

Troff / Groff

Pic współpracuje z procesorem tekstu Troff. Dziś mało popularnym narzędziem, mającym swoje korzenie jeszcze w latach '60 zeszłego stulecia. Mimo to każdy kto czytał uniksowe manuale miał z nim wielokrotnie do czynienia.

Najbardziej znaną wersją wspomnianego procesora jest GNU Groff. Ma on jednak wieczne problemy z unikodami. Dotychczas było to dla mnie wystarczającym powodem by całkowicie go ignorować.

Nie tym razem - Ciekawość zwyciężyła.

UTF-8

dochodzenie

W sieci znalazłem wzmianki, o tym że jakoby Groff obsługuje wyłącznie znaki z zestawu Latin1. Jednak nie do końca to jest prawdą, nawet w najstarszych dokumentach można znaleźć symbole z poza tego zakresu, więc oczywistym było, że Groff nie może być aż tak ograniczony.

Manuale, wyraźnie wspominają o obsłudze utf-8. Niestety podążając tym tropem, trafiłem na ślepą uliczkę. Opcja ta jest ograniczona do tekstowego wyjścia, na użytek... no właśnie: manuali.

Wreszcie trafiłem na narzędzie preconv, przekształcające tekst w unikodach, do postaci zrozumiałej dla groff.

Narzędzie jest proste: Przykładowo, natrafiwszy na literę Ą, zastępuję ją ciągiem [u0104]... i tu stała się ciekawa rzecz: Groff, stwierdził że nie wie jak wyświetlić znak [u0041_0328].

Co to znaczy?

Groff zna literę Ą! Wie że może ją zastąpić ciągiem dwóch znaków A (u0041) + ogonek (u0328).

Więc winowajcą jest zapewne sterownik postscript. Najbardziej prawdopodobny jest, jak zwykle, brak fontów z polskimi znakami.

Co ciekawsze, odkryłem że Groff bez problemów wyświetla litery Ł i Ć, które zdecydowanie nie należą do zestawu Latin1.

Następny krok, wymagał nauki podstaw języka...

Rozwiązanie

Instalacja odpowiedniego fontu, przerasta moje umiejętności. Być może najłatwiej było by dokonać konwersji tekstu, do zestawu Latin2 i podążać wytyczonymi dziesięć lat temu szlakami, ale wcale mi się to nie uśmiechało.

W końcu, przyszło mi do główy rozwiązanie, równie stare jak sam Groff:

W czasach drukarek wierszowych, mających stały zestaw znaków. Ktoś wpadł na prosty pomysł, by po wydrukowaniu A cofnąć głowicę i wydrukować przecinek. Efekt nie doskonały, ale lepszy niż brak polskich znaków.

W przypadku generowania plików postscript i pdf, takie podejście ma jedną zaletę. Osadzenie fontów polskimi znakami oznaczało by znaczne powiększenie dokumentów. Podczas gdy zabawa ze składaniem znaków pozwala zachować niewielkie rozmiary.

Oto gotowe rozwiązanie: pl.s

\" Składanie polskich znaków
.char \[u0104] A\Z'\h'-.4'\[ho]'
.char \[u0105] a\Z'\h'-.2'\[ho]'
.char \[u0118] E\Z'\h'-.3'\[ho]'
.char \[u0119] e\Z'\h'-.3'\[ho]'
.char \[u015A] S\Z'\h'-.4'\v'-.20m'\[aa]'
.char \[u015B] s\Z'\h'-.4'\[aa]'
.char \[u017B] Z\Z'\h'-.45'\v'-.25m'\[a.]'
.char \[u017C] z\Z'\h'-.40'\v'-.05m'\[a.]'
.char \[u0179] Z\Z'\h'-.5'\v'-.20m'\[aa]'
.char \[u017A] z\Z'\h'-.4'\[aa]'
.char \[u0143] N\Z'\h'-.5'\v'-.20m'\[aa]'
.char \[u0144] n\Z'\h'-.4'\[aa]'

... i mały przykład:

.so pl.s

To jest mały test \fITroff\fP.
Procesora tekstów lat '70 i '80

.PS
ellipse width 2 "\s+4Polskie" "znaczki\s-4"
arrow down from last ellipse.s
box invis "\s+8 ĄĆĘŚŻŹŁÓŃ ąćęśżźłóń\s0"
.PE

.ad r
i to by było na tyle.

Na koniec.

Być może przedstawiona sztuczka, jest całkowicie zbędna. Być może jest jedynie rezultatem mojej ignorancji. Pokazuje jednak jak bardzo elastycznymi narzędziami są procesory tekstu takie jak Groff.

Pozostaje jeszcze pytanie po co to wszystko?

Cóż, miałem dziś okazję zapoznać się z dużym kawałkiem historii.
Ze względu na manuale, groff jest dostępny właściwie wszędzie.
Troff z założenia miał być prosty w obsłudze, nawet powierzchowna znajomość pozwala na stworzenie dobrze wyglądającego wydruku.

Doświadczenie nakazuje mi traktować takie narzędzia z olbrzymim szacunkiem. W końcu to właśnie sed, umożliwił mi kiedyś edycję pliku z pocztą liczącego sobie 65GB.

Odnośniki

(2012-04-02) Mała aktualizacja: Opisywane tu dokumenty, wraz z odpowiednim Makefile wrzuciłem na svn: code.google.com/p/szsz/source/browse/trunk/groff

Etykiety: ,

Red 23:59

Komentarze

Prześlij komentarz

Archiwum

Subskrybuj

RSS / Atom