18 (43)


Rozdział 18.geqn oraz gtbl

Tim Parker
W tym rozdziale:
* geqn
* gtbl
Teraz, kiedy znasz już podstawy systemu groff, przyjrzymy się dwóm jego
rozszerzeniom: geqn oraz gtbl. W tym rozdziale dowiesz się:
* co to jest geqn oraz gtbl?
* jak w łatwy sposób formatować złożone równania?
* jak formatować tabele?
W poprzednim rozdziale pokazaliśmy, w jaki sposób używa się systemu groff do
tworzenia sformatowanych dokumentów tekstowych nadających się zarówno do
wydrukowania, jak i do oglądania na ekranie graficznym. Niestety, tworzenie
bardziej skomplikowanych struktur w systemie groff, takich jak tabele czy
równania, nie jest łatwe. Opracowano więc zestaw makropoleceń ułatwiających te
zadania.
Programy gtbl i geqn są preprocesorami, co oznacza, że pliki źródłowe
powinieneś tworzyć tak, jak robiłeś to nie używając tych programów. Można
jednak wprowadzać do nich również polecenia programów gtbl i geqn, które
zostaną rozwinięte w polecenia rozpoznawane przez groff. Pozostała część pliku
źródłowego, nie zawierająca poleceń gtbl i geqn, jest bez zmian przesyłana do
programu groff.
geqn
Preprocesor geqn jest zaprojektowany do formatowania złożonych równań i
drukowania symboli specjalnych. Jego użycie jest potrzebne tylko w przypadku,
gdy formatujesz tekst zawierający takie elementy.
Choć groff umożliwia formatowanie prostych równań, na pewno nie nadaje się do
tworzenia równań zajmujących więcej niż jeden wiersz. geqn jest łatwy do
opanowania, a w wielu sytuacjach wręcz niezastąpiony. Polecenia programu geqn
są zwykle skrótami słów angielskich, dzięki czemu łatwiej je zapamiętać.
Uruchamianie geqn
Program geqn musi być wywołany przed programem groff. Zwykle dokonuje się tego
poprzez wydanie polecenia:

geqn nazwa_pliku | groff
Powoduje ono przetworzenie pliku nazwa_pliku przez program geqn oraz przesłanie
wyników jego działania na wejście programu groff. Polecenie

geqn plik1 plik2 plik3 | groff
powoduje przetworzenie kolejno wszystkich trzech plików.
Pamiętaj, że wiele terminali nie potrafi prawidłowo wyświetlać równań (muszą to
być konsole graficzne lub umożliwiające użycie odpowiedniej czcionki). Możliwe,
że aby obejrzeć efekty swojej pracy, będziesz musiał je wydrukować.
Równania
Równanie można wstawić informując program geqn w którym miejscu zaczyna się ono
i kończy za pomocą poleceń .EQ (ang. equation) oraz .EN (ang. equation end).
Tekst pomiędzy tymi poleceniami traktowany jest jako równanie. Polecenie:

.EQ
b=c*(d+x)
.EN
powoduje sformatowanie równania b=c*(d+x).
Jeśli wpiszesz wiersz b=c*(d+x) nie zaznaczając go jako równania, czyli w
efekcie przekazując go bezpośrednio do programu groff, efekt wyjściowy będzie
inny, ponieważ groff nie potrafi prawidłowo zinterpretować znaków wchodzących w
skład równania.
Równania można numerować
często robi się to w tekstach technicznych
przez
podanie odpowiedniego numeru po poleceniu .EQ, na przykład:

.EQ 15
b=c*(d+x)
.EN
powoduje umieszczenie przed równaniem numeru 15.
Indeks górny i dolny
Aby w równaniu zamieścić indeks górny lub dolny, należy użyć poleceń sup i sub.
Słowa te muszą być z obu stron otoczone spacjami. Przykładowo, polecenie:

E=mc sup 2
daje na wyjściu słynne równanie Einsteina.
Aby zaznaczyć koniec tekstu, który ma być zawarty w indeksie, należy wstawić
znak spacji lub tyldę (~). Na przykład polecenie:

