> 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/15-how-do-tex-engines-typeset-tables-2.md).

# Jak silniki TeX składają tabele 2

## Jak silniki TeX-a składają tabele 2

## Silniki TeX-a określają tabele jako wyrównania

W obrębie [dokumentacja kodu źródłowego TeX-a](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth nie omawia zdolności TeX-a do „składania tabel”, lecz zamiast tego opisuje algorytmy TeX-a służące do konstruowania tzw. *wyrównań*. Składanie tabel przez TeX-a jest w praktyce zautomatyzowanym procesem wyrównywania pudełek: układaniem pudełek (komórek tabeli, wierszy i kolumn) tak, aby uzyskać estetyczną prostokątną siatkę lub macierz — choć oczywiście, jako że to TeX, istnieją *wieloma* niuansy w tym procesie.

Termin „wyrównanie” znajduje też odzwierciedlenie w nazwach dwóch wbudowanych w wszystkie silniki TeX-a poleceń do składania tabel:

* `\halign` (wyrównanie poziome), i
* `\valign` (wyrównanie pionowe).

Omówimy oba polecenia w całej serii artykułów, zaczynając od bardziej formalnego przeglądu formatu/struktury `\halign` i `\valign` poleceń, aby stworzyć podstawy pod późniejsze, bardziej szczegółowe artykuły w tej serii.

### Tabele TeX-a to pudełka i odstępy

Poszczególne komórki tabeli zwykle zawierają różne treści, takie jak linie tekstu, elementy matematyczne lub grafiki, co daje zestaw komórek tabeli o różnych szerokościach, wysokościach lub głębokościach składanego materiału. TeX musi jakoś pracować z tymi komórkami o różniących się wymiarach treści, aby skonstruować końcową tabelę, w której każdy wiersz ma określoną wysokość, a każda kolumna konkretną szerokość. TeX musi wywnioskować odpowiednie wartości wysokości każdego wiersza i szerokości każdej kolumny na podstawie zbioru komórek tabeli o zmiennych rozmiarach.

Jednak TeX nie może poznać rzeczywistego rozmiaru treści każdej komórki, dopóki ta treść nie zostanie złożona; w konsekwencji TeX przechodzi przez całą tabelę, składając każdą komórkę, aby uzyskać dane o rozmiarach potrzebne do ukończenia układu tabeli. Na podstawie tych danych o rozmiarze TeX może określić poprawną wysokość każdego wiersza i szerokość każdej kolumny. TeX może też napotkać puste komórki albo komórki, które użytkownik chce rozciągnąć na wiele kolumn lub wiele wierszy, a TeX musi to wszystko starannie uwzględnić w swoich obliczeniach. Dopiero po „przefiltrowaniu” tego zróżnicowanego zbioru danych o rozmiarach komórek (pudełek) TeX jest w stanie wyznaczyć końcowe wartości szerokości kolumn w `\halign`, lub wysokości wierszy dla `\valign` i używa tych wartości w końcowych etapach swoich algorytmów układu tabel.

W praktyce, „pod maską”, składanie tabel przez TeX-a składa się z kilku etapów. W zarysie TeX najpierw składa „roboczą” lub „niepełną” wersję tabeli, jednocześnie zbierając i przetwarzając dane o rozmiarach komórek — oraz dane o wszelkich `\span` poleceniach użytych w tabeli. `\halign` szerokości kolumn lub `\valign` wysokości wierszy i uzyskać gotowy układ — a wszystko to omówimy w tej serii artykułów.

## \halign i \valign: dwa sposoby konstruowania tabel

Wszystkie silniki TeX-a udostępniają dwa *wbudowane* polecenia (prymitywy) przeznaczone do składania tabel (wyrównań): `\halign` i `\valign`, które mają wiele wspólnych cech, ale różnią się też w kilku zasadniczych aspektach. Kluczowa różnica między `\halign` i `\valign` polega na tym, jak konstruują swoje tabele: wiersz po wierszu czy kolumna po kolumnie:

* `\halign`: składa tabele w układzie wiersz-po-wierszu, tworząc pojedyncze wiersze, które są układane pionowo, aby utworzyć kolumny tabeli
* `\valign`: składa tabele w układzie kolumna-po-kolumnie, tworząc pojedyncze kolumny, które są układane poziomo, aby utworzyć wiersze tabeli

### \halign

Poniższy diagram przedstawia konstrukcję tabeli utworzonej przez `\halign`. Tabela jest składana wiersz po wierszu, a poszczególne wiersze są układane pionowo. Niektóre konsekwencje tego są następujące:

* kolumny tabeli powstają z pionowego układania wierszy tabeli
* podziały strony mogą występować między wierszami tabeli
* materiał nietabelaryczny można wstawiać między wierszami (za pomocą `\nolign`, któremu przyjrzymy się później)

![](/files/596c632ea24e10a6df37ca7d90da278d3df25ef7)

### \valign

Poniższy diagram przedstawia konstrukcję tabeli utworzonej przez `\valign`. Tabela jest składana kolumna po kolumnie, a poszczególne kolumny są układane poziomo (obok siebie). Niektóre konsekwencje tego są następujące:

* wiersze tabeli powstają z poziomego układania kolumn tabeli
* złamania linii mogą występować między kolumnami tabeli
* materiał nietabelaryczny można wstawiać między kolumnami (za pomocą `\noalign`, któremu przyjrzymy się później)

![](/files/64d2ac5d23ee2417f89f319801a7f310277bf5d8)

### Przykłady

Poniższy przykład ma na celu uwydatnienie podejścia wiersz *vs*. kolumnowego w \halign i \valign.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Ściśle dopasowane obramowania pudełek
\setlength{\fboxsep}{0pt}

Oto tabela \verb|\valign|:
\begingroup
% \hsize kontroluje
% szerokości kolumn \valign. Ustawiamy też
% \parindent na mniejszą wartość
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % Preambuła: omówiona później (bardzo szczegółowo!)
A&B&C\cr % Pierwsza KOLUMNA tej tabeli \valign
D&E&F\cr
G&H&I\cr
}}
\endgroup

