diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/tex-virtual-academy-pl/tex/tryby.html')
-rw-r--r-- | Master/texmf-dist/doc/generic/tex-virtual-academy-pl/tex/tryby.html | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/tex-virtual-academy-pl/tex/tryby.html b/Master/texmf-dist/doc/generic/tex-virtual-academy-pl/tex/tryby.html new file mode 100644 index 00000000000..88734e6e390 --- /dev/null +++ b/Master/texmf-dist/doc/generic/tex-virtual-academy-pl/tex/tryby.html @@ -0,0 +1,494 @@ +<html> +<head> +<meta http-equiv="content-type" content="text/html; charset=iso-8859-2"> +<meta http-equiv="Content-language" content="pl"> +<meta name="Author" content="Włodzimierz Macewicz"> +<meta name="Keywords" content="tex, tryby pracy, Wirtualna Akademia"> +<title>Luka w mojej T<sub>E</sub>X-owej wiedzy</title> + +</head> +<body> +<h2>Luka w mojej T<sub>E</sub>X-owej wiedzy</h2> + +<p> +Uczymy się T<sub>E</sub>X-a przez lata, jednak bardzo trudno cokolwiek zrobić bez +dobrej książki na biurku. Mimo iż uczę się T<sub>E</sub>X-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 <tt>:-(</tt>. + +<p> +Jedyną receptą na moje bolączki stało się robienie notatek z naszej +T<sub>E</sub>X-owej biblii, czyli z <i> The T<sub>E</sub>Xbook</i>. Notatki te +nie są zawsze wierną kopią T<sub>E</sub>Xbook-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. + +<p> +Jeśli zechcesz więc, drogi czyT<sub>E</sub>Xniku, zajrzeć do moich notatek, +to zapraszam. Dzisiaj zapiski z rozdziału trzynastego TB ,,Tryby''. + + +<h3> Tryby </h3> + +<p> +Podobnie jak każdy z nas jest w danym momencie w pewnym nastroju, tak +T<sub>E</sub>X jest w pewnym trybie. Istnieje sześć trybów T<sub>E</sub>X-a: + + +<p> +<ul> + +<li> <i>tryb pionowy</i> (w tym trybie T<sub>E</sub>X tworzy główną listę + pionową \cite{bach95:Rycko:listapionowa}, z której tworzone są + strony) + +<li><i>wewnętrzny tryb pionowy</i> (tworzy listę pionową vbox-a) + +<li><i>tryb poziomy</i> tzw. ,,akapitowy'' (tworzy listę poziomą --- + akapit) + +<li><i>ograniczony tryb poziomy</i> (tworzy listę poziomą, np. hbox-a) + +<li><i>tryb matematyczny</i> (tworzy formuły matematyczne w trybie + poziomym <tt>$...$</tt>) + +<li><i>tryb matematyczny eksponowany</i> (tworzy eksponowane formuły + matematyczne umieszczane w osobnej linii, tymczasowo przerywają + one aktualny akapit --- <tt>$$...$$</tt>) +</ul> + + + +<h4> Sytuacja najprostsza </h4> + +<p> +W zasadzie użytkownik nie musi zastanawiać się, w jakim trybie w danym +momencie jest T<sub>E</sub>X. Problemy pojawią się dopiero wtedy, gdy ujrzymy komunikat +w stylu <i> Nie możesz zrobić czegoś w ograniczonym trybie +poziomym</i>. Aby uniknąć takich niemiłych niespodzianek, musimy wiedzieć, +w jakim trybie znajduje się T<sub>E</sub>X\ w <b>każdym</b> dowolnym momencie. + +<p> +W zasadzie T<sub>E</sub>X jest w trybie pionowym, gdy tworzy listę pionowych +kar, klejów (np. <tt>\vskip</tt>) i pudełek (np. <tt>\vbox</tt>). Pudełka i kleje +umieszczane są jedno pod drugim na stronie. Tryb poziomy tworzą kary, +kleje (np. <tt>\hskip</tt>) i pudełka poziome umieszczane jedno za drugim, +tworząc akapit. Tryb matematyczny tworzą wszystkie elementy umieszczone +między znakami dolara `<tt>$</tt>'. + + +<h4> Sytuacja typowa </h4> + +<p> +Na samym początku T<sub>E</sub>X znajduje się w trybie pionowym i jest gotowy do +tworzenia listy pionowej (a potem strony). Jeśli utworzymy klej, karę lub +pudełko, T<sub>E</sub>X zacznie umieszczać je jedno za drugim. Spójrzmy na +krótki źródłowy pliczek plain-T<sub>E</sub>X-owy: +<pre> +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 +</pre> + +<p> +Praktycznie każda linijka tego pliku tworzy osobny element na liście +pionowej. Prześledźmy, w jakie tryby właściwie ,,wpadał'' T<sub>E</sub>X. + +<p> +<ul> + +<li>Linijka 1. wciągnęła T<sub>E</sub>X-a w tryb poziomy (ach ten Gdańsk!) + +<li>Komenda z linii 2. spowodowała zakończenie akapitu i przejście + w tryb pionowy; wszystko jasne -- mamy tu przecież klej pionowy + +<li>Linia trzecia rozpoczyna się znaną komendą <tt>\centerline</tt> rówoważnej + <tt>\hbox to\hsize</tt>, a więc T<sub>E</sub>X wkracza + w ograniczony tryb poziomy + +<li>W linii 4. znów napotykamy na klej pionowy (przypomnijmy, że + <tt>\medskip</tt> \equiv$ó<tt>\vskip 6pt</tt> <tt>plus 2pt</tt> <tt>minus 2pt</tt>) + +<li>Linia 5. to znów powrót do trybu poziomego + +<li>Linia 6. to klej pionowy (przypomnijmy, że <tt>\vfil</tt> równoważnej + <tt>\vskip 0pt</tt> <tt>plus 1fil</tt>) + +<li>W linii 7. mamy karę, która spowoduje złamanie strony + (<tt>\break</tt> równoważnej <tt>\penalty-10000</tt>) + +<li>Nowa strona rozpocznie się od przejścia do trybu matematycznego + +<li>i bye<a href=#foo0><sup>*</sup></a> +</ul> + + +<p> +Z przedstawionego przykładu wynikają pewne ogólne wnioski. Gdy T<sub>E</sub>X +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 <tt>\char</tt>, <tt>\accent</tt>, <tt>\hskip</tt>, <tt>\_</tt>, <tt>\vrule</tt>, czy też +znak początku trybu matematycznego `<tt>$</tt>'. Idąc dalej, T<sub>E</sub>X wstawi +pudełko o szerokości wcięcia akapitowego i odczyta jeszcze raz dany +żeton już w trybie poziomym. + +<p> +Istnieje możliwość celowego zmuszenia T<sub>E</sub>X-a do przejścia w tryb +poziomy. Nieufnym proponuję makra <tt>\indent</tt> i <tt>\noindent</tt>, które +zmieniają tryb na poziomy oraz odpowiednio tworzą lub zakazują +utworzenia wcięcia akapitowego. <tt>\indent</tt> wstawia na początku akapitu +puste pudełko o szerokości <tt>\parindent</tt> (domyślnie jest to 20pt). +Dlatego też ciąg niewinny <tt>\indent</tt> <tt>\indent</tt> spowoduje wstawienie +podwójnego wcięcia. Analogiczny ciąg\break +<tt>\noindent</tt> <tt>\noindent</tt> nie spowoduje +nic, poza tym co zrobi pojedynczy <tt>\noindent</tt>. + + + +<h4> Jak zacząć akapit od hbox-a </h4> + +<p> +Jeśli umieścimy<br> +<tt>\hbox{...}</tt> w trybie poziomym, T<sub>E</sub>X złoży akapit +uwzględniając w nim pudełko poziome (na przykład T<sub>E</sub>X nigdy nie złamie +takiego pudełka). Podobnie jeśli umieścimy <tt>\hbox{...}</tt> w trybie +pionowym, T<sub>E</sub>X złoży stronę uwzględniając takie pudełko. + +<p> +No dobrze, ale jak +rozpocząć akapit pudełkiem <tt>\hbox{...}</tt>? + +<p> +Kilka linijek wyżej udzielono właściwie odpowiedzi na to pytanie. Można +zastosować konstrukcję typu <tt>\indent</tt> <tt>\hbox{...}</tt>, nie jest to +jednak zbyt rozsądne. Wyobraźmy sobie bowiem, że chcemy zdefiniować makro, +które rozwija się do <tt>hbox</tt>-a. Ponadto chcemy, aby działało poprawnie +zarówno na początku, jak i w środku akapitu --- w takim wypadku użycie +makra <tt>\indent</tt> nie jest zachęcające. + +<p> +Plain T<sub>E</sub>X posiada złoty środek, jakim jest makro <tt>\leavevmode</tt>, które +rozwija się do <tt>\unhbox</tt> <tt>\voidbox</tt>. + + + + +<h3> W ,,trybach'' T<sub>E</sub>X-a </h3> + +<h4> W trybie poziomym i matematycznym </h4> + +<p> +W typowych publikacjach T<sub>E</sub>X 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 <tt>\par</tt> lub +pozostawi w pliku źródłowym pustą linię (pusta linia jest zamieniana na +<tt>\par</tt> według zasad z rozdziału 8. TB). Akapit uda się także zakończyć, +wydając polecenie <tt>\vskip 1cm</tt> (patrz linia 2. powyższego przykładu). +Nie musimy wpisywać wówczas komendy <tt>\par</tt>, gdyż klej pionowy <tt>vskip</tt> +oczywiście nie może być częścią akapitu i spowoduje przejście T<sub>E</sub>X-a do +trybu pionowego. + +<p> +Przełącznik trybu matematycznego (żeton `<tt>$</tt>') umieszczony w trybie +poziomym spowoduje, że T<sub>E</sub>X ,,zanurkuje'' w tryb matematyczny do czasu +napotkania drugiego żetonu `<tt>$</tt>'. T<sub>E</sub>X dołączy formułę matematyczną +do akapitu i powróci do trybu poziomego. Na przykład<br> +<p> +<tt> +Myślę ..., więc jestem. +<p> +Różnimy się o $\varepsilon$. +<p> +$\alpha$-Centauri +</tt> + +<p> +Inaczej jest w eksponowanym trybie matematycznym. +Jeśli użyjemy pod rząd dwóch żetonów `<tt>$$</tt>', T<sub>E</sub>X 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 `<tt>$$</tt>') i powróci do trybu poziomego. Jeśli akapit +nie został zakończony, T<sub>E</sub>X dalej będzie go składał. Na przykład +<pre> +Liczba $$\pi \approx 3.1415926536$$ +jest bardzo ważna. +</pre> +spowoduje złożenie następującego akapitu: + +<p> + +<hr> +\smallskip +Liczba <br> +\pi \approx 3.1415926536<br> +jest bardzo ważna. +<hr> +<p> + +<h4>W wewnętrznym trybie pionowym </h4> + +T<sub>E</sub>X wędruje do wewnętrznego trybu pionowego, gdy użyjemy jednej +z komend <tt>\vbox</tt>, <tt>\vtop</tt>, <tt>\vcenter</tt>, <tt>\valign</tt>, <tt>\vadjust</tt>, <tt>\insert</tt>. + +<p> +W ograniczony tryb poziomy T<sub>E</sub>X wpada, gdy zastosujemy <tt>\hbox</tt> lub +<tt>\halign</tt>. 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 +T<sub>E</sub>X używa do różnych celów. + + + +h4> Różny nastrój w różnym trybie </h4> + +Gdy T<sub>E</sub>X połyka żeton, musi podjąć decyzję, co z nim zrobić. Decyzja +T<sub>E</sub>X-a w znacznym stopniu zależy od trybu, w jakim się znajduje. + +<p> +Przykładowo makro <tt>\break</tt> działa zupełnie inaczej w trybie pionowym +(łamie stronę --- patrz powyższy przykład) i poziomym (łamie linijkę +akapitu). Dwa znaki `<tt>$$</tt>' użyte w trybie poziomym spowodują przejście +T<sub>E</sub>X-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. + +T<sub>E</sub>X 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. + +<p> +T<sub>E</sub>X 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 `<tt>\hbox{</tt>' w dowolnym trybie ,,wrzuca'' T<sub>E</sub>X-a w ograniczony tryb +poziomy do czasu napotkania nawiasu zamykającego `<tt>}</tt>'. W tym sensie +T<sub>E</sub>X może znajdować się w kilku trybach naraz, jednak sposób +działania T<sub>E</sub>X-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. + +<p> +Zdarzyć się może, że zupełnie nie wiemy, w jakim trybie znajduje się +T<sub>E</sub>X. Co wtedy zrobić? Najlepiej zapytać o to największego eksperta w tych +sprawach, czyli samego T<sub>E</sub>X-a. Spójrzmy na plik <tt>tryby.tex</tt>: +<pre> +\tracingcommands=1 +\hbox{ +$ +\vbox{ +\noindent$$ +x\showlists +$$}$}\bye +\endverbatim +</pre> +Pierwsza linia tego pliku zmusza T<sub>E</sub>X-a do zapisywania w pliku +<tt>tryby.log</tt> informacji o każdej komendzie, którą napotka (T<sub>E</sub>X robi tak, +gdy wartość <tt>\tracingcommands</tt> jest dodatnia). Oto jakie nowe informacje +pojawią się w pliku <tt>tryby.log</tt>: + +<p> + +<pre> +{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} +</pre> +<p> + +A więc wiadomości są następujące: + +<p> +T<sub>E</sub>X, będąc w trybie pionowym, ujrzał żeton <tt>\hbox</tt>, co zmusiło go do +wejścia w ograniczony tryb poziomy. + +<p> +Pierwszym żetonem, jaki ujrzał, była spacja, jako że koniec linii oznacza +dla T<sub>E</sub>X-a właśnie spację (patrz koniec linii 2.) + +<p> +Będąc cięgle w ograniczonym trybie poziomym zobaczył przełącznik trybu +matematycznego --- żeton `<tt>$</tt>', co spowodowało przejście do trybu +matematycznego. + +<p> +Pierwszym żetonem jaki ujrzał była znowu spacja, która w tym trybie +nic nie znaczy --- jest ignorowana. + +<p> +Następnie T<sub>E</sub>X napotyka na żeton <tt>\vbox</tt>, czyli witamy w wewnętrznym +trybie pionowym, aby po ujrzeniu żetonu <tt>\noindent</tt> wejść w tryb poziomy. + +<p> +Niezbyt długo trwał ten stan, gdyż dwa znaki <tt>$$</tt> zanurzyły T<sub>E</sub>X-a +w eksponowany tryb matematyczny. Bul, bul, bul\dots + +<p> +Bardzo interesująca staje się zawartość pliku <tt>tryby.log</tt> po komendzie +<tt>\showlists</tt>. Jest to kolejna bardzo użyteczna możliwość śledzenia +poczynań T<sub>E</sub>X-a. Dzięki niej możemy dowiedzieć się rzeczy, które T<sub>E</sub>X +zwykle trzyma w ukryciu. + +<p> +<tt>\showlists</tt> powoduje bowiem wypisanie list, które buduje T<sub>E</sub>X +w aktualnym trybie oraz we wszystkich trybach nadrzędnych (czyli tych, +w których zawiera się tryb aktualny). + +<p> +<pre> +### 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 +</pre> + + +<p> +Zauważmy, że w momencie, gdy pojawiło się <tt>\showlists</tt> (linia 6.), T<sub>E</sub>X +zdążył już <b>pięć</b> razy zmienić tryb. Trybem bieżącym w linii 6. jest +eksponowany tryb matematyczny (patrz linia 5.), który zawiera jeden znak +`<tt>x</tt>' z rodziny 1. (patrz TB rozdział 17.). + +<p> +Rozważany przez nas eksponowany tryb matematyczny zawarty jest +w wewnętrznym trybie pionowym (linia 4.). Wewnętrzna lista +pionowa, którą +T<sub>E</sub>X tworzy w tym trybie, jest pusta --- pojawiająca się spacja +<pre> +\vbox{_ +</pre> +jest ignorowana. Komunikat: +<pre> +prevdepth ignored +</pre> +oznacza, że wartość <tt>\prevdepth</tt><a href=#foo><sup>*</sup></a> +jest mniejsza lub równa -1000pt, więc najbliższy klej międzylinijkowy +(<i> interline glue</i>) w ogóle się nie pojawi (patrz TB rozdział 12.). + +<p> +Wewnętrzny tryb pionowy zawiera się w trybie matematycznym (linia 3.) +--- lista wewnętrzna jest pusta (spacja po znaku `<tt>$</tt>' 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 +<pre> +\hbox{_ +</pre> +nie jest ignorowana. + +<p> +Ostatecznie wszystko zawiera się w głównym trybie pionowym. Komunikat: +<pre> +entered at line 0 +</pre> +oznacza, że tryb ten pojawił się, zanim T<sub>E</sub>X zaczął czytać plik +<tt>tryby.tex</tt>. + + + + +<h3> Ciekawostki </h3> + +<p> +<b> Ciekawostka 1.</b> +Czy można stworzyć T<sub>E</sub>X-em dokument, w którym T<sub>E</sub>X nigdy nie opuszcza +trybu pionowego? + +<b>Odpowiedź:</b> +Można, dokument taki składać się może z klejów pionowych +<tt>\vskip</tt> oraz linii utworzonych komendą <tt>\hrule</tt>. + +<p> + + +<b>Ciekawostka 2.</b><br> +Niektóre z trybów T<sub>E</sub>X-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 (<i> display</i>) +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 +T<sub>E</sub>X-a zanim formuła się rozpocznie. Czy potrafisz stworzyć +charakterystykę wszystkich kolejnych par trybów, jakie mogą pojawić się +w pliku <tt>.log</tt> po użyciu komendy <tt>\showlists</tt>? + +<p> + +<b>Odpowiedź:</b><br> +Pozostawiam ten problem jako rozrywkę umysłową dla szanownych +czyT<sub>E</sub>Xników. Powodzenia! +(Odpowiedź można znaleźć w TB str. 313 zad. 13.5.) + +<p> +</i> +Bardzo dziękuję red. Jackowi Foromańskiemu za unicestwienie wielu błędów +czyhających w tym artykule. CzyT<sub>E</sub>Xnik z pewnością dostałby zawrotu +głowy, gdyby zobaczył wersję przed korektą Jacka. +</i> + + +<h3>Bibliografia</h3> + + +<dl> +<dt>[1] Grupa Użytkowników Systemu T<sub>E</sub>X. +<i> Lista pionowa</i>. Marek Ryćko, Kwiecień 1995. + III Konferencja w Bachotku 1995. +<p> +<dt>[2] Donald E. Knuth. +<i> The T<sub>E</sub>Xbook</i>. +Addison-Wesley, 1984. +</dl> + + +<p> + +<hr width=20% align=left> +<a name=foo><sup>*</sup></a> + Specjalny wymiar <tt>\prevdepth</tt> przechowuje głębokość + ostatniego pudełka z listy pionowej.<p> +<a name=foo0><sup>**</sup></a> +Na końcu dokumentu plain-T<sub>E</sub>X-owego umieszczamy zwykle makro <tt>\bye</tt>, +które jest równoważne <tt>\vfill</tt> <tt>\eject</tt> <tt>\end</tt>. Klej <tt>\vfill</tt> przełącza +T<sub>E</sub>X-a w tryb pionowy, <tt>\eject</tt> kończy stronę, zaś <tt>\end</tt> kończy pracę +T<sub>E</sub>X-a.<p> + +<hr> +<a href=../index.html><img src="../gify/lew-7vs.gif" hspace=10 border=0 align=left></a> +<a href=http://www.gumbeers.elka.pg.gda.pl/WA><img src="../gify/wa.gif" hspace=10 align=left></a> +<a href=mailto:W.Macewicz@ia.pw.edu.pl><img src="../gify/mail.gif" hspace=10 align=left></a> +Zredagował</br> +<a href=http://home.elka.pw.edu.pl/~macewicz/index.html>Włodzimierz Macewicz</a> +<br clear=all> +<hr> +Ostatnie zmiany: 07.04.2001. + +</body +</html> |