x=(z sup 2)+1
daje na wyjściu:

x=(z2)+1
a prawdopodobnie nie o to chodziło. Zamiast tego, powinieneś wprowadzić któreś
z poleceń:

x=(z sup 2 )+1
x=(z sup 2~)+1
Spacja lub tylda oznacza koniec indeksu górnego. Oba powyższe polecenia dają na
wyjściu równanie:

x=(z2)+1
Możesz również uzyskać indeks górny w indeksie górnym oraz dolny w dolnym:

y sub x sub 3
lub zastosować oba indeksy równocześnie:

x sub 3 sup 18
Ponieważ spacja jest używana do oznaczania końca tekstu wchodzącego w skład
indeksu górnego lub dolnego, może to spowodować drobne problemy w przypadku,
gdy trzeba jej użyć do rozdzielenia symboli. Sposobem na obejście tych
problemów jest zastosowanie nawiasów klamrowych, w których zawrzeć należy cały
tekst należący do danego indeksu:

w sup {x alpha y}
Powyższy przykład ilustruje równocześnie możliwość wykorzystania liter
greckich. Nawiasy klamrowe można zagnieżdżać:

omega sub { 2 pi r sup { 2 + rho }}
Wypróbuj sam te polecenia i obejrzyj efekty ich działania.


Choć może się wydawać, że litery greckie są przydatne tylko w skomplikowanych
równaniach, często wygodnie jest ich używać również w prostych formułach. Warto
wiedzieć, jak je uzyskać i jak wyglądają na papierze.
Ułamki
Do tworzenia prawidłowo sformatowanych ułamków służy polecenie over. geqn
automatycznie dostosowuje długość linii oddzielającej licznik i mianownik. Na
przykład polecenie

a=2b over {3c alpha}
da w wyniku równanie, po którego prawej stronie jest ułamek
tak, jakby
zostało napisane na papierze.
Można oczywiście używać równocześnie indeksów i ułamków, co pozwala na
uzyskanie bardziej złożonych równań:

{alpha + beta +gamma sup 3} over {3 sub {4 + alpha}}
W takim przypadku najpierw przetwarzane są polecenia sub i sup, a potem over,
co daje zamierzony efekt.
Pierwiastek kwadratowy
Aby uzyskać symbol pierwiastka kwadratowego, należy użyć polecenia sqrt
geqn
zadba o to, by symbol pierwiastka prawidłowo otaczał cały tekst, który ma
znaleźć się "pod pierwiastkiem". Bardzo duże pierwiastki (szczególnie o
długości przekraczającej jeden wiersz tekstu) nie wyglądają jednak najlepiej po
wydrukowaniu
w takim przypadku warto rozważyć zapisanie pierwiastka jako
potęgi o wykładniku 0,5.
Polecenie sqrt jest łatwe w użyciu, poniższy przykład:

sqrt a+c
1 over sqrt {alpha + beta}
powoduje "nałożenie" pierwiastków na wyrażenia a+c oraz alpha + beta.
Sumy, teoria zbiorów i całki
Aby uzyskać symbol sumy, użyj poleceń sum, from i to (dwa ostatnie definiują
granice sumowania). Użycie polecenia:

sum from x=1 to x=100 x sup 2
powoduje wstawienie symbolu sumy kwadratów liczby x dla x zmieniającego się od
1 do 100. Można również wydać polecenie:
sum from x=1 to {x= inf} x sup 2
dające podobne efekty, z tym, że górną granicą sumowania jest nieskończoność.
Klamry zapewniają prawidłową interpretację polecenia. Jeśli któryś z elementów
from lub to nie jest podany, nie jest on drukowany.
Używanie symbolu całki możliwe jest dzięki poleceniu int. Jego składnia jest
taka sama jak składnia polecenia sum, np.:

int from x=1 to {x= inf} x sup 2
Drukowanie symbolu granicy możliwe jest za pomocą polecenia lim:

