> 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/wiecej-tematow/19-how-tex-macros-actually-work-part-1.md).

# Jak naprawdę działają makra TeX-a: Część 1

[Część 1](/latex/pl/wiecej-tematow/19-how-tex-macros-actually-work-part-1.md) [Część 2](/latex/pl/wiecej-tematow/20-how-tex-macros-actually-work-part-2.md) [Część 3](/latex/pl/wiecej-tematow/21-how-tex-macros-actually-work-part-3.md) [Część 4](/latex/pl/wiecej-tematow/22-how-tex-macros-actually-work-part-4.md) [Część 5](/latex/pl/wiecej-tematow/23-how-tex-macros-actually-work-part-5.md) [Część 6](/latex/pl/wiecej-tematow/24-how-tex-macros-actually-work-part-6.md)

## Wprowadzenie: Cele tej serii

Ta seria artykułów ma ambitny cel: wyjaśnić *jak* jak naprawdę działają makra TeX-a (takie jak polecenia LaTeX-a) — na najbardziej podstawowym poziomie, wewnątrz samego oprogramowania silnika TeX. Zamiast polegać *wyłącznie* na zestawie przykładowych makr zaprojektowanych do demonstrowania różnych funkcji, przypadków brzegowych i zachowań TeX-a, zajrzymy do samego TeX-a, aby zobaczyć *jak* i *dlaczego* dlaczego jego metody programowania makr działają tak, jak działają.

Aby osiągnąć nasz cel, musimy zacząć od omówienia zagadnień dość niskopoziomowych i początkowo mogą one wydawać się nieco odległe od zadania składu twoich dokumentów. Miejmy nadzieję, że po głębszym zanurzeniu się wyjdziesz z tego z fundamentem do zbudowania lepszego zrozumienia, które ostatecznie zaoszczędzi ci dużo czasu i być może także zmniejszy poziom frustracji.

### Język programowania TeX-a: Znasz to uczucie?

Nie jest przesadą opisywać język programowania TeX-a jako nieco ezoteryczny, ponieważ taki właśnie jest — przynajmniej według standardów większości głównych współczesnych języków programowania. Gdy zaczynasz swoją podróż ku lepszemu poznaniu TeX/LaTeX, zwłaszcza jeśli chcesz pisać niebanalne makra, szybko napotykasz pojęcia takie jak kody kategorii, tokeny/tokenizacja oraz „rozwijanie” poleceń lub makr. Ten potok pojęć jest prawdopodobnie dość obcy, być może sprawiając, że czujesz się zdezorientowany, a czasem nawet nieco sfrustrowany, ponieważ twojej drodze do sukcesu nie zawsze pomagają niemal nieprzeniknione komunikaty o błędach TeX/LaTeX.

## Więc od czego zaczynamy? Od kodów kategorii.

