Uczymy si� TEX-a przez lata, jednak bardzo trudno cokolwiek zrobi� bez dobrej ksi��ki na biurku. Mimo i� ucz� si� TEX-owej maszyny mniej wi�cej od pi�ciu lat, ci�gle o czym� zapominam lub �api� si� na tym, �e czego� nie doczyta�em lub pomin��em. Do bia�ej gor�czki doprowadzaj� mnie odkrycia, �e przerobiony dawniej temat umkn�� mi gdzie� z pami�ci. Musz� czyta� od nowa :-(.
Jedyn� recept� na moje bol�czki sta�o si� robienie notatek z naszej TEX-owej biblii, czyli z The TEXbook. Notatki te nie s� zawsze wiern� kopi� TEXbook-a, maj� jednak identyczny uk�ad tematyczny. Marzy mi si� po cichu dobre t�umaczenie mojej ulubionej ksi��ki, czy jest to jednak mo�liwe? Ka�dego, kto ma na ten temat jakie� refleksje lub pomys�y, prosz� o kontakt.
Je�li zechcesz wi�c, drogi czyTEXniku, zajrze� do moich notatek, to zapraszam. Dzisiaj zapiski z rozdzia�u trzynastego TB ,,Tryby''.
Podobnie jak ka�dy z nas jest w danym momencie w pewnym nastroju, tak TEX jest w pewnym trybie. Istnieje sze�� tryb�w TEX-a:
W zasadzie u�ytkownik nie musi zastanawia� si�, w jakim trybie w danym momencie jest TEX. Problemy pojawi� si� dopiero wtedy, gdy ujrzymy komunikat w stylu Nie mo�esz zrobi� czego� w ograniczonym trybie poziomym. Aby unikn�� takich niemi�ych niespodzianek, musimy wiedzie�, w jakim trybie znajduje si� TEX\ w ka�dym dowolnym momencie.
W zasadzie TEX jest w trybie pionowym, gdy tworzy list� pionowych kar, klej�w (np. \vskip) i pude�ek (np. \vbox). Pude�ka i kleje umieszczane s� jedno pod drugim na stronie. Tryb poziomy tworz� kary, kleje (np. \hskip) i pude�ka poziome umieszczane jedno za drugim, tworz�c akapit. Tryb matematyczny tworz� wszystkie elementy umieszczone mi�dzy znakami dolara `$'.
Na samym pocz�tku TEX znajduje si� w trybie pionowym i jest gotowy do tworzenia listy pionowej (a potem strony). Je�li utworzymy klej, kar� lub pude�ko, TEX zacznie umieszcza� je jedno za drugim. Sp�jrzmy na kr�tki �r�d�owy pliczek plain-TEX-owy:
1 Gda�sk 1996 2 \vskip 1cm 3 \centerline {GUST} 4 \medskip 5 Co to jest \TeX? 6 \vfil 7 \break 8 $x$ 9 \bye
Praktycznie ka�da linijka tego pliku tworzy osobny element na li�cie pionowej. Prze�led�my, w jakie tryby w�a�ciwie ,,wpada�'' TEX.
Z przedstawionego przyk�adu wynikaj� pewne og�lne wnioski. Gdy TEX znajduje si� w trybie pionowym lub wewn�trzynym trybie pionowym, to pierwszy �eton nowego akapitu zmienia tryb na poziomy. Tryb ten utrzymuje si� a� do zako�czenia akapitu. Inaczej m�wi�c obiekty typu poziomego automatycznie zmieniaj� tryb pionowy na poziomy. Dzieje si� tak w�wczas, gdy napiszemy jakikolwiek znak (kategoria 11.) lub pojawi si� kt�ry� z �eton�w \char, \accent, \hskip, \_, \vrule, czy te� znak pocz�tku trybu matematycznego `$'. Id�c dalej, TEX wstawi pude�ko o szeroko�ci wci�cia akapitowego i odczyta jeszcze raz dany �eton ju� w trybie poziomym.
Istnieje mo�liwo�� celowego zmuszenia TEX-a do przej�cia w tryb poziomy. Nieufnym proponuj� makra \indent i \noindent, kt�re zmieniaj� tryb na poziomy oraz odpowiednio tworz� lub zakazuj� utworzenia wci�cia akapitowego. \indent wstawia na pocz�tku akapitu puste pude�ko o szeroko�ci \parindent (domy�lnie jest to 20pt). Dlatego te� ci�g niewinny \indent \indent spowoduje wstawienie podw�jnego wci�cia. Analogiczny ci�g\break \noindent \noindent nie spowoduje nic, poza tym co zrobi pojedynczy \noindent.
Je�li umie�cimy
\hbox{...} w trybie poziomym, TEX z�o�y akapit
uwzgl�dniaj�c w nim pude�ko poziome (na przyk�ad TEX nigdy nie z�amie
takiego pude�ka). Podobnie je�li umie�cimy \hbox{...} w trybie
pionowym, TEX z�o�y stron� uwzgl�dniaj�c takie pude�ko.
No dobrze, ale jak rozpocz�� akapit pude�kiem \hbox{...}?
Kilka linijek wy�ej udzielono w�a�ciwie odpowiedzi na to pytanie. Mo�na zastosowa� konstrukcj� typu \indent \hbox{...}, nie jest to jednak zbyt rozs�dne. Wyobra�my sobie bowiem, �e chcemy zdefiniowa� makro, kt�re rozwija si� do hbox-a. Ponadto chcemy, aby dzia�a�o poprawnie zar�wno na pocz�tku, jak i w �rodku akapitu --- w takim wypadku u�ycie makra \indent nie jest zach�caj�ce.
Plain TEX posiada z�oty �rodek, jakim jest makro \leavevmode, kt�re rozwija si� do \unhbox \voidbox.
W typowych publikacjach TEX wi�kszo�� czasu sp�dza w trybie poziomym, sk�adaj�c akapity. Na kr�tko robi wycieczki do trybu pionowego pomi�dzy nimi. Akapit ko�czy si�, gdy u�ytkownik wyda polecenie \par lub pozostawi w pliku �r�d�owym pust� lini� (pusta linia jest zamieniana na \par wed�ug zasad z rozdzia�u 8. TB). Akapit uda si� tak�e zako�czy�, wydaj�c polecenie \vskip 1cm (patrz linia 2. powy�szego przyk�adu). Nie musimy wpisywa� w�wczas komendy \par, gdy� klej pionowy vskip oczywi�cie nie mo�e by� cz�ci� akapitu i spowoduje przej�cie TEX-a do trybu pionowego.
Prze��cznik trybu matematycznego (�eton `$') umieszczony w trybie
poziomym spowoduje, �e TEX ,,zanurkuje'' w tryb matematyczny do czasu
napotkania drugiego �etonu `$'. TEX do��czy formu�� matematyczn�
do akapitu i powr�ci do trybu poziomego. Na przyk�ad
My�l� ..., wi�c jestem.
R�nimy si� o $\varepsilon$.
$\alpha$-Centauri
Inaczej jest w eksponowanym trybie matematycznym. Je�li u�yjemy pod rz�d dw�ch �eton�w `$$', TEX przerwie sk�adanie akapitu (dokona przy tym r�nych oblicze�, na przyk�ad wyliczy sobie d�ugo�� ostatniej linijki poprzedzaj�cej wz�r) i wy�le dotychczas z�o�on� cz�� akapitu na list� pionow�. Wskoczy nast�pnie w tryb matematyczny eksponowany, z�o�y formu�� (koniec formu�y oznaczamy kolejn� par� �eton�w `$$') i powr�ci do trybu poziomego. Je�li akapit nie zosta� zako�czony, TEX dalej b�dzie go sk�ada�. Na przyk�ad
Liczba $$\pi \approx 3.1415926536$$ jest bardzo wa�na.spowoduje z�o�enie nast�puj�cego akapitu:
W ograniczony tryb poziomy TEX wpada, gdy zastosujemy \hbox lub \halign. W p�niejszych rozwa�aniach (patrz te� rozdzia�y 12. i 21. TB) dowiemy si� bardziej szczeg�owo, i� r�nice mi�dzy wywn�trznym trybem pionowym a trybem pionowym oraz ograniczonym trybem poziomym a trybem poziomym s� niewielkie. Jadnak trzeba pami�ta�, �e tryb�w tych TEX u�ywa do r�nych cel�w. h4> R�ny nastr�j w r�nym trybie Gdy TEX po�yka �eton, musi podj�� decyzj�, co z nim zrobi�. Decyzja TEX-a w znacznym stopniu zale�y od trybu, w jakim si� znajduje.
Przyk�adowo makro \break dzia�a zupe�nie inaczej w trybie pionowym (�amie stron� --- patrz powy�szy przyk�ad) i poziomym (�amie linijk� akapitu). Dwa znaki `$$' u�yte w trybie poziomym spowoduj� przej�cie TEX-a do trybu matematycznego eksponowanego, ale u�ycie ich w ograniczonym trybie poziomym spowoduje utworzenie pustej matematycznej formu�y i mo�e powodowa� komunikaty o b��dach. TEX korzysta z faktu, �e niekt�re operacje s� niedopuszczalne w danym trybie, i pozwala nam unika� b��d�w, kt�re mog� pojawia� si� w naszych dokumentach.
TEX b�d�c w danym trybie, zwykle przerywa prac�, aby wykona� jakie� zadanie w innym, a nast�pnie wraca do trybu pierwotnego. Na przyk�ad u�ycie `\hbox{' w dowolnym trybie ,,wrzuca'' TEX-a w ograniczony tryb poziomy do czasu napotkania nawiasu zamykaj�cego `}'. W tym sensie TEX mo�e znajdowa� si� w kilku trybach naraz, jednak spos�b dzia�ania TEX-a zale�y od trybu, w kt�rym jest w danym momencie ,,najg��biej''; tryby zewn�trzne, w kt�rych jest zagnie�d�ony, nie obchodz� go.
Zdarzy� si� mo�e, �e zupe�nie nie wiemy, w jakim trybie znajduje si� TEX. Co wtedy zrobi�? Najlepiej zapyta� o to najwi�kszego eksperta w tych sprawach, czyli samego TEX-a. Sp�jrzmy na plik tryby.tex:
\tracingcommands=1 \hbox{ $ \vbox{ \noindent$$ x\showlists $$}$}\bye \endverbatimPierwsza linia tego pliku zmusza TEX-a do zapisywania w pliku tryby.log informacji o ka�dej komendzie, kt�r� napotka (TEX robi tak, gdy warto�� \tracingcommands jest dodatnia). Oto jakie nowe informacje pojawi� si� w pliku tryby.log:
{vertical mode: \hbox} {restricted horizontal mode: blank space} {math shift character $} {math mode: blank space} {\vbox} {internal vertical mode: blank space} {\noindent} {horizontal mode: math shift character $} {display math mode: blank space} {the letter x}
A wi�c wiadomo�ci s� nast�puj�ce:
TEX, b�d�c w trybie pionowym, ujrza� �eton \hbox, co zmusi�o go do wej�cia w ograniczony tryb poziomy.
Pierwszym �etonem, jaki ujrza�, by�a spacja, jako �e koniec linii oznacza dla TEX-a w�a�nie spacj� (patrz koniec linii 2.)
B�d�c ci�gle w ograniczonym trybie poziomym zobaczy� prze��cznik trybu matematycznego --- �eton `$', co spowodowa�o przej�cie do trybu matematycznego.
Pierwszym �etonem jaki ujrza� by�a znowu spacja, kt�ra w tym trybie nic nie znaczy --- jest ignorowana.
Nast�pnie TEX napotyka na �eton \vbox, czyli witamy w wewn�trznym trybie pionowym, aby po ujrzeniu �etonu \noindent wej�� w tryb poziomy.
Niezbyt d�ugo trwa� ten stan, gdy� dwa znaki $$ zanurzy�y TEX-a w eksponowany tryb matematyczny. Bul, bul, bul\dots
Bardzo interesuj�ca staje si� zawarto�� pliku tryby.log po komendzie \showlists. Jest to kolejna bardzo u�yteczna mo�liwo�� �ledzenia poczyna� TEX-a. Dzi�ki niej mo�emy dowiedzie� si� rzeczy, kt�re TEX zwykle trzyma w ukryciu.
\showlists powoduje bowiem wypisanie list, kt�re buduje TEX w aktualnym trybie oraz we wszystkich trybach nadrz�dnych (czyli tych, w kt�rych zawiera si� tryb aktualny).
### display math mode entered at line 5 \mathord .\fam1 x ### internal vertical mode entered at line 4 prevdepth ignored ### math mode entered at line 3 ### restricted horizontal mode entered at line 2 \glue 3.33333 plus 1.66666 minus 1.11111 spacefactor 1000 ### vertical mode entered at line 0 prevdepth ignored
Zauwa�my, �e w momencie, gdy pojawi�o si� \showlists (linia 6.), TEX zd��y� ju� pi�� razy zmieni� tryb. Trybem bie��cym w linii 6. jest eksponowany tryb matematyczny (patrz linia 5.), kt�ry zawiera jeden znak `x' z rodziny 1. (patrz TB rozdzia� 17.).
Rozwa�any przez nas eksponowany tryb matematyczny zawarty jest w wewn�trznym trybie pionowym (linia 4.). Wewn�trzna lista pionowa, kt�r� TEX tworzy w tym trybie, jest pusta --- pojawiaj�ca si� spacja
\vbox{_jest ignorowana. Komunikat:
prevdepth ignoredoznacza, �e warto�� \prevdepth* jest mniejsza lub r�wna -1000pt, wi�c najbli�szy klej mi�dzylinijkowy ( interline glue) w og�le si� nie pojawi (patrz TB rozdzia� 12.).
Wewn�trzny tryb pionowy zawiera si� w trybie matematycznym (linia 3.) --- lista wewn�trzna jest pusta (spacja po znaku `$' jest ignorowana). Pusta natomiast nie jest lista wewn�trzna ograniczonego trybu poziomego (linia 2.), zawiera ona klej. Sk�d si� wzi��? Ot� w tym trybie spacja
\hbox{_nie jest ignorowana.
Ostatecznie wszystko zawiera si� w g��wnym trybie pionowym. Komunikat:
entered at line 0oznacza, �e tryb ten pojawi� si�, zanim TEX zacz�� czyta� plik tryby.tex.
Ciekawostka 1. Czy mo�na stworzy� TEX-em dokument, w kt�rym TEX nigdy nie opuszcza trybu pionowego? Odpowied�: Mo�na, dokument taki sk�ada� si� mo�e z klej�w pionowych \vskip oraz linii utworzonych komend� \hrule.
Ciekawostka 2.
Niekt�re z tryb�w TEX-a nie mog� bezpo�rednio zawiera� innych tryb�w;
na przyk�ad wewn�trzny tryb poziomy nie mo�e zawiera� eksponowanego
trybu matematycznego, nawet je�li formu�a matematyczna ( display)
pojawia si� w �rodku akapitu. Dzieje si� tak, gdy� budowany (w trybie
poziomym) i przerwany akapit jest zawsze ko�czony i usuwany z pami�ci
TEX-a zanim formu�a si� rozpocznie. Czy potrafisz stworzy�
charakterystyk� wszystkich kolejnych par tryb�w, jakie mog� pojawi� si�
w pliku .log po u�yciu komendy \showlists?
Odpowied�:
Pozostawiam ten problem jako rozrywk� umys�ow� dla szanownych
czyTEXnik�w. Powodzenia!
(Odpowied� mo�na znale�� w TB str. 313 zad. 13.5.)
Bardzo dzi�kuj� red. Jackowi Foroma�skiemu za unicestwienie wielu b��d�w czyhaj�cych w tym artykule. CzyTEXnik z pewno�ci� dosta�by zawrotu g�owy, gdyby zobaczy� wersj� przed korekt� Jacka.
** Na ko�cu dokumentu plain-TEX-owego umieszczamy zwykle makro \bye, kt�re jest r�wnowa�ne \vfill \eject \end. Klej \vfill prze��cza TEX-a w tryb pionowy, \eject ko�czy stron�, za� \end ko�czy prac� TEX-a.