lim from n=1 xy sup 3 =9
Inne zarezerwowane słowa to union i inter, używane w teorii zbiorów
(odpowiednio unia i przecięcie zbiorów).
Nawiasy i kolumny
Kiedy równania stają się bardziej skomplikowane, konieczne staje się użycie
kilku poziomów nawiasów. Aby uzyskać taki efekt, należy zastosować polecenia
left i right:

left { b over d+1 right } = left ( alpha over {beta+ gamma} right )
W powyższym przykładzie po lewej stronie równania znajdzie się ułamek w
nawiasie klamrowym, a po prawej wyrażenie w nawiasach okrągłych. Można
oczywiście zagnieżdżać nawiasy
geqn sam odpowiednio dostosuje ich wysokość.
Nawiasy klamrowe i kwadratowe są zwykle większe niż okrągłe.
Oznaczenia sufitu i podłogi uzyskać można za pomocą poleceń left floor, right
floor, left ceiling i right ceiling, na przykład:

left ceiling x over alpha right ceiling > left floor beta over 2 right floor
Aby uzyskać kolumnę elementów, należy użyć polecenia pile. Poniższy przykład
daje kolumnę trzech elementów otoczoną dużymi nawiasami kwadratowymi:

X = left [ pile {a above b above c } right ]
Macierze
Tworzenie macierzy wymaga nieco więcej wysiłku. Mógłbyś prawdopodobnie zrobić
to za pomocą polecenia pile, ale jeśli wysokości elementów są różne, nie znajdą
się one w jednej linii. Z tego powodu należy używać polecenia matrix. Ogólnie
jego składnia jest następująca:

matrix {
ccol { elementy }
ccol { elementy }
}
Polecenie to powoduje utworzenie macierzy, której elementy są wyśrodkowane.
Jeśli chcesz dosunąć je do lewej lub prawej strony, użyj zamiast ccol słowa
lcol lub rcol. Przykładowe polecenie:

matrix {
ccol { x sub 11 above x sub 12 }
ccol { x sub 21 above x sub 22 }
}
generuje macierz o wymiarach 2x2 o następującej postaci:

x11 x21
x12 x22
Wszystkie kolumny macierzy muszą składać się z takiej samej liczby elementów.


Niektóre pakiety matematyczne dopuszczają tworzenie macierzy z różną ilością
elementów w kolumnach. Nie jest to podejście właściwe, ponieważ taki twór
przestaje być macierzą. Wszystkie kolumny macierzy powinny składać się z takiej
samej liczby elementów, podobnie jak wiersze
Cudzysłowy
Ciąg znaków umieszczony w cudzysłowie nie jest interpretowany przez geqn. Takie
rozwiązanie
przydaje się, gdy zachodzi potrzeba wypisania tekstu będącego nazwą
zastrzeżoną, np.:

italics "beta" = beta + gamma
W powyższym przykładzie zamiast greckiej litery beta przed znakiem równości
pojawi się tekst beta.
Zmiana czcionki
Rodzaj i rozmiar czcionki można zmieniać bardzo podobnie jak w programie groff.
Czcionką domyślną jest czcionka Roman o wysokości 10 punktów. Jeśli chcesz, aby
litery były wytłuszczone, powinieneś wydać polecenie bold. Polecenie italic
powoduje, że tekst będzie pisany kursywą.

x = y bold alpha
Polecenie fat powoduje drukowanie liter poszerzonych. Polecenia te dotyczą
tylko tekstu następującego bezpośrednio po nich, więc jeśli chcesz zastosować
je do większej partii tekstu, musisz umieścić ją w nawiasach klamrowych:

x = y*2 bold { alpha + beta }
Zmiana rozmiaru czcionki możliwa jest dzięki poleceniu size:

size 16 { alpha + beta }
Dopuszczalne są również zmiany względne, np. size +2.
Jeśli chcesz, aby zmiany dotyczyły całego równania, możesz na początku bloku
równania użyć poleceń gsize (ang. global size)i gfont (ang. global font):

