> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/pl/artykuly-szczegolowe/14-how-do-tex-engines-typeset-tables.md).

# Jak silniki TeX składają tabele

## Jak silniki TeX składają tabele

## Wprowadzenie: O czym traktuje ta seria?

Tworzenie estetycznie atrakcyjnych tabel może być czasochłonnym zadaniem — niezależnie od tego, czy używasz wizualnego narzędzia układu, LaTeX-a czy języka znaczników takiego jak HTML lub markdown. Dla użytkowników LaTeX-a szczególnie składanie tabel zajmuje wysokie miejsce na wielu listach „bolączek”, o czym może świadczyć to, że „tabele” są jednym z najbardziej [często oznaczanych tematów na tex.stackexchange](https://tex.stackexchange.com/tags).

Oprócz odpowiedzi i przykładów na tex.stackexchange nawet pobieżny przegląd dostępnych materiałów pomocniczych dotyczących składu tabel w LaTeX-u ujawnia szereg zasobów informacyjnych związanych z tabelami:

* strony pomocy Overleaf [strony pomocy](https://www.overleaf.com/learn/latex/tables) oraz inne strony, takie jak [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, Comprehensive TeX Network, wymienia ponad [70 pakietów TeX/LaTeX](https://ctan.org/topic/table) związanych z tworzeniem tabel
* całą [książkę o składaniu tabel w LaTeX-u](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* doskonały [internetowy generator tabel LaTeX](https://www.tablesgenerator.com/latex_tables)

Proste wyszukiwanie w Google dla [tabele LaTeX](https://www.google.com/search?q=latex+tables) daje ogromną liczbę wyników, wskazując wiele stron oferujących pomoc, porady, przykłady i wyjaśnienia.

### TeX, nie LaTeX

Biorąc pod uwagę bogactwo literatury dostępnej na temat składu tabel przy użyciu LaTeX-a, czy jest jeszcze coś więcej do napisania o nich — kolejne przykłady tabel i wyliczanie/demonstrowanie poleceń pakietów? Czy istnieje sposób podejścia do tematu składu tabel, który wydobywa lub koncentruje się na fundamentalnych zasadach i pojęciach składu tabel? Istnieje, ale wymaga to obierania cebuli LaTeX-a…

Zdecydowaliśmy się przygotować serię artykułów, które mają dostarczyć czytelnikom informacji wprowadzających i wyjaśnień dotyczących leżącej u podstaw *mechaniki* składu tabel opartego na TeX-ie. Zamiast skupiać się na składaniu tabel z użyciem konkretnych makr/pakietów LaTeX-a, zbadamy *leżące u podstaw zachowanie* silników TeX: zgłębiamy niskopoziomową maszynerię składu, która stanowi fundament, na którym budowane są polecenia makr LaTeX-a. Ostatecznym celem jest wydobycie i wyjaśnienie podstawowych metod i algorytmów składu tabel opartego na TeX-ie — miejmy nadzieję, że pomoże to czytelnikom/użytkownikom lepiej zrozumieć, dlaczego tabele zachowują się tak, jak się zachowują. Nieuniknioną konsekwencją tego podejścia, polegającego na zdejmowaniu ochronnych warstw izolacji makr LaTeX-a, jest zetknięcie się z chaotycznymi szczegółami niskiego poziomu, od których użytkownicy są zwykle (i z radością) odseparowani przez warstwy kodu makr LaTeX-a.

Przeznaczono wiele czasu na badania, pisanie i ilustrowanie tych artykułów, więc mamy nadzieję, że będą one wartościowym dodatkiem do literatury, dostarczając materiału, który poinformuje czytelników i pomoże im lepiej zrozumieć tę złożoną dziedzinę składu w TeX-u. Należy podkreślić, że ta seria artykułów będzie *nie* zbaczać w stronę omawiania *estetyki* projektowania tabel — to temat pełen subiektywnych preferencji, a spory na jego temat muszą toczyć się gdzie indziej…

### Odkrywanie mechaniki tabel w TeX-ie: Jak można to zrobić?

Aby zgłębiać, a następnie pisać o mechanizmach i procesach niższego poziomu zachodzących w silnikach TeX, takich jak skład tabel, Overleaf zbudował (skompilował) „debugowe” wersje silnika TeX Knutha z użyciem [procesu Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Tradycyjnie budowanie TeX-a obejmuje proces zwany Web2C, używany w TeX Live, który generuje kod C poprzez przekształcanie oryginalnego kodu źródłowego Pascala TeX-a do jego odpowiednika w C. Ten proces generuje kod C, który nigdy nie miał być czytany przez ludzi, lecz jedynie przez kompilatory C. Mechanicznie generowany kod C jest *niezwykle* trudny do odczytania lub modyfikacji do celów eksperymentalnych.

W przeciwieństwie do tego Web2W generuje kod źródłowy C (dostępny [tutaj](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) który jest *o rzędy wielkości* bardziej czytelny niż kod produkowany przez Web2C. W konsekwencji kod źródłowy C Web2W znacznie lepiej nadaje się do modyfikacji w celach nauki/eksperymentów.

Web2W generuje wersję TeX-a („CTeX”), która jest *skrajnie* bliska oryginalnemu programowi Knutha: „CTeX” nie zawiera wielu zmian i ulepszeń wprowadzonych przez proces Web2C — takich jak SyncTeX, przetwarzanie wiersza poleceń i wyszukiwanie plików przez Kpathsea. Chociaż tracisz te cenne ulepszenia, powstały kod C (Web2W) jest stosunkowo łatwy do nawigowania z wykorzystaniem opublikowanego kodu źródłowego TeX-a Knutha, mimo że TeX został napisany w Pascalu.

* **Uwaga na nazewnictwo:** Ściśle rzecz biorąc, nazwa „TeX” może odnosić się wyłącznie do oryginalnego oprogramowania napisanego i opublikowanego przez Donalda Knutha. Wszelkie modyfikacje jego oprogramowania muszą używać innej nazwy dla wynikowego oprogramowania do składu opartego na TeX-ie. Tutaj użyliśmy procesu Web2W, aby zbudować silnik, który w istocie nadal jest oryginalnym oprogramowaniem Knutha. Jednak dla uniknięcia wątpliwości będziemy używać terminu „CTeX” na określenie konkretnej wersji zbudowanej przy użyciu Web2W, ale będziemy też używać „TeX” w znaczeniu albo oryginalnego silnika Knutha, albo ogólnego terminu dla języka składu opartego na zasadach TeX-a Knutha. Mamy nadzieję, że czytelnicy wybaczą ewentualne sporadyczne odstępstwa od rygorystycznego stosowania/używania ściśle poprawnej terminologii: mamy nadzieję, że znaczenie/intencja zostaną przekazane przez kontekst.

Debugową wersję CTeX uruchomiono przy użyciu [środowiska IDE Eclipse](https://www.eclipse.org/downloads/packages/), co umożliwiło obserwację w czasie rzeczywistym przetwarzania kodu C, który implementuje niskopoziomowe prymitywne (wbudowane) polecenia TeX-a oraz algorytmy zaprojektowane przez Knutha do obsługi składu tabel.

Poniższy krótki (ok. 90 sekund) film pokazuje silnik CTeX działający wewnątrz [środowiska IDE Eclipse](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

Oprócz CTeX skompilowaliśmy także e-TeX, aby uzyskać kilka dodatkowych prymitywów nieobecnych w oryginalnym oprogramowaniu Knutha. Chociaż CTeX i e-TeX są już dziś starymi silnikami opartymi na TeX-ie, nadal nadają się jako podstawa do badania mechaniki składu tabel, ponieważ te leżące u podstaw zasady nadal mają zastosowanie do wszystkich silników składu opartych na TeX-ie.

### Dlaczego używać starszego silnika TeX do badania tabel?

Po pierwsze, drukowana książka, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), która wymienia i wyjaśnia kod źródłowy TeX-a, pozostaje niezwykle wygodnym przewodnikiem po mętnych wodach wewnętrznego działania TeX-a, mimo że została opublikowana ponad 30 lat temu (1986). Oczywiście możesz samodzielnie składać dokumentację kodu źródłowego TeX-a, na przykład zobacz projekt Overleaf [Skład dokumentacji kodu źródłowego TeX, e-TeX lub pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Od czasu publikacji TeX:The Program w 1986 roku wyewoluowały nowe silniki TeX, w tym pdfTeX, XeTeX i LuaTeX, wszystkie wprowadzające funkcje i polecenia, które nie są udokumentowane w TeX:The Program po prostu dlatego, że nie były obecne w oryginalnym oprogramowaniu Knutha.

W przypadku wielu podstawowych procesów, takich jak skład tabel w TeX-ie, kod udokumentowany w TeX:The Program nadal pozostaje istotny jako podstawa do badań — mimo że kod źródłowy TeX-a jest napisany w Pascalu. Ponadto TeX Knutha jest stosunkowo łatwy i szybki do kompilacji — zwłaszcza za pośrednictwem niezwykle użytecznego [procesu Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) opracowanego przez Martina Ruckerta. Łatwość/szybkość kompilacji sprawiają, że znacznie wygodniej jest wprowadzać do TeX-a proste modyfikacje — takie jak tworzenie grafiki SVG używanej później w tej serii artykułów.

### Zrozumienie różnicy między TeX-em a LaTeX-em

Wielu czytelników już wie, że LaTeX tak naprawdę nie jest *wykonywalnym* programem do składu, lecz dużym zbiorem poleceń (*makr*), które ostatecznie są napisane w niższopoziomowym języku składu/programowania zwanym TeX. Twój kod LaTeX generuje składany wynik dopiero po przetworzeniu przez wykonywalny program zwany *silnikiem TeX*— oprogramowaniem, które stoi pomiędzy twoim kodem LaTeX (dokumentem) a złożonym plikiem PDF. Dziś użytkownicy mogą wybierać spośród różnych silników TeX do składu kodu LaTeX, w tym pdfTeX, XeTeX i odmian LuaTeX.

Osoby nowe w ekosystemie TeX/LaTeX często, i zrozumiale, są zdezorientowane nadmiarem brzmiących tajemniczo nazw używanych dla napotykanych narzędzi: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX i LuaLaTeX. Jeśli czujesz to samo, pomoc jest pod ręką w artykule Overleaf [What’s in a Name: A Guide to the Many Flavours of TeX](/latex/pl/artykuly-szczegolowe/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) który wyjaśnia pochodzenie i znaczenie wszystkich tych terminów.

#### Dialekty i prymitywy TeX-a

Każdy silnik TeX ma zestaw wbudowanych poleceń zwanych *prymitywów* które łącznie tworzą „dialekt” tego silnika języka składu TeX, odzwierciedlając możliwości wbudowane w każdy silnik. Tutaj termin „prymityw”, używany do opisywania wbudowanych poleceń silników TeX, nie *nie* oznacza, że te polecenia są podstawowe lub proste, lecz że są fundamentalne i niepodzielne: nie są zbudowane z innych poleceń (w przeciwieństwie do makr). Wszystkie silniki TeX mają duży wspólny zestaw prymitywów, ale niektóre zawierają prymitywy specyficzne dla danego silnika — co prowadzi do pojęcia „dialektu” TeX-a.

Niezależnie od tego, który silnik TeX jest używany do składu dokumentu LaTeX, jego zadaniem jest przetwarzanie („wykonywanie”) zbioru poleceń LaTeX (tj. makr) użytych do napisania i zbudowania dokumentu. W praktyce silnik TeX „konwertuje” twój kod LaTeX (makra) *z powrotem do* ich składowych poleceń prymitywnych silnika TeX, które silnik może wykonywać, aby wykonać właściwy skład. Nie *masz* musisz *używać poleceń LaTeX do składu dokumentów za pomocą silników TeX —* możesz *zdecydować się na tworzenie dokumentów wyłącznie za pomocą prymitywów TeX, czyli bezpośrednio w niskopoziomowym* języku programowania TeX

Aby uniknąć konieczności pisania bezpośrednio w języku TeX lub ciągłego przepisywania tej samej serii poleceń, silniki TeX pozwalają tworzyć „skróty” zwane *makr*. Tworząc makra, definiujesz własne polecenia, które pakują potencjalnie długie i złożone sekwencje prymitywów języka TeX (lub innych makr) w jedno „wyższego poziomu” polecenie. Programiści TeX-a mogą pisać bardzo zaawansowane makra, które zawierają w sobie ogrom funkcjonalności w jednym poleceniu — takich jak polecenia dostarczane przez LaTeX. Korzystając z pakietów makr, takich jak LaTeX (lub [ConTeXt](https://wiki.contextgarden.net/Main_Page)), autorzy dokumentów są (w większości) odizolowani od wielu żmudnych szczegółów, co pozwala im skupić się na pisaniu i składzie, zamiast nieustannie zmagać się ze złożonością i niuansami języka TeX.

## Na początku…

Wraz z projektowaniem algorytmów do składu matematyki i zaawansowanego łamania wierszy Knuth stanął przed wyzwaniem zaprogramowania swojego oprogramowania TeX tak, aby składało tabele. Oczywiście każdy algorytm tworzenia tabel nie może być nadmiernie restrykcyjny, ponieważ frustrowałoby to użytkowników, którzy potrzebują swobody tworzenia niemal nieskończonej gamy układów tabel. Ponadto komórki tabeli mogą zawierać szeroki zakres treści, w tym matematykę, grafikę i fragmenty tekstu łamane w ładnie złożone wiersze — w zasadzie wszystko, co TeX jest w stanie składać. Zapewnienie tej elastyczności wymaga, aby algorytmy budowania tabel w TeX-ie współpracowały z innymi częściami mechanizmu składu TeX-a.

Jednak silniki TeX pobierają za elastyczność oferowaną przez swoje możliwości budowania tabel pewną cenę: liczne subtelności i niuanse w niskopoziomowym zachowaniu wbudowanych (prymitywnych) poleceń składu tabel, których jest 9:

* **`\halign`**, **`\valign`**: podstawowe polecenia budowania tabel
* **`\tabskip`**: klej umieszczany między kolumnami \halign lub wierszami \valign
* **`\cr`**: obowiązkowy terminator typu „carriage return” dla wszystkich wierszy w tabeli
* **`\noalign`**: wstrzykuje materiał między wierszami \halign lub kolumnami \valign
* **`\everycr`**: polecenia (rejestr tokenów) do odczytania po wykryciu \cr
* **`\span`**: polecenie o podwójnej funkcji: \span tworzy komórki rozciągające się na wiele kolumn lub wierszy albo rozwija polecenia w preambule tabeli (rozważymy to szczegółowo)
* **`\omit`**: pomija szablony dla określonej komórki
* **`\crcr`**: używane w makrach, aby uniknąć błędów, jeśli użytkownicy zapomną o wymaganym \cr

Napotkamy te polecenia podczas naszej podróży przez budowę tabel.

### Odległe echa wyzwań

Ukryte w [kodzie źródłowym TeX-a](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) znajduje się dość onieśmielające wprowadzenie do tematu implementacji niskopoziomowych poleceń \halign i \valign zaprojektowanych do składu tabel:

> „To trochę cud, gdy \halign i \valign działają, ponieważ przecinają tak wiele struktur kontrolnych TeX-a. Dlatego ta strona prawdopodobnie nie jest najlepszym miejscem, od którego początkujący powinien zacząć czytać ten program; lepiej najpierw opanować wszystko inne.”

Knuth mówi dalej

> „Zauważ, że w miarę przetwarzania \halign bez obaw oddajemy kontrolę reszcie TeX-a. W kluczowych momentach rutyna wyrównywania jest wywoływana, by wkroczyć i wykonać jakiś drobny czyn, ale przez większość czasu te rutyny po prostu czają się w tle. To coś w rodzaju sugestii posthipnotycznej.”

Z tych komentarzy wydaje się rozsądne wywnioskować, że nawet dla Knutha implementacja składu tabel w TeX-ie była „pewnym wyzwaniem” — zapewnienie użytkownikowi kontroli i elastyczności, a jednocześnie zagwarantowanie, że zautomatyzowane algorytmy budowania tabel TeX-a są dobrze skoordynowane z podstawowymi procesami składu TeX-a.

Autor bez wahania poświadcza złożoność kodu i algorytmów stojących za możliwościami składu tabel w TeX-ie, ale także podziw dla ogromu funkcjonalności zawartej w stosunkowo niewielkiej ilości, choć gęstego, kodu Pascala (lub C).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/pl/artykuly-szczegolowe/14-how-do-tex-engines-typeset-tables.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