% Uwaga: z powodów wyjaśnionych później
% \halign musi zostać umieszczony w \vbox
Oto tabela \verb|\halign|: \fbox{%
\vbox{\halign{
#&#&#\cr % Preambuła: omówiona później (bardzo szczegółowo!)
A&B&C\cr % Pierwszy WIERSZ tej tabeli \halign
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik: ![](/files/04d160b370b8837c6c99a0ce5c5b82a0a1f8eae0)

Poniższa grafika pokazuje opatrzoną adnotacjami wersję tabel wygenerowanych przez powyższy kod. Później w tej serii artykułów omówimy takie zagadnienia jak:

* czym są preambuły tabel?
* dlaczego ustawiamy `\hsize` i `\parindent` dla `\valign` tabele?

Na razie wystarczy zauważyć podejście wiersz kontra kolumna w `\halign` *vs*. `\valign` konstrukcji tabeli:

![](/files/47da2775adb95f1d6361566df6ec28afa4b5b1d7)

## Ogólna postać \halign i \valign

Na początek omówimy podstawowe właściwości i ogólny format `\halign` i `\valign` ale (jeszcze) nie będziemy wchodzić w żadne szczegóły. [Jak zaznaczono](#intro), przyjmujemy nieco formalny przegląd formy/struktury `\halign` i `\valign` poleceń, aby położyć fundamenty pod kolejne artykuły w tej serii.

Najbardziej ogólna postać `\halign` i `\valign` poleceń może być zapisana następująco:

`\halign` $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`ciało`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`ciało`⁠$$\rangle$$ }

Jak widać, oba `\halign` i `\valign` składają się z trzech głównych sekcji:

* [$$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`preambule`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`ciało`⁠$$\rangle$$](#body)

## Ta $$\langle$$⁠opcjonalna specyfikacja⁠$$\rangle$$

Domyślny rozmiar/zasięg tabeli, jej tak zwany „naturalny rozmiar”, jest określany przez jej zawartość — dla jasności, przez rozmiar/zasięg rozumiemy tutaj

* stronie *szerokość* tabeli utworzonej przez `\halign`, lub
* stronie *wysokość* tabeli utworzonej przez `\valign`

Dodatek $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ może służyć do „nadpisania” naturalnego rozmiaru tabeli i przyjmuje jedną z dwóch postaci:

* **`na`** $$\langle$$**⁠`wymiar`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`wymiar`⁠**$$\rangle$$

gdzie

* $$\langle$$**⁠`wymiar`⁠**$$\rangle$$ jest długością podaną w jednostkach rozumianych przez TeX-a, takich jak pt, mm lub cm — długość może też być podana jako polecenie, które rozwija się do wartości określonej w odpowiednich jednostkach;
* **`na`** i **`spread`** to słowa kluczowe TeX-a określające typ „nadpisania” naturalnego rozmiaru:
  * **`na`**: ustawia rozmiar tabeli na podaną $$\langle$$⁠`wymiar`⁠$$\rangle$$ wartości
  * **`spread`**: dodaje podaną $$\langle$$⁠`wymiar`⁠$$\rangle$$ wartość do naturalnego rozmiaru tabeli

Efekt $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ zależy od typu składanej tabeli: dostosuje `\halign` naturalną *szerokość*, albo `\valign` naturalną *wysokość*.

Oto kilka przykładów:

* `\halign **to 100pt**{...}`: ustawia `\halign` szerokość tabeli na `100pt`
* `\valign **to 50pt**{...}`: ustawia `\valign` wysokość tabeli na `30pt`
* `\halign **spread 30pt**{...}`: dodaje 30pt do `\halign` naturalnej szerokości tabeli. Z kolei zapis **spread -30pt** zmniejszyłby szerokość tabeli o 30pt.
* `\valign **spread 20pt**{...}`: dodaje 20pt do `\valign` naturalnej wysokości tabeli. Z kolei zapis **spread -20pt** zmniejszyłby wysokość tabeli o 20pt.

Poniższy kod ponownie wykorzystuje powyższe przykłady tabel, ale stosuje $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ do `\valign` i `\halign` tabeli:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% Ściśle dopasowane obramowania pudełek
\setlength{\fboxsep}{0pt}

Oto tabela \verb|\valign|:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

Oto tabela \verb|\halign|:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Ten przykład daje wynik pokazany poniżej:

![](/files/f93cd800c89498c5de6ba42ad48ee738041017a2)

—ale zwróć uwagę, że treść obu tabel jest „ściśnięta”. Powodem jest brak elastycznego odstępu (glue), którego TeX mógłby użyć, aby rozciągnąć treść i wypełnić dodatkową przestrzeń zapewnioną przez **`na`** $$\langle$$**⁠`wymiar`⁠**$$\rangle$$. Tutaj wyprzedzimy nieco, aby wspomnieć o `\tabskip` polecenie.

#### Wstępne wprowadzenie do polecenia \tabskip

Estetyka układu tabeli może wymagać dostosowania odstępów między jej wierszami lub kolumnami, więc nie jest zaskoczeniem, że silniki TeX-a udostępniają polecenie o nazwie `\tabskip` które to umożliwia. `\tabskip` służy do ustawiania (i zmieniania) ilości elastycznej przestrzeni („glue”), którą TeX umieszcza między kolumnami `\halign` lub między wierszami `\valign`. Późniejsze artykuły szczegółowo omówią `\tabskip` to znacznie dokładniej.

Jako przykład wprowadzający poniższy kod używa ustawienia dla `\tabskip` co powoduje, że TeX wstawia pewną (bardzo) elastyczną przestrzeń między wierszami `\valign` tabeli. Ta elastyczna przestrzeń pozwala wierszom tabeli rozsunąć się i wypełnić dodatkową przestrzeń utworzoną przez $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ o wartości **`to 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\\setlength{\\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
Oto tabela \verb|\valign|:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Oto ta sama tabela \verb|\valign|, ale z \optspec{} ``\texttt{to 50pt}''. Zwróć uwagę, że wiersze są ``ściśnięte'', ponieważ między wierszami nie ma dostępnego ``rozciągliwego glue'':

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

Użyjemy tabeli \verb|\valign| z \optspec{} ``\texttt{to 50pt}'', ale zapewnimy ``elastyczny odstęp'' za pomocą polecenia \verb|\tabskip|. Tutaj \verb|\tabskip| dostarcza wystarczająco dużo ``glue'', aby umożliwić wierszom \verb|\valign| ``rozciągnięcie się'' i wypełnienie dostępnej dodatkowej przestrzeni. Oto ``rozciągnięta'' tabela \verb|\valign|:

\tabskip=0pt plus1fil % To ustawia \tabskip jako bardzo elastyczne glue
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/7b64025cbeddaf4d535d91d46566e8358fee33c0)

## Wprowadzenie do tabeli $$\langle$$preambuła$$\rangle$$ i $$\langle$$ciało$$\rangle$$

Ta sekcja wprowadza do tabeli $$\langle$$⁠`preambule`⁠$$\rangle$$, oraz *krótko* porusza temat tabeli $$\langle$$⁠`ciało`⁠$$\rangle$$ który następnie jest [omówiony bardziej szczegółowo](#bodydetails).

Późniejsze artykuły w tej serii omówią $$\langle$$⁠`preambule`⁠$$\rangle$$ i $$\langle$$⁠`ciało`⁠$$\rangle$$ bardziej szczegółowo, zwłaszcza użycie i przetwarzanie przez TeX tabeli $$\langle$$⁠`preambule`⁠$$\rangle$$.

Jak wspomniano powyżej, najbardziej ogólny format `\halign` lub `\valign` tabel można zapisać następująco:

`\halign` $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`ciało`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ { $$\langle$$⁠`preambule`⁠$$\rangle$$ $$\langle$$⁠`ciało`⁠$$\rangle$$ }

### Ta $$\langle$$preambuła$$\rangle$$

Ta $$\langle$$⁠`preambule`⁠$$\rangle$$ sekcja zawiera pojedynczą $$\langle$$⁠`linię preambuły`⁠$$\rangle$$ który jest *zakończoną* przez `\cr` polecenie; w konsekwencji $$\langle$$⁠`preambule`⁠$$\rangle$$ można przepisać jako:

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠`linię preambuły`⁠$$\rangle$$**`\cr`**

### Ta $$\langle$$ciało$$\rangle$$

Podobnie, $$\langle$$ciało$$\rangle$$ sekcję można dalej podzielić na jedną lub więcej składowych „linii”, ale tutaj dla każdej linii są dwie możliwości:

* linię składającą się z zestawu komórek, które tworzą `\halign` wiersz lub `\valign` kolumnę; albo
* a `\noalign` polecenie, które „wstrzykuje” materiał między `\halign`wierszami lub `\valign`kolumnami

Na potrzeby tego omówienia zignorujemy `\noalign` polecenie (zob. [później w artykule](#noalign)) i założymy, że każda linia $$\langle$$ciało$$\rangle$$ jest danymi dla zestawu komórek i *zakończoną* przez `\cr` polecenie.

Pomijając `\noalign`, a $$\langle$$⁠`ciało`⁠$$\rangle$$ sekcja, która reprezentuje treść użytkownika, zawiera sekwencję linii, z których każdą będziemy nazywać $$\langle$$⁠`linią treści`⁠$$\rangle$$ która jest *zakończoną* przez towarzyszącą jej `\cr` polecenie.

Ta $$\langle$$⁠`ciało`⁠$$\rangle$$ można przepisać jako:

$$\langle$$⁠linię treści$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linię treści$${}*\mathrm{N}$$⁠$$\rangle$$\cr

Łącząc to razem, możemy przepisać ogólny format `\halign` i `\valign` w następujący sposób:

`\halign` $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ { $$\langle$$⁠`linię preambuły`⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linię treści$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`opcjonalna specyfikacja`⁠$$\rangle$$ { $$\langle$$⁠`linię preambuły`⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linię treści$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

Z powodów, które zostaną omówione w późniejszych artykułach, $$\langle$$⁠`preambule`⁠$$\rangle$$, tylko pojedyncza $$\langle$$⁠`linię preambuły`⁠$$\rangle$$, ma inny format niż wszystkie linie w tabeli $$\langle$$⁠`ciało`⁠$$\rangle$$. Omówimy też [ponownie `\noalign` polecenie](#noalign) które może być też używane wewnątrz tabeli $$\langle$$⁠`ciało`⁠$$\rangle$$.

### Ta $$\langle$$⁠linii preambuły⁠$$\rangle$$

Ta $$\langle$$⁠`linię preambuły`⁠$$\rangle$$ odgrywa *kluczową* rolę w składaniu tabel, ponieważ dostarcza swego rodzaju „planu” używanego do składania treści —`\halign` wierszy lub `\valign` kolumn — zawartych w tabeli $$\langle$$⁠`ciało`⁠$$\rangle$$. Pakiet $$\langle$$⁠`linię preambuły`⁠$$\rangle$$ może też zawierać „szablony” komórek używane do konstruowania wierszy `\halign` lub kolumn `\valign`— tematu, który zostanie szczegółowo omówiony.

Celem $$\langle$$⁠`linię preambuły`⁠$$\rangle$$ jest dwojaki:

* określa *maksimum* liczbę komórek w wierszu `\halign` lub w kolumnie `\valign`.
* przechowuje *szablony komórek* które można wykorzystać do automatyzacji formatowania lub dołączania treści w komórkach zawartych w tabeli $$\langle$$⁠`ciało`⁠$$\rangle$$. Szablony komórek są opcjonalne i mogą być „puste”, albo możesz zawrzeć znaki lub polecenia, które TeX automatycznie wstawi przed i/lub po rzeczywistej treści określonych komórek w twojej tabeli. Oszczędza to żmudnej ręcznej konieczności wpisywania/dołączania tych znaków lub poleceń w każdej komórce, której mają dotyczyć.

**Uwaga**:  `\halign` wiersz lub `\valign` kolumna może zawierać mniej komórek niż maksimum określone przez $$\langle$$⁠`linię preambuły`⁠$$\rangle$$ ale nie może zawierać więcej niż to maksimum, w przeciwnym razie TeX zgłasza błąd. Na potrzeby tego omówienia pomijamy szczegóły *cyklicznych* preambuł.

Kontynuując nasze diagramy struktury,  $$\langle$$⁠`linię preambuły`⁠$$\rangle$$ dla

* jakiś `\halign` tabela z maksimum $$\mathrm{K}$$ komórek na *wiersza*, lub
* a `\valign` tabela z maksimum $$\mathrm{K}$$ komórek na *kolumnę*

może zostać zapisana następująco:

$$\langle$$szablon$${}\_1$$⁠$$\rangle$$&$$\langle$$szablon$${}\_2$$⁠$$\rangle$$&$$\langle$$szablon$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$szablon$${}*\mathrm{K}$$⁠$$\rangle$$

gdzie `&` to *znak tabulacji wyrównania* który oznacza koniec jednej komórki i początek następnej. Tradycyjnie używa się znaku ampersanda (`&`) jako tabulatora wyrównania, ale każdy znak z [kodem kategorii](/latex/pl/wiecej-tematow/43-table-of-tex-category-codes.md) kodem kategorii 4 mógłby być użyty zamiast tego.

Dla przypomnienia, $$\langle$$⁠`preambule`⁠$$\rangle$$ może być zapisany $$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠`linię preambuły`⁠$$\rangle$$**`\cr`**, albo równoważnie

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$szablon$${}\_1$$⁠$$\rangle$$&$$\langle$$szablon$${}\_2$$⁠$$\rangle$$&$$\langle$$szablon$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$szablon$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### Struktura każdej komórki $$\langle$$szablon$$\rangle$$

Każda komórka $$\langle$$szablon$${}\_i$$⁠$$\rangle$$ może zostać zapisana następująco:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ gdzie:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ jest zbiorem znaków lub poleceń (tokenów), które TeX wstawi automatycznie *zanim* treść podana przez użytkownika dla komórki $$i$$;
* $$\texttt{#}$$ jest symbolem zastępczym pokazującym, gdzie ma pojawić się treść podana przez użytkownika w komórce $$i$$. Ponownie, znak `#` to tylko *tradycja*, każdy znak z [kodem kategorii](/latex/pl/wiecej-tematow/43-table-of-tex-category-codes.md) kodem kategorii 6 mógłby być użyty zamiast tego. Zwróć uwagę, że kod kategorii 6 jest używany dla parametrów makr;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ jest zbiorem znaków lub poleceń (tokenów), które TeX wstawi automatycznie *po* treść podana przez użytkownika dla komórki $$i$$.

Zwróć uwagę, że wszystkie $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ i $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ jesteś *opcjonalny*: nie musisz używać żadnych znaków ani poleceń przed lub po treści komórki.

**Uzupełnianie** $$\langle$$**preambuła**$$\rangle$$

Na koniec, używając powyższej notacji, $$\langle$$⁠`preambule`⁠$$\rangle$$ dla

* jakiś `\halign` tabela z maksimum $$\mathrm{K}$$ komórek na *wiersza*, lub
* a `\valign` tabela z maksimum $$\mathrm{K}$$ komórek na *kolumnę*

może zostać zapisana następująco:

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠`linię preambuły`⁠$$\rangle$$`**\cr**`

lub

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**Ta** $$\langle$$**preambuła**$$\rangle$$ **oraz zliczanie wierszy i kolumn**

Dodatek **`\halign`** tabela z $$\langle$$⁠`preambule`⁠$$\rangle$$ określającym $$\mathrm{K}$$ komórek oraz $$\langle$$⁠`ciało`⁠$$\rangle$$ zawierająca $$\mathrm{N}$$ $$\langle$$⁠`linie treści`⁠$$\rangle$$ da tabelę z $$\mathrm{K}$$ *kolumnami* i $$\mathrm{N}$$ *wierszami*, jak pokazano na poniższym diagramie:

![](/files/9d7231fa28ec83e4e4d878986de6de8ede14fc55)

Skopiowany **`\valign`** tabela z $$\langle$$⁠`preambule`⁠$$\rangle$$ określającym $$\mathrm{K}$$ komórek oraz $$\langle$$⁠`ciało`⁠$$\rangle$$ zawierająca $$\mathrm{N}$$ $$\langle$$⁠`linie treści`⁠$$\rangle$$ da tabelę z $$\mathrm{K}$$ *wierszami* i $$\mathrm{N}$$ *kolumnami*, jak pokazano na poniższym diagramie:

![](/files/e0cec2cdba3543cb727ce944e7e7434409d5e359)

### Dość teorii, czas na przykłady!

Jak zobaczymy później bardziej szczegółowo, kiedy TeX przetwarza zawartość tabeli — komórki tabeli zawarte w [$$\langle$$⁠`ciało`⁠$$\rangle$$](#body)— sprawdza obecność szablonów komórek, które zostały zdefiniowane w $$\langle$$⁠`preambule`⁠$$\rangle$$, ponieważ TeX szuka wszelkich tokenów szablonu, które mają zostać wstawione przed i/lub po treści użytkownika. Poniższe, minimalne przykłady pokazują użycie szablonów komórek $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ w `\halign` i `\valign` tabeli.

#### Tabela \halign używająca szablonów komórek

Poniższy przykład pokazuje `\halign` tabelę, która używa szablonu komórki do automatycznego wstawiania cudzysłowów wokół treści pierwszej komórki w każdym wierszu: czyli szablonu, który wpływa na każdą komórkę w pierwszej kolumnie:

```latex
\documentclass{article}
\usepackage{parskip} % Ustaw \parindent na 0pt
% Wybierz wygodnie mały rozmiar strony
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % Rozstaw kolumny \halign
\begin{document}
\pagestyle{empty}

Oto tabela \verb|\halign| \textit{bez} szablonów komórek:

\halign{
% Nic przed ani po każdym '#' w <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

Oto ta sama tabela \verb|\halign|, ale z cudzysłowami automatycznie dodawanymi do pierwszej komórki w każdym wierszu; czyli wpływa na każdą komórkę w pierwszej kolumnie:

\halign{
% Szablony cudzysłowu w preambule:
``#''&#&#\cr % Cudzysłowy przed i po pierwszym #
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/e030e9ec3c9bba124116a89e454e4a42b29901bf)

Poniższa grafika jest opatrzoną adnotacjami wersją `\halign` tabeli utworzonej przez powyższy przykład; tutaj porównujemy „formalną” strukturę trzykomórkowej $$\langle$$⁠`preambule`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

z rzeczywistą $$\langle$$⁠`preambule`⁠$$\rangle$$ o wartości ` ``#''&#&#**\cr** `, podkreślając obecność lub brak szablonów komórek:

![](/files/db909ff7f3eef8564b03a9a2729bd51784a7a8f0)

#### Tabela \valign używająca szablonów komórek

Poniższy przykład pokazuje `\valign` tabelę, która używa szablonu dla każdej komórki, aby automatycznie wstawiać cyfry otaczające treść użytkownika.

```latex
\documentclass{article}
\usepackage{parskip} % Ustaw \parindent na 0pt
% Wybierz wygodnie mały rozmiar strony
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % Rozstaw wiersze \valign
\begin{document}
\pagestyle{empty}

Oto tabela \verb|\valign| \textit{bez} szablonów komórek:

\begingroup
\hsize=25pt
\valign{
% Nic przed ani po każdym '#' w
% <preamble>
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Oto ta sama tabela \verb|\valign|, ale z użyciem szablonów komórek do automatycznego wstawiania cyfr do każdej komórki:

\begingroup
\hsize=25pt
\valign{
% Cyfry wstawiane przed i po każdym '#' w
% <preamble>
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/087a6aea77bd9293a2efe90033141593bd48146d)

Poniższa grafika jest opatrzoną adnotacjami wersją `\valign` tabeli utworzonej przez powyższy przykład; tutaj porównujemy „formalną” strukturę trzykomórkowej $$\langle$$⁠`preambule`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

z rzeczywistą $$\langle$$⁠`preambule`⁠$$\rangle$$ o wartości `1#2&3#4&5#6**\cr**`, podkreślając użycie szablonów komórek $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/d28715dee3a463c9718cc68323ec7dae7a5a4c6f)

Zwróć uwagę, jak szablon dla komórki $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$) jest stosowany do $$i$$tej komórki w każdym `\valign` kolumnie, przez co wszystkie komórki $$i$$tej *wiersza* zostają objęte zmianą.

#### Stylizowanie tekstu za pomocą szablonów komórek

Następny przykład używa poniższych $$\langle$$⁠`preambule`⁠$$\rangle$$ (szablonów komórek) do stylizacji tekstu zawartego w każdym wierszu lub kolumnie:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

Jeśli porównamy to $$\langle$$⁠`preambule`⁠$$\rangle$$ z naszą „formalną” strukturą trzykomórkowej $$\langle$$⁠`preambule`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

widzimy, że:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

Zwróć uwagę, jak te szablony komórek, takie jak `\textbf{#}` przypominają makra z jednym parametrem (zawartością komórki).

```latex
Tabela \verb|\valign| z tekstem sformatowanym za pomocą szablonów komórek:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

Tabela \verb|\halign| z tekstem sformatowanym za pomocą szablonów komórek:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/4913e62d1a060b3ec7ba3ea824232c1cc83299de)

## Więcej szczegółów o tabeli $$\langle$$ciało$$\rangle$$

W sekcji [Wprowadzenie do tabeli $$\langle$$⁠`preambule`⁠$$\rangle$$ i $$\langle$$⁠`ciało`⁠$$\rangle$$](#preamble) widzieliśmy, jak, jeśli tymczasowo zignorujemy `\noalign`, a $$\langle$$⁠`ciało`⁠$$\rangle$$ z `\halign` lub `\valign` tabela składa się z wielu wierszy, z których każdy jest oznaczony $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$, gdzie:

* każdy $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$ jest zakończony przez `\cr` polecenie
* każdy $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$ z `\halign` jest wierszem tabeli
* każdy $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$ z `\valign` jest kolumną tabeli

Sekwencja wierszy, $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$, gdzie $$j=1\ldots\mathrm{N}$$, tworzy $$\mathrm{N}$$ wiersze `\halign` lub $$\mathrm{N}$$ kolumny dla `\valign`. Jak podsumowano na poniższym diagramie, ogólny $$\langle$$⁠`preambule`⁠$$\rangle$$ takie jak

$$\langle$$⁠`preambule`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

określa szablony komórek dla maksymalnie $$\mathrm{K}$$ komórek w każdym z $$\mathrm{N}$$ $$\langle$$⁠`linią treści`⁠$$\rangle$$ wpisów w $$\langle$$⁠`ciało`⁠$$\rangle$$:

![](/files/4545439d323bc550dcfed5e09c608ba17bbd0030)

### Struktura każdego $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$

Każdy wiersz $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$ tabeli $$\langle$$ciało$$\rangle$$ zawiera treść dla maksymalnie $$\mathrm{K}$$ komórek — zgodnie z ustaleniem tabeli $$\langle$$preambuła$$\rangle$$— i ma ogólną postać:

$$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠Komórka$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Komórka$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠Komórka$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠Komórka$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

gdzie:

* $$\langle$$⁠Komórka$${}\_i$$⁠$$\rangle$$ reprezentuje treść użytkownika dla $$i$$tej komórki w pewnym $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$
* stronie **`&`** znak nazywa się *tabulatorem wyrównania* (tak jak w $$\langle$$preambuła$$\rangle$$) który sygnalizuje koniec jednej komórki i początek następnej. Ponownie, użycie **`&`** jest jedynie tradycją (konwencją), ponieważ dowolny znak z [kodem kategorii](/latex/pl/wiecej-tematow/43-table-of-tex-category-codes.md) kodem kategorii 4 mógłby być użyty zamiast tego.

Chociaż każda $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$ może zawierać maksymalnie $$\mathrm{K}$$ komórek (określane przez $$\langle$$preambuła$$\rangle$$) mogą zawierać *mniej* niż $$\mathrm{K}$$ komórek, a każdy $$\langle$$⁠Komórka$${}\_i$$⁠$$\rangle$$ % $$\langle$$⁠linię treści$${}\_j$$⁠$$\rangle$$ może być pusty.

Poniższy przykład pokazuje $$\langle$$preambuła$$\rangle$$ o wartości `#&#&#&#&#\cr` co zapewnia maksymalnie 5 komórek na $$\langle$$⁠wiersz treści⁠$$\rangle$$; jednak składane tabele zawierają wiersze z mniej niż 5 komórkami:

```latex
Tabela \verb|\valign| z 1 do 5 komórek na \textit{kolumnę}:

\begingroup
% \hsize kontroluje szerokości kolumn \valign (rozmiar składanych wierszy).
\hsize=40pt
\fbox{\valign{
% Użyj preambuły, która dopuszcza 5 komórek na kolumnę
% Większość kolumn nie dostarcza treści dla 5 komórek
#&#&#&#&#\cr% 5 komórek na kolumnę
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% Uwaga: z powodów wyjaśnionych później
% \halign musi zostać umieszczony w \vbox
Tabela \verb|\halign| z 1 do 5 komórek na \textit{wiersz}:

\fbox{%
\vbox{\halign{
% Użyj preambuły, która dopuszcza 5 komórek na wiersz
% Większość wierszy nie dostarcza treści dla 5 komórek
#&#&#&#&#\cr % 5 komórek na wiersz
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Otwórz ten przykład w Overleaf](/latex/pl/artykuly-szczegolowe/15-how-do-tex-engines-typeset-tables-2.md)

Ten przykład generuje następujący wynik:

![](/files/3fbe11348f9d3d0ca8d4f36d4ba8795f629021db)

Następny `\halign` przykład pokazuje zmienną liczbę komórek w wierszu oraz możliwość, by komórki były puste — zwróć uwagę, jak puste komórki są tworzone przez kolejne **`&`** znaki w tabeli:

```latex
Tabela \verb|\halign| z niektórymi pustymi komórkami---zwróć uwagę, że w tabeli \(\langle\texttt{body}\rangle\) występują kolejne znaki \texttt{\&}:

\fbox{%
\vbox{\halign{
% Użyj preambuły, która dopuszcza 5 komórek na wiersz
% Większość wierszy nie dostarcza treści dla 5 komórek
#&#&#&#&#\cr % 5 komórek na wiersz
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/5b3e5bd5f475119447948a9974f95d1d0c96099e)

### W składaniu tabel nie ma nic szczególnego w & i \#

Użycie przez TeX znaków `&` i `#` w składaniu `\halign`- lub `\valign`-opartych na tabel jest tradycją wywodzącą się z oryginalnych makr plain TeX Knutha. Jak najbardziej można używać znaków innych niż `&` i `#` przypisując odpowiednie kody kategorii preferowanym zamiennikom, jak pokazuje poniższy przykład:

* zastąpienie `&` z `@` przypisując `@` kod kategorii 4
* zastąpienie `#` z `|` przypisując `|` kod kategorii 6 (który jest używany dla parametrów makr)

Zmiany kategorii pozostają lokalne dzięki użyciu `\begingroup` i `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## Ponowne wprowadzenie polecenia \noalign

Silniki TeX udostępniają wbudowane (prymitywne) `\noalign` polecenia:

`\noalign{`$$\langle$$⁠`tokeny`⁠$$\rangle$$`}`

gdzie $$\langle$$⁠`tokeny`⁠$$\rangle$$ są znakami i/lub poleceniami TeX/LaTeX. Polecenie `\noalign` jest przeznaczone wyłącznie do użycia wewnątrz `\halign` lub `\valign` tabeli: użycie go poza nimi spowoduje błąd.

Celem `\noalign` jest umożliwienie „wstawiania” tekstu i poleceń TeX/LaTeX *pomiędzy* wierszami `\halign` tabeli lub kolumnami `\valign` tabeli. Najczęstsze użycie `\noalign` to tworzenie linii tabeli:

* *poziome* linie między `\halign` wierszami tabeli
* *pionowe* linie między `\valign` kolumnami tabeli

Zwróć uwagę na następujące:

* stronie `\noalign` polecenia to ***nie zakończone przez\*\*\*\*****&#x20;****`\cr`****&#x20;****\*\*\*\*polecenie***
* zestaw poleceń dozwolonych wewnątrz `\noalign{...}` zależy od tego, czy jest używane w $$\langle$$⁠`ciało`⁠$$\rangle$$ z `\halign` lub `\valign` tabeli (tj. w trybie pionowym lub poziomym).

Możemy teraz powiedzieć, że tabela $$\langle$$⁠`ciało`⁠$$\rangle$$ o wartości `\halign` lub `\valign` może składać się z pojedynczych wierszy $$\langle$$⁠linię treści$${}\_i$$⁠$$\rangle$$`\cr` przeplatanych `\noalign` poleceniami; jedną z wielu możliwości/kombinacji może być:

`\noalign{`$$\langle$$⁠`tokeny`⁠$$\rangle$$`}` $$\langle$$⁠linię treści$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠linię treści$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`więcej tokenów`⁠$$\rangle$$`}` $$\langle$$⁠linię treści$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠linię treści$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`inne tokeny`⁠$$\rangle$$`}`

### Przykład użycia \noalign

Inne przypadki użycia omówimy później w tej serii artykułów, ale oto podstawowy przykład pokazujący tworzenie linii tabeli za pomocą `\noalign`:

```latex
\setlength{\tabskip}{5pt}

Użycie \verb|\noalign| do umieszczania poziomych linii między wierszami tabeli \verb|\halign|:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

Użycie \verb|\noalign| do umieszczania pionowych linii między kolumnami tabeli \verb|\valign|:
\vspace{6pt}

\begingroup % zachowaj lokalność zmian \parindent i \hsize
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/a2b7da1835bfdd9e2a17cf96279191ed72ba8853)

## Ponowne omówienie \tabskip

Przyjrzymy się bliżej `\tabskip` poleceniu, rozwijając [wprowadzenie z poprzedniej sekcji](#tabskip).

Ta `\tabskip` polecenie ustawia wartość specjalnej postaci „odstępu” (glue) używanej *wyłącznie* przy składaniu tabel: jego celem jest zapewnienie odstępu między wierszami lub kolumnami tabeli:

* dla `\halign` tabele: `\tabskip` glue jest wstawiane przed i po tabeli (tj. po lewej i prawej) oraz między kolumnami tabeli
* dla `\valign` tabele: `\tabskip` glue jest wstawiane przed i po tabeli (tj. nad nią i pod nią) oraz między wierszami tabeli

Wartość `\tabskip` może być ustawiona za pomocą LaTeX-owego `\setlength` polecenia:

`\setlength{\tabskip}{`$$\langle$$⁠`wartość glue`⁠$$\rangle$$`}`

gdzie $$\langle$$⁠`wartość glue`⁠$$\rangle$$ może być:

* stała długość, taka jak `5pt`, `3mm`, lub
* skończone elastyczne glue, takie jak `3pt plus 2pt minus 1pt`, lub
* nieskończenie elastyczne glue, takie jak `0pt plus1fill`.

Możesz też bezpośrednio ustawić `\tabskip` (omijając `\setlength`) wpisując

`\tabskip`=$$\langle$$⁠`wartość glue`⁠$$\rangle$$

Jednak każda zmiana wartości `\tabskip` glue wpłynie na odstępy w tabeli tylko wtedy, gdy ta zmiana zostanie:

* wprowadzona *zanim* stronie `\halign` lub `\valign` polecenia do przetworzenia, lub
* wprowadzona wewnątrz tabeli $$\langle$$⁠`preambule`⁠$$\rangle$$

Próby ustawienia `\tabskip` wartości wewnątrz zawartości tabeli (komórki w tabeli $$\langle$$⁠`ciało`⁠$$\rangle$$) *nie* zmieniają odstępy `\halign` kolumn tabeli lub `\valign` wierszy tabeli. Przyczyna takiego zachowania `\tabskip` można przypisać roli, jaką odgrywa $$\langle$$⁠`preambule`⁠$$\rangle$$ podczas składania tabel — procesom tym przyjrzymy się później bardziej szczegółowo.

### Widzieć to wierzyć

Aby ułatwić wizualizację różnych rodzajów odstępów/glue używanych przy składaniu tabel, zwłaszcza

* `\tabskip` glue
* `\baselineskip` glue
* ręcznego kerningu (`\kern`)

Overleaf przygotował projekt oparty na LuaTeX, aby pokolorować elementy tabeli. LuaTeX wybrano, ponieważ umożliwia niskopoziomowe ponowne przetwarzanie wewnętrznych danych/struktur składanych tabel, ale nie będziemy tu zgłębiać tych szczegółów.

Oto kilka przykładów pokazujących różne zastosowania `\tabskip`. Dla każdego przykładu pokażemy rzeczywisty wynik oraz wersję pokolorowaną wygenerowaną przez LuaTeX.

### Przykład \tabskip 1

Przyjrzyjmy się użyciu `\tabskip` w `\halign` i `\valign` tabeli. Pokażemy rzeczywiste składy tabel, z obramowaniem pomagającym zobaczyć ich rozmiar i odstępy, wraz z grafikami z adnotacjami zawierającymi wersje pokolorowane, które wyraźnie pokazują rozmiar różnych glue/odstępów w każdej tabeli.

Po pierwsze, `\halign`:

```latex
% Aby zobrazować zasięg tabeli, dodamy wokół niej obramowanie
\setlength{\fboxsep}{0pt} % Użyj ściśle dopasowanych obramowań

% Tutaj ustawiamy \tabskip „bezpośrednio”
\tabskip5pt % Ustaw początkową wartość \tabskip poza tabelą

% Aby umieścić obramowanie wokół tabeli, trzeba ją zapisać do pudełka TeX-a.
% \halign musi być umieszczone w \vbox, ponieważ \halign musi być
% przetwarzane w „trybie pionowym”: \hbox nie zadziała, ponieważ
% jest przetwarzane w „trybie poziomym”

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/ad2705f9aa862f1de6f940787184e9d9812b02cc)

Następna grafika to większa, pokolorowana i opatrzona adnotacjami wersja tabeli z poprzedniego przykładu:

![](/files/dac55bdd73ce68279bb68f08bd99ee811d6d0a04)

Występują 4 przypadki `\tabskip` polecenia, z których każde odpowiada określonemu miejscu odstępu w tabeli:

1. `\tabskip5pt` jest używane poza tabelą i ustawia `\tabskip` wartość stosowaną przed (po lewej od) pierwszej komórki w każdym wierszu.
2. `\tabskip10pt` jest ustawiane w pierwszym szablonie komórki $$\langle$$⁠`preambule`⁠$$\rangle$$ co wpływa na odstęp między $$\langle$$⁠Komórka$${}\_1$$⁠$$\rangle$$ i $$\langle$$⁠Komórka$${}\_2$$⁠$$\rangle$$ w każdym wierszu.
3. `\tabskip15pt` jest ustawiane w drugim szablonie komórki $$\langle$$⁠`preambule`⁠$$\rangle$$ co wpływa na odstęp między $$\langle$$⁠Komórka$${}\_2$$⁠$$\rangle$$ i $$\langle$$⁠Komórka$${}\_3$$⁠$$\rangle$$ w każdym wierszu.
4. `\tabskip20pt` jest ustawiane w trzecim i ostatnim szablonie komórki $$\langle$$⁠`preambule`⁠$$\rangle$$ co wpływa na odstęp dodawany po $$\langle$$⁠Komórka$${}\_3$$⁠$$\rangle$$, czyli po ostatniej komórce każdego wiersza.

Następnie, `\valign`

```latex
\setlength{\fboxsep}{0pt} % Użyj ściśle dopasowanych obramowań
\tabskip5pt % Ustaw początkową wartość \tabskip poza tabelą

% Zachowaj lokalność zmian \hsize (w grupie)
\begingroup
% \hsize określa szerokości kolumn \valign
\setlength{\hsize}{50pt}
% Ponieważ \valign można umieścić w \vbox lub \hbox, możemy użyć
% bezpośrednio \fbox
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

![](/files/89e4d8dc72b84350c83f1032ca1ecf8c25631dfa)

Ponownie, następna grafika to większa, pokolorowana i opatrzona adnotacjami wersja tabeli z poprzedniego przykładu:

![](/files/7e55cd3689a3edac8a17cc77281e3f37671a37dd)

Podobnie jak w `\halign` przykładzie, występują 4 przypadki `\tabskip` polecenia. Jednak w `\valign` tabeli `\tabskip` jest wstawiane między wierszami tabeli:

1. `\tabskip5pt` jest używane poza tabelą i ustawia `\tabskip` wartość stosowaną przed (nad) pierwszą komórką w każdej kolumnie.
2. `\tabskip10pt` jest ustawiane w pierwszym szablonie komórki $$\langle$$⁠`preambule`⁠$$\rangle$$ co wpływa na odstęp między $$\langle$$⁠Komórka$${}\_1$$⁠$$\rangle$$ i $$\langle$$⁠Komórka$${}\_2$$⁠$$\rangle$$ w każdej kolumnie.
3. `\tabskip15pt` jest ustawiane w drugim szablonie komórki $$\langle$$⁠`preambule`⁠$$\rangle$$ co wpływa na odstęp między $$\langle$$⁠Komórka$${}\_2$$⁠$$\rangle$$ i $$\langle$$⁠Komórka$${}\_3$$⁠$$\rangle$$ w każdej kolumnie.
4. `\tabskip20pt` jest ustawiane w trzecim i ostatnim szablonie komórki $$\langle$$⁠`preambule`⁠$$\rangle$$ co wpływa na odstęp dodawany po $$\langle$$⁠Komórka$${}\_3$$⁠$$\rangle$$, czyli po ostatniej komórce każdej kolumny.

**Podsumowanie/wnioski**

* W `\halign` tabeli `\tabskip` glue jest umieszczane po lewej i prawej stronie każdej komórki w wierszu, przez co rozsuwa kolumny tabeli.
* W `\valign` tabeli `\tabskip` glue jest umieszczane nad i pod każdą komórką w kolumnie, przez co rozsuwa wiersze tabeli.

### \tabskip i \noalign

#### Użycie \halign

Poniższy `\halign` przykład używa `\tabskip` glue oraz pokazuje także `\noalign` polecenia, używając go do umieszczania odstępów i linii nad oraz pod wierszami `\halign` tabeli. Te linie są składane za pomocą `\hrule` (prymitywnego) polecenia wraz z odstępem utworzonym przez `\kern`:

```latex
\setlength{\tabskip}{5pt} % Ustaw \tabskip poza tabelą

\halign{
#&#&#&#&#\cr % <preambuła>
\noalign{\hrule\kern2pt} % Odstępiona linia przed wierszem 1
1&2&3&4&5\cr % Wiersz 1
\noalign{\kern2pt\hrule\kern2pt} % Odstępiona linia między wierszami 1/2
6&7&8&9&10\cr % Wiersz 2
\noalign{\kern2pt\hrule\kern2pt} % Odstępiona linia między wierszami 2/3
11&12&13&14&15\cr % Wiersz 3
16&17&18&19&20\cr % Wiersz 4---brak linii między wierszami 3/4
\noalign{\kern2pt\hrule} % Linia odstępowa na końcu tabeli
}
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

Ten przykład tworzy tabelę pokazną poniżej, która została dodatkowo opatrzona adnotacjami, aby odtworzyć kod (La)TeX oraz numery (1) do (4) do ponumerowania `\noalign` poleceń zawierających linie i kerny, wraz z odpowiadającym im wynikiem składu:

![](/files/aacfd9733cd952cfb340b3914d9cf83dde294982)

Poniższa grafika pokazuje pokolorowaną wersję tabeli, oznaczoną tak, by pokazać różne odstępy/glue w tabeli:

![](/files/7b532b2ab185e3fa0880a86974f5d33a1d032617)

Zwróć uwagę na następujące:

* użycie `\noalign` do wstawiania linii między niektórymi wierszami oraz ręczne użycie `\kern` wartości, aby dodać trochę odstępu przed/po liniach. Silniki TeX nie wstawiają `\baselineskip` glue po składanej linii, dlatego odstęp jest wstawiany ręcznie za pomocą `\kern` (można by użyć innych poleceń odstępu);
* `\baselineskip` glue zostało automatycznie wstawione między wierszami 3 i 4.

#### Użycie \valign

Poniższy `\valign` przykład używa tych samych danych co poprzedni `\halign`:

```latex
\begingroup
\\setlength{\\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Ten przykład tworzy tabelę pokazną poniżej, która została dodatkowo opatrzona adnotacjami, aby odtworzyć kod (La)TeX oraz numery (1) do (4) do ponumerowania `\noalign` poleceń zawierających linie i kerny, wraz z odpowiadającym im wynikiem składu:

![](/files/f215bb9bf9848cb8863b589844118d1626392895)

![](/files/e31f669d6a4c69679019a6f37ed38dbd1e4e4be4)

### Tabela \valign z wierszami tekstu

Następny przykład

```latex
\setlength{\tabskip}{5pt}
\begingroup % zachowaj lokalność zmian \parindent i \hsize
\\setlength{\\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} może składać bardzo złożone
tabele.&Oto odrobina dodatkowego
tekstu.&A na koniec dodatkowy wiersz
w tej kolumnie.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[Otwórz ten przykład w Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

Ten przykład generuje następujący wynik:

## Ustawianie szerokości wierszy i wysokości kolumn

## Więcej o tabeli $$\langle$$preambuła$$\rangle$$


---

# 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/15-how-do-tex-engines-typeset-tables-2.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.