.EQ
gsize 14
gfont H
......
Dzięki temu łatwo sformatować równanie w wymagany sposób.
Używanie programu geqn
Jak widzisz, stosowanie programu geqn do formatowania równań nie jest
szczególnie trudne, a daje bardzo dobre efekty. Powinieneś pobawić się chwilę
tym systemem, aby nabrać wprawy. Oprócz przedstawionych tu najbardziej
podstawowych poleceń, dostępnych jest jeszcze wiele innych. Ich opis znaleźć
możesz na stronach man i w dobrych książkach omawiających system groff.
gtbl
Program gtbl został opracowany po to, by ułatwić formatowanie tabel i wyliczeń
składających się z kilku kolumn. Jego polecenia nie są trudne w użyciu, ale
wyglądają dość dziwacznie
najlepszą metodą zapoznania się z nimi jest
przestudiowanie kilku przykładów.
Aby użyć gtbl, w pliku źródłowym powinieneś zawrzeć dwa specjalne polecenia:
.TS (ang. table start) i .TE (ang. table end), a pomiędzy nimi dane dotyczące
tabeli. Polecenia te zostaną następnie przetłumaczone przez program gtbl na
postać rozpoznawaną przez groff.
Każda z tabel jest niezależna od innych, co oznacza, że dla każdej z osobna
trzeba podać informacje dotyczące formatowania; nie można założyć, że zostaną
użyte poprzednie wartości. Tabela musi zawierać trzy typy informacji: dane,
które mają znaleźć się w tabeli, opcje kontrolujące zachowanie gtbl oraz
polecenia formatujące tabelę. Ogólnie, składnia polecenia powodującego
wstawienie do dokumentu tabeli jest następująca:

.TS
opcje;
format.
dane
.TE
Przyjrzyjmy się każdemu z elementów tego polecenia z osobna, by później
połączyć je i utworzyć prawidłowo sformatowaną tabelę.
Uruchamianie programu gtbl
Ponieważ gtbl jest preprocesorem, należy go wywołać z argumentem określającym
nazwę pliku źródłowego, zaś efekty jego działania przesłać na wejście
właściwego programu formatującego:

gtbl plikzrodlowy | groff
Można również użyć obu preprocesorów geqn i gtbl równocześnie, na przykład tak:

geqn plikzrodlowy | gtbl | groff
Opcje
Po poleceniu .TS może wystąpić jeden wiersz zawierający opcje, które dotyczą
całej tabeli. Jeśli podajesz więcej niż jedną opcję, musisz rozdzielić je
spacjami, przecinkami lub tabulatorami, natomiast po ostatniej musi wystąpić
średnik. gtbl obsługuje następujące opcje:
center powoduje wyśrodkowanie zawartości tabeli
(domyślnie
wyrównywanie do lewej),
expand poszerza tabelę do aktualnej długości wiersza,
box otacza tabelę ramką,
allbox otacza każdy element tabeli ramką,
doublebox otacza tabelę podwójną ramką,
tab (n) używa znaku n zamiast tabulatora jako separatora danych,
linesize (n) używa rozmiaru n punktów dla poszczególnych wierszy,
delim (mn) używa znaków m i n jako ograniczników równań.
Kiedy gtbl próbuje sformatować tabelę, stara się zmieścić ją na jednej stronie,
nawet jeśli musi pozostawić poprzednią stronę częściowo pustą. Może to czasem
być przyczyną problemów, ponieważ zdarza się, że gtbl źle oblicza rozmiar
tabeli przed jej wygenerowaniem, szczególnie jeśli są w niej osadzone polecenia
zmieniające rozmiar czcionki lub odstępy między wierszami. Aby uniknąć tych
problemów, niektórzy użytkownicy otaczają całą tabelę makropoleceniem .DS (ang.
display start) i .DE (ang. display end). W przypadku prostych tabel nie
pojawiają się żadne problemy.
Format
Sekcja opisująca format tabeli determinuje sposób wyświetlania poszczególnych
kolumn. Każdy wiersz sekcji formatu odpowiada wierszowi wygenerowanej tabeli.
Jeśli podanych jest mniej wierszy formatu, niż wierszy danych, pozostała część
danych zachowuje ostatnio zdefiniowany format. Pozwala to na łatwe tworzenie
nagłówków w innym formacie i użycie jednolitego formatowania reszty tabeli.
Sekcja formatu musi kończyć się kropką.
Każdy wiersz tej sekcji zawiera litery kluczowe odnoszące się do kolumn tabeli.
Powinny być one rozdzielone spacjami albo znakami tabulacji, ponieważ poprawia
to czytelność.
Wielkość tych liter nie ma znaczenia (można używać zarówno wielkich, jak i
małych liter). Oto ich funkcje:
l wyrównanie pola do lewej,
r wyrównanie pola do prawej,
c wyśrodkowanie pola,
n wyrównanie danych numerycznych do kropki,
a wyrównanie do lewej tak, by najdłuższy wpis był wyśrodkowany,
s zastosowanie do kolumny bieżącej formatu poprzedniej kolumny.
Podana poniżej przykładowa sekcja formatu zawiera jedną literę dla każdej
kolumny; ostatni wiersz definiuje format obowiązujący do końca tabeli:

