Luka w mojej TEX-owej wiedzy

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''.

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:

Sytuacja najprostsza

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 `$'.

Sytuacja typowa

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\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.

Jak zacz�� akapit od hbox-a

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 ,,trybach'' TEX-a

W trybie poziomym i matematycznym

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:


\smallskip Liczba
\pi \approx 3.1415926536
jest bardzo wa�na.

W wewn�trznym trybie pionowym

TEX w�druje do wewn�trznego trybu pionowego, gdy u�yjemy jednej z komend \vbox, \vtop, \vcenter, \valign, \vadjust, \insert.

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
\endverbatim
Pierwsza 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 ignored
oznacza, �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 0
oznacza, �e tryb ten pojawi� si�, zanim TEX zacz�� czyta� plik tryby.tex.

Ciekawostki

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.

Bibliografia

[1] Grupa U�ytkownik�w Systemu TEX. Lista pionowa. Marek Ry�ko, Kwiecie� 1995. III Konferencja w Bachotku 1995.

[2] Donald E. Knuth. The TEXbook. Addison-Wesley, 1984.


* Specjalny wymiar \prevdepth przechowuje g��boko�� ostatniego pude�ka z listy pionowej.

** 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.


Zredagowa�: W�odzimierz Macewicz