Silniki TeX należą do klasy oprogramowania zwanej [kompilatorami](https://en.wikipedia.org/wiki/Compiler): programami, które przyjmują plik napisany w *języku źródłowym* i *kompilują* (przekształcają) go w plik wyjściowy napisany w *języku docelowym* języku. Dokładniej TeX jest *kompilatorem dokumentów*. Dla silników TeX (kompilatorów) plik wejściowy jest napisany w języku składu TeX, a celem jest plik wyjściowy zapisany w innym „języku”, takim jak [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) lub PDF — choć dość swobodnie podchodzimy do pojęcia „języka”.

Przyjrzyjmy się bliżej „językowi” źródłowemu, czyli wejściowemu, używanemu do zapisania pliku TeX. Plik `.tex` to ostatecznie jeden długi ciąg znaków (w tym znaków podziału wiersza): obejmujący tekst przeznaczony do składu przeplatany `\`, `}`, `$`, `[` poleceniami i wszelkiego rodzaju znakami, które mogą występować w pozornie niemal nieskończonym zakresie kombinacji. Każdy, kto nie używa TeX/LaTeX, mógłby spojrzeć na typowy `.tex` plik i można by mu wybaczyć, że postrzega go jako dość chaotyczną mieszaninę znaków z niewielką, jeśli w ogóle jakąkolwiek, widoczną strukturą pliku. Pakiet makr LaTeX z pewnością w pewnym stopniu „narzuca” podstawową strukturę plikowi wejściowemu .tex. Jednak między `\begin{document}` i `\end{document}` to zależy od autora dokumentu, co się tam znajdzie. Jeśli spojrzysz na `.tex` pliki napisane z użyciem oryginalnego pakietu makr Plain TeX Knutha, zobaczysz, że struktura dokumentu jest niemal całkowicie nieobecna.

Zatem ogólnie plik wejściowy TeX może wydawać się dość nieustrukturyzowany, jakby przypadkową mieszaniną treści przeznaczonej do składu przeplatanej instrukcjami (poleceniami), które kierują składem tej treści. Jak w ogóle możliwe jest, aby TeX nadawał sens typowemu `.tex` plikowi wejściowemu: przefiltrować ten napływający chaos znaków na wykonalne instrukcje dla silnika składu oraz treść, która ma zostać złożona?

### Filtrowanie chaosu: Przywitaj się z kodami kategorii

Każdy ludzki obserwator, który nie wie nic o TeX, mógłby spojrzeć na `.tex` plik i rozpoznać pewne znaki, takie jak `$` i wiedzieć, że jest to znak waluty, albo zobaczyć `&` i zidentyfikować go jako ampersand. Taki obserwator wywnioskuje *znaczenie* dla każdego znaku, który widzą — znaczenie oparte na roli, jaką ten znak odgrywa w ludzkiej komunikacji. Dodatkowo mogą zobaczyć znaki takie jak `a`, `e`, `lub` i wiedzieć, że są klasyfikowane jako samogłoski, podczas gdy inne, takie jak `b`, `c` lub `d` są klasyfikowane jako spółgłoski. Jako ludzie mamy w pewnym sensie wbudowaną tablicę wyszukiwania (w naszej pamięci), za pomocą której przypisujemy znaczenie każdemu znakowi, który widzimy — znaczenie oparte na roli, jaką ten znak pełni w językach, w których potrafimy się komunikować.

Aby przetworzyć `.tex` plik, oprogramowanie TeX również musi przyjrzeć się każdemu znakowi w twoim wejściu i ono również musi przypisać *znaczenie* każdemu z tych znaków, które „widzi”. Jednak TeX jest po prostu maszyną programową zajmującą się przetwarzaniem tekstu — przechowywanego jako ciąg liczb całkowitych (kodów znaków) znajdujący się w pliku wejściowym. Jako maszyna TeX musi zostać zaprogramowany odpowiednimi danymi, które mówią mu, jak określić znaczenie znaku, na który „patrzy”, a następnie co ma z nim zrobić. Jak TeX to osiąga?

Odpowiedź brzmi: jedno z tych pojęć właściwych wyłącznie TeX-owi: *kody kategorii,* których jest 16, od 0 do 15. Dla TeX-a każdy znak, jakiego kiedykolwiek spodziewa się zobaczyć w `.tex` pliku ma tak zwany *kodem kategorii* przypisany z góry. Wewnątrz oprogramowania TeX znajduje się coś w rodzaju „tablicy wyszukiwania”, która wymienia kod kategorii *aktualnie* przypisany do każdego znaku, który TeX może zobaczyć w pliku wejściowym .tex. Powinieneś myśleć o kodach kategorii TeX-a jako o przypisywaniu *znaczenie* do każdego pojedynczego znaku w strumieniu wejścia, który TeX musi przeanalizować (przeskanować).

Aby złożyć twój dokument, silnik TeX musi odczytać (przeskanować) każdy pojedynczy znak, lecz bezpośrednim zainteresowaniem TeX-a nie są same znaki (kody znaków): dla znaku ważniejszy jest jego *kodem kategorii* podczas skanowania wejścia. Dla znaku *bieżącego* kod kategorii określa *bieżące znaczenie* tego znaku *w momencie, gdy TeX go odczytuje*: ten kod kategorii określa, jak TeX będzie traktował/przetwarzał każdy znak — wyjaśnimy, dlaczego mówimy „bieżący kod kategorii” i „bieżące znaczenie”. To właśnie dzięki kodom kategorii TeX potrafi filtrować napływający chaos znaków, aby odróżnić znaki (treść) przeznaczone do składu od znaków tworzących instrukcje do przetworzenia —*polecenia* które TeX musi wykonać.

Poniższa tabela wymienia te 16 kodów kategorii: co każdy z nich oznacza wraz z przykładami znaków zwykle przypisywanych do każdej kategorii.

| **Kod kategorii** | **Opis**                                                             | **Standard LATEX/TEX**                                                  |
| ----------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| 0                 | Znak ucieczki — informuje TEX, aby zaczął szukać polecenia           | `\`                                                                     |
| 1                 | Rozpoczęcie grupy                                                    | {                                                                       |
| 2                 | Zakończenie grupy                                                    | }                                                                       |
| 3                 | Przełączenie matematyczne — przełączanie do/z trybu matematycznego   | $                                                                       |
| 4                 | Tabulator wyrównania                                                 | &                                                                       |
| 5                 | Koniec wiersza                                                       | Kod ASCII 13 (`\\r`)                                                    |
| 6                 | Parametr makra                                                       | #                                                                       |
| 7                 | Indeks górny — do składu wzorów matematycznych: `$y=x^2$` $$y=x^2$$  | ˆ                                                                       |
| 8                 | Indeks dolny — do składu wzorów matematycznych: `$y=x_2$` $$y=x\_2$$ | \_                                                                      |
| 9                 | Znak ignorowany                                                      | ASCII 0 `<null>`                                                        |
| 10                | Znak odstępu                                                         | Kody ASCII 32 (spacja) i 9 (znak tabulacji)                             |
| 11                | Litera                                                               | A...Z, a...z, (oraz tysiące znaków Unicode)                             |
| 12                | Inne                                                                 | 0...9 plus ,.;?" i wiele innych                                         |
| 13                | Znak aktywny                                                         | Specjalny kod kategorii do tworzenia makr jednoliterowych, takich jak ˜ |
| 14                | Znak komentarza — ignoruj wszystko, co następuje aż do końca wiersza | %                                                                       |
| 15                | Nieprawidłowy znak, niedozwolony w pliku wejściowym .tex             | Kod ASCII 127 (`DEL`)                                                   |

Użycie kodów kategorii jest podstawowym mechanizmem TeX-a służącym do filtrowania napływającego strumienia znaków i nadawania sensu twojemu wejściu, aby określić:

* znaki składające się na tekst przeznaczony do składu;
* wyznaczanie granic treści, która powinna być składana w trybie matematycznym;
* sekwencje znaków będące nazwami poleceń do przetworzenia lub wykonania;
* … i wielu innych operacji składu.

Początkowo możesz myśleć, że kod kategorii (znaczenie) każdego znaku jest jakąś stałą wartością: niezmienną i na stałe wbudowaną w wewnętrzne fundamenty oprogramowania TeX, lecz tak nie jest. Jak wspomniano, TeX utrzymuje wewnętrzną tablicę wyszukiwania przechowującą szczegóły tego, jaki kod kategorii jest *aktualnie* przypisany do każdego znaku — nieprzypadkowo mówimy bardzo celowo *aktualnie przypisany* ponieważ kod kategorii dowolnego znaku (jeszcze nieodczytanego) może zostać zmieniony za pomocą prymitywnego (wbudowanego) polecenia zwanego `\catcode`. To daje znaczną elastyczność, ponieważ możesz, jeśli chcesz, całkowicie zmienić sposób, w jaki TeX będzie traktował lub interpretował znaczenie dowolnego znaku odczytanego później z wejścia, oferując ogromne możliwości dla zaawansowanych zastosowań składu.

Jeśli najbardziej interesuje cię używanie LaTeX-a, aby „po prostu wykonać zadanie”, istnieje duża szansa, że nie zetknąłeś się bezpośrednio z kodami kategorii, chyba że być może poprzez komunikaty o błędach, które widziałeś. Ale bądź spokojny, kody kategorii są kluczowym elementem działania silnika TeX: umożliwiają LaTeX-owi (i pakietom LaTeX) faktyczne wykonywanie pracy polegającej na składaniu twojego dokumentu.

Gdy twój silnik TeX uruchamia się („[bootstraps](https://en.wikipedia.org/wiki/Bootstrapping)”), użyje zestawu domyślnych przypisań znaków do kodów kategorii, ale za pośrednictwem `\catcode` polecenia, te domyślne ustawienia mogą zostać zmienione przez podstawowy kod LaTeX (makra) i/lub przez załadowane przez ciebie pakiety LaTeX — a nawet przez twój własny kod TeX lub makra. Jednak z biegiem czasu i w wyniku tradycji/użycia, pewne znaki przypisane do określonych kodów kategorii zostały uznane za „standardy”, a przestrzeganie tych standardów jest zdecydowanie pożądane, jeśli chcesz, aby twoje dokumenty były przenośne i łatwe do udostępniania współpracownikom lub innym użytkownikom. Na przykład, `\` znakowi przypisuje się kod kategorii 0, aby wskazać początek polecenia TeX/LaTeX — zobacz [powyższa tabela](#tbl-0).

### Odczytywanie (skanowanie) wejścia

Gdy TeX odczytuje (skanuje) następny znak z twojego pliku wejściowego, pierwszą rzeczą, jaką robi, jest sprawdzenie jego kodu kategorii, więc przyjrzyjmy się bliżej temu, co dzieje się, gdy TeX odczytuje typową linię wejścia.

Załóżmy, że mamy plik .tex zawierający tekst `Hello World \jobname` gdzieś w akapicie. Jeśli zajrzymy do `.tex` pliku za pomocą [edytora szesnastkowego](https://en.wikipedia.org/wiki/Hex_editor), widzimy, że sekwencja znaków `Hello World \jobname` w naszym `.tex` pliku jest po prostu ciągiem liczb całkowitych, czyli *kodów znaków*, pokazanych na zrzucie ekranu poniżej jako sekwencja szesnastkowa:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Szesnastkowe kody znaków w pliku TeX](/files/5821b85563fffd237d3315fa1b66f9b3ad410fc3)

Jeśli przekształcimy zapis szesnastkowy (podstawa 16) na dziesiętny (podstawa 10), sekwencja kodów znaków jest następująca:

![Dziesiętne kody znaków w pliku TeX](/files/2bc2d5a4b4fa89b85c192d7578cd5c16dc132623)

Wiemy też, że dla TeX-a każdy znak ma odpowiadający mu kod kategorii; więc na podstawie [powyższa tabela](#tbl-0) wiemy, że prawdopodobnie używane są również następujące domyślne przypisania kodów kategorii:

![Kody kategorii TeX-a](/files/1f4b645e5bd5d3564cddb38c1511ebcb93492afd)

Zatem dla TeX-a każdy znak w pliku wejściowym jest reprezentowany przez *dwa* wartości liczbowe — jego kod znaku i kod kategorii:

![Kody znaków i odpowiadające im kody kategorii TeX-a](/files/99e14595d1917d8a0968af7d0add8acff15476ec)

Na tym etapie rozważamy jedynie sam pierwszy etap przetwarzania twojego pliku przez TeX: skanowanie poszczególnych znaków. Więc co właściwie TeX robi z tymi parami kodów znaków i kodów kategorii? Gdy TeX przeskanuje pojedynczy znak i odnajdzie jego odpowiadający kod kategorii, jak dokładnie wykorzystuje tę informację do „filtrowania” napływających znaków?

## Część 2

W części 2 przyjrzymy się bliżej temu, jak TeX odczytuje twoje wejście: udając „oczy” TeX-a, gdy patrzy na twoje wejście znak po znaku.

[Część 1](/latex/pl/wiecej-tematow/19-how-tex-macros-actually-work-part-1.md) [Część 2](/latex/pl/wiecej-tematow/20-how-tex-macros-actually-work-part-2.md) [Część 3](/latex/pl/wiecej-tematow/21-how-tex-macros-actually-work-part-3.md) [Część 4](/latex/pl/wiecej-tematow/22-how-tex-macros-actually-work-part-4.md) [Część 5](/latex/pl/wiecej-tematow/23-how-tex-macros-actually-work-part-5.md) [Część 6](/latex/pl/wiecej-tematow/24-how-tex-macros-actually-work-part-6.md)


---

# 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/wiecej-tematow/19-how-tex-macros-actually-work-part-1.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.