c s s
l n n.
W tym przykładzie, w pierwszym wierszu tabeli pierwsza, druga i trzecia kolumna
jest wyśrodkowana (litera s powoduje, że dana kolumna ma taki sam format, jak
kolumna poprzednia). W drugim wierszu i wszystkich następnych pierwsza kolumna
jest wyrównana do lewej, a druga i trzecia zawiera dane numeryczne wyrównane do
kropki. Koniec sekcji oznaczony jest kropką. Jeśli chcesz, możesz wszystkie te
dane umieścić w jednym wierszu, na przykład tak:

c s s, l n n.
Tabela sformatowana w ten sposób wyglądać będzie mniej więcej tak:

Wyśrodkowany nagłówek


Dana1
12.23
231.23
Dana2
3.23
45.2
Dana3
45
124.344
Dana4
3.2
2.3
Dane liczbowe wyrównane są tak, by kropki dziesiętne znajdowały się w jednej
linii. Czasem jednak będziesz chciał wymusić zmianę formatu dla konkretnej
danej. Aby przesunąć kropkę dziesiętną, użyj symbolu specjalnego \&. Nie jest
on drukowany w tabeli. Spójrzmy na przykładowe dane (pierwsza kolumna to dane
źródłowe, druga przedstawia, jak zostaną one sformatowane):

14.5
14.5
13
13
1.253
1.253
3\&1.21
31.21
53.2
53.2
6\&2.23
62.23
Można zauważyć, że liczby ułożone są tak, by kropki dziesiętne były jedna pod
drugą, za wyjątkiem tych, w których użyto symbolu \&. Jeśli dana nie zawiera
kropki dziesiętnej, program gtbl przyjmuje, że występuje ona po ostatniej
cyfrze.
Poniżej zebrane zostały inne symbole specjalne, które mogą być używane (w
sekcji formatu) do nietypowego formatowania tabeli, czyniąc ją nieco bardziej
atrakcyjną:
_ linia pozioma zamiast danych;
= podwójna linia pozioma zamiast danych;
| pomiędzy danymi, wstawia między kolumnami pionową linię; przed pierwszą daną
w wierszu wstawia linię po lewej stronie tabeli; po ostatniej danej wstawia
linię po prawej stronie tabeli;
|| pomiędzy danymi, wstawia podwójną pionową linię między kolumnami;
e/E ustawia równe szerokości kolumn; wszystkie kolumny, dla których ustawiona
jest opcja e będą miały równe szerokości;
f/F x powoduje użycie zadanego rodzaju lub rozmiaru czcionki (x to nazwa
czcionki lub jej rozmiar);
n x określa wielkość odstępów pomiędzy kolumnami;
p/P x zmienia rozmiar wpisu zgodnie z następującą po nim liczbą; obsługiwane są
również zmiany względne;
t/T powoduje, że szerokie obiekty będą zaczynać się od samej góry wiersza
(zwykle są one wyśrodkowane w pionie);
v/V ustawia odstęp między wierszami;
w/W ustawia minimalną szerokość kolumny.
Porządek tych znaków w wierszu formatu nie jest istotny. Przykładowy wpis

np14w(2.5i)fi
formatuje pole liczbowe (n), pisane kursywą (fi) o wysokości 14 punktów (p14) i
minimalnej szerokości kolumny 2.5 cala (w(2.5i)).
Może również zajść potrzeba zmiany formatu tabeli gdzieś w jej środku
na
przykład by wstawić podsumowanie. Jeśli musisz to zrobić, zastosuj polecenie
.T& (ang. table continue).
Dane
Dane, które mają znaleźć się w tabeli, wpisywane są po określeniu formatu.
Poszczególne kolumny oddzielać należy tabulatorami albo innymi znakami
określonymi za pomocą opcji tab. Każdy wiersz danych odpowiada jednemu
wierszowi tabeli. Długie wiersze danych można kontynuować dla wygody w nowym
wierszu pliku źródłowego wstawiając na końcu poprzedniego wiersza symbol \.
Każdy wiersz rozpoczynający się od kropki jest traktowany jak polecenie groff i
nie jest przetwarzany. Jeśli wiersz danych składa się tylko ze znaków
podkreślenia bądź równości, jest traktowany tak, jakby miał szerokość całej
tabeli.
W tabeli można osadzać bloki tekstu używając poleceń T{ (początek tekstu) oraz
}T (koniec tekstu). Dzięki temu możliwe jest umieszczanie w tabelach tekstów,
które trudno byłoby wprowadzić jako tekst rozdzielany znakami tabulacji.
Przykłady
Najlepszym sposobem na zrozumienie zasady działania gtbl jest przestudiowanie
kilku przykładów. Oto polecenie formatujące prostą tabelkę:

.TS
doublebox;
c c c, l l n.
Imie Wydzial Telefon
Michal 8A 2245
Piotr 6D 1246
Pawel 2C 6436
Anna 1A 1363
.TE
Wszystkie dane rozdzielone są znakami tabulacji. Wygenerowana tabela składa się
z trzech kolumn; pierwszy wiersz zawiera wyśrodkowany tekst. W następnych
wierszach pierwsza i druga kolumna wyrównana jest do lewej, natomiast trzecia
ma format numeryczny. Cała tabela otoczona jest podwójną ramką.
Odrobinę bardziej złożony przykład przedstawia tabelę zawierającą tytuł, po
którym następują dane. Każdy element tabeli jest otoczony ramką.

.TS
allbox;
c s s
c c c
n n n .
Wyniki
Wschod Zachod Polnoc
15 12 14
12 12 18
36 15 24
.TE
Spróbuj sam wpisać te przykłady, aby przekonać się, jakie są wyniki działania
poszczególnych poleceń. Kiedy zrobisz pierwszy krok, używanie gtbl przestaje
być takie straszne.
Podsumowanie
Choć dostępne dziś graficzne edytory tekstu spowodowały znaczne zmniejszenie
się popularności programów geqn i gtbl, niektórzy zatwardziali użytkownicy
UNIX-a wciąż ich używają. Zdarzyć się również może, że nie będziesz mógł w
swoim edytorze tekstu sformatować równania dokładnie tak, jakbyś sobie tego
życzył. Wtedy będziesz zmuszony do powrotu do korzeni. Innym powodem używania
tych programów jest fakt, że graficzne edytory tekstu są dość drogie, więc geqn
i gtbl są świetną alternatywą dla tych użytkowników, którzy z ich możliwości
korzystać muszą rzadko, więc nie mają potrzeby kupowania drogiego edytora.
gawk, poręczny i szybki język programowania dla zaawansowanych użytkowników i
administratorów, omówiony jest w rozdziale 25. "gawk".
Perl, inny język programowania, który jest bardzo popularny w skryptach dla
stron WWW, przedstawiony jest w rozdziale 28. "Perl".
Smalltalk/X, oparta na systemie X implementacja zorientowanego obiektowo języka
programowania, omówiony jest w rozdziale 31. "Smalltalk/X".



Wyszukiwarka

Podobne podstrony:
2565 18
kawały(18)
Załącznik nr 18 zad z pisow wyraz ó i u poziom I
A (18)
consultants howto 18

więcej podobnych podstron