> 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/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# Jak działa \expandafter: znaczenie rozwijania

[Część 1](/latex/pl/artykuly-szczegolowe/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Część 2](/latex/pl/artykuly-szczegolowe/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Część 3](/latex/pl/artykuly-szczegolowe/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Część 4](/latex/pl/artykuly-szczegolowe/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Część 5](/latex/pl/artykuly-szczegolowe/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Część 6](/latex/pl/artykuly-szczegolowe/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## Koncepcja „rozszerzania” w TeX-u

Po przejrzeniu [tokenów i list tokenów TeX-a](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true), kolejnym tematem w naszej liście zagadnień tła dla `\expandafter` jest koncepcja TeX-a dotycząca *rozwijanie*: podstawowy proces TeX-a `\expandafter` został zaprojektowany do pracy z.

### O wyzwaniu wyjaśniania rozszerzania...

Dla większości z nas koncepcja rozszerzania w TeX-u oraz powody/mechanizm(y) stojące za nią mogą być mylące — niełatwo je *w pełni* wyjaśnić w prosty, zwięzły sposób. Wewnętrzne operacje/procesy TeX-a są ze sobą powiązane w dość złożony sposób, co może stwarzać trudności, gdy próbujemy „rozłożyć na czynniki” pewne aspekty działania TeX-a: próbując omawiać je w oderwaniu od programu jako całości. Rozszerzanie z pewnością jest pojęciem, które mieści się w tej kategorii, ponieważ jest to *fundamentalnym* element zachowania TeX-a i głęboko wbudowany we wszystkie jego wewnętrzne procesy. Jednak ten artykuł próbuje zbudować wyjaśnienie rozszerzania, oferując fundament, na którym czytelnicy mogą się oprzeć.

Aby wyjaśnić mechanizm rozszerzania TeX-a, będziemy postępować krok po kroku, przeglądając szereg powiązanych/istotnych tematów i składając je razem, aby zbudować zrozumienie tego kluczowego elementu zachowania TeX-a. Później w artykule, a także dla bardziej odważnego czytelnika lubiącego szczegóły, zajrzymy do wnętrza samego TeX-a, podsumowując kluczowy kod źródłowy, który napędza proces rozszerzania.

### Najważniejsze informacje o tokenach TeX-a

W całej poniższej dyskusji ważne jest, aby pamiętać, że TeX może pobierać swój następny element wejścia z dwóch źródeł:

1. **fizycznych plików tekstowych**: generując *nowe tokeny* poprzez odczytywanie/skanowanie znaków i poleceń w tych plikach, lub
2. **listach tokenów**: pobierając dane wejściowe przez odczytywanie z listy istniejących, *wstępnie przygotowanych*, tokenów przechowywanych w pamięci TeX-a.

Przypomnijmy też, że TeX używa tokenów jako wygodnego sposobu na schludne „pakowanie” informacji o dowolnym elemencie (znaku lub poleceniu), który odczytał.

Gdy TeX generuje *nowe tokeny* to, *w momencie tworzenia tokenu*, będzie miał natychmiastowy dostęp do informacji o elemencie, którego wartość tokenu oblicza. Na przykład, podczas generowania nowych tokenów poleceń, TeX najpierw oblicza wartość zwaną `curcs` która umożliwia TeX-owi wyszukanie informacji o poleceniu, którego token ma właśnie utworzyć.

Jednak jeśli TeX odczytuje z list tokenów (ciągów *zapisanych tokenów*) to najpierw musiałby „rozpakować” każdy token z tej listy, zanim mógłby ustalić, co każdy token reprezentuje. Na przykład TeX mógłby odczytywać tokeny zapisane jako część definicji makra: tokeny te zostałyby wygenerowane z tekstu, który dawno temu został wczytany, zamieniony na tokeny i odłożony. Typ tokenu (znak lub polecenie) określa, co właściwie oznacza „rozpakowanie” w TeX-ie:

* dla *tokeny poleceń* (wartość tokenu > 4095): oblicz `curcs` za pomocą $$\text{curcs}=\text{token value}-4095$$ i użyj `curcs` do wyszukania informacji o poleceniu;
* dla *tokeny znakowe* (wartość tokenu < 4095): rozdziel token znakowy na składającą się z niego parę (kod znaku, kod kategorii).

### Na początku...

Aby rozpocząć nasze badanie rozszerzania, przyjrzymy się temu, jak silniki TeX-a klasyfikują lub kategoryzują zestaw poleceń, które mogą przetwarzać. Na razie załóżmy, że „rozszerzalny” jest po prostu jakąś, jeszcze niewyjaśnioną, „cechą” polecenia TeX-a.

### Pojęcie poleceń „rozszerzalnych”

Wszystkie programy składu oparte na TeX-u (silniki TeX-a) rozumieją dwie główne „klasy” poleceń:

* polecenia wbudowane w sam silnik wykonywalny: tak zwane *prymitywów*;
* polecenia zdefiniowane przez użytkownika: tak zwane *makr*.

Silniki TeX-a używają również „bycia rozszerzalnym”, czyli rodzaju „zachowania” polecenia, jako mechanizmu klasyfikowania wszystkich poleceń do dwóch grup:

* polecenia rozszerzalne;
* polecenia nierozszerzalne.

Zatem możemy uznać, że zbiór wszystkich poleceń (prymitywy plus makra) można sklasyfikować, jak pokazano na poniższej ilustracji:

![Diagram pokazujący klasyfikację wszystkich poleceń TeX-a](/files/84408ca4e9518b086e0c1b7ff6417d15be5643d5)

Chociaż jeszcze nie wiemy, co tak naprawdę oznacza rozszerzanie/rozszerzalność, można zauważyć, że:

* wszystkie makra są klasyfikowane jako polecenia rozszerzalne;
* niektóre polecenia prymitywne (wbudowane) są również klasyfikowane jako rozszerzalne (zdecydowana większość nie jest).

**Uwaga o aktywnych znakach**: Oprócz prymitywów i makr istnieje trzecia klasa elementów „rozszerzalnych”: aktywne znaki — wszelkie znaki, którym przypisano kod kategorii 13, są również uważane za „rozszerzalne”, ponieważ są przetwarzane jako „miniaturowe makra”.

#### Skąd TeX wie, czy polecenie jest „rozszerzalne”?

Z naszej [dyskusji o tokenach TeX-a](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) wiemy, że tokeny są niczym więcej niż liczbami całkowitymi, które TeX oblicza i używa do „pakowania” informacji o elemencie wejścia: znaku lub poleceniu. Zauważyliśmy również, że mając dowolną wartość tokenu (liczby całkowitej), TeX może, gdy jest to wymagane, odwrócić proces tokenizacji, aby „rozpakować” token i ujawnić dane o reprezentowanym przez niego poleceniu lub znaku.

Korzystając z danych powstałych, gdy TeX tworzy nowy token, lub z danych wydobytych z istniejącego tokenu — np. przechowywanego w makrze lub innej liście tokenów — TeX może sprawdzić swoje wewnętrzne tablice przechowywania danych, aby znaleźć szczegółowe informacje o poleceniu (lub znaku) reprezentowanym przez ten token. Poniższa ilustracja podsumowuje proces tworzenia tokenu polecenia („pakowania”), a następnie, gdy TeX potrzebuje pewnych informacji, odwracania procesu („rozpakowywania” tokenu) w celu uzyskania danych o poleceniu reprezentowanym przez określoną wartość tokenu.

![Diagram pokazujący, jak TeX pakuje/rozpakowuje tokeny](/files/137310ecf4c5857ea5d9c7f19b85baa96d37c7a7)

### Kody poleceń

Częścią informacji, które TeX przechowuje o każdym poleceniu (prymitywie lub makrze), jest coś, co nazywa się jego *kodem polecenia*: wartością całkowitą, której silniki TeX-a używają (wewnętrznie) do klasyfikowania poleceń — polecenia o podobnym zachowaniu/funkcjonalności mają ten sam kod polecenia.

**Uwaga**: Dla pojedynczego, *nieaktywne*, znaku, jego kodem polecenia jest *kodem kategorii* przypisany w momencie, gdy został wczytany (zeskanowany) przez TeX-a. Zwróć też uwagę, że z wyjątkiem znaków kody poleceń są czysto wewnętrzne dla TeX-a: nie są dostępne przez makra ani polecenia prymitywne — aby zobaczyć te szczegóły, trzeba zajrzeć do kodu źródłowego TeX-a!

Oto kilka przykładów kodów poleceń:

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` (i inne) są wszystkie klasyfikowane jako polecenia „tworzące pudełka” i mają wspólny kod polecenia 20;
* `\def`, `\edef`, `\gdef`, `\xdef` są wszystkie poleceniami „definicji makr” i mają wspólny kod polecenia 97;
* wszystkie makra są klasyfikowane jednym z kodów poleceń 111, 112, 113 lub 114: różne kody poleceń są określane przez użycie `\long` lub `\outer` przy definiowaniu makra:
* 111: kod polecenia dla makra nie-long, nie-outer (np., `\def\foo{...}`)
* 112: kod polecenia dla makra long, nie-outer (np., `\long\def\foo{...}`)
* 113: kod polecenia dla makra nie-long, outer (np., `\outer\def\foo{...}`)
* 114: kod polecenia dla makra long, outer (np., `\long\outer\def\foo{...}`)

TeX używa również kodów poleceń do identyfikowania podzbioru poleceń sklasyfikowanych jako „rozszerzalne”. Aby to zrobić, TeX przypisuje poleceniom rozszerzalnym wartości kodów poleceń przekraczające wartość progową 100 (wartość używaną przez oryginalny TeX Knutha, e-TeX i pdfTeX). W konsekwencji:

* *nierozwijalnych* polecenia (zdecydowana większość) mają kod polecenia <= 100
* *rozszerzalne* polecenia mają kod polecenia > 100

Zatem jeśli TeX sprawdzi szczegóły dla określonego polecenia i wykryje kod polecenia > 100, od razu wie, że jest ono rozszerzalne. Wszystkie makra i niewielka liczba prymitywów (wbudowanych poleceń) otrzymują kod polecenia wskazujący, że są rozszerzalne: ale dlaczego TeX w ogóle zawraca sobie głowę tą klasyfikacją „rozszerzalne”? Jak można się domyślać, oznacza to po prostu, że te polecenia są nieco „specjalne”; tzn. mogą być poddane procesowi TeX-a *rozwijanie*.

**Uwaga (znaki)**: O ile znak nie został zdefiniowany jako aktywny (kod kategorii 13), wszystkie znaki są nierozszerzalne. Aktywne znaki można traktować jako jednowyrazowe „mini makra”.

## Tak, tak, ale czym jest rozszerzanie???

Zauważyliśmy, że wartości tokenów większe niż 4095 są używane do reprezentowania poleceń; w konsekwencji TeX może, gdy jest to wymagane, „rozpakować” ten token, aby uzyskać dostęp do informacji o poleceniu TeX-a reprezentowanym przez ten token. TeX może sprawdzić wartość kodu polecenia tego polecenia, aby ustalić, czy należy ono do specjalnej kategorii rozszerzalnych. Ale co TeX robi z tą informacją i co oznacza „bycie rozszerzalnym”, czyli rozszerzanie, *naprawdę znaczy*?

### Rozszerzanie: Ogólny termin dla zestawu operacji

Na pewnych etapach przetwarzania TeX musi wiedzieć, czy token reprezentuje polecenie rozszerzalne:

* **Nie**: Jeśli ten token polecenia *nie* nie należy do kategorii rozszerzalnych, TeX po prostu „przekazuje go dalej” do następnego etapu przetwarzania.
* **Tak**: Jeśli ten token polecenia *nie* nie należy do kategorii rozszerzalnych, można myśleć, że TeX musi podjąć działanie, które skutkuje „odfiltrowaniem” tego konkretnego tokenu poprzez wykonanie procesu, który TeX nazywa „rozszerzaniem tego tokenu”, czyli wykonywaniem rozszerzania.

W istocie rozszerzanie polega na tym, że TeX *usunięcie* ten token z jego wejścia i *zastąpienie* zastępuje go tokenami wynikającymi z procesu „rozszerzania” właściwego dla tego polecenia lub grupy poleceń mających ten sam kod polecenia.

Trzeba praktyki i doświadczenia, aby wiedzieć, kiedy TeX dokonuje, a kiedy nie dokonuje rozszerzania tokenów — strona 215 The TeXbook wymienia sytuacje, w których rozszerzalne tokeny nie są rozszerzane. Rzeczywistość jest taka, że proces rozszerzania wykonywany przez TeX jest złożony i pełen niuansów.

#### Które polecenia są rozszerzalne?

Jeśli spojrzysz na listę prymitywnych (wbudowanych) poleceń, które silniki TeX-a klasyfikują jako rozszerzalne (np. strony 212–215 The TeXbook), staje się jasne, że w praktyce rozszerzanie jest dość ogólnym terminem, którego TeX używa do opisania zachowania dość eklektycznej grupy poleceń. Wyniki rozszerzania konkretnego (rozszerzalnego) polecenia rzeczywiście się różnią i możemy to zobaczyć, wymieniając zestaw poleceń rozszerzalnych — pogrupowanych według ich funkcjonalności. Dokładna semantyka poszczególnych poleceń nie jest tutaj ważna, najciekawsze są ogólne konsekwencje ich działań — co ich rozszerzanie właściwie *robi lub osiąga*.

| **Polecenie**                                                                                                                                                                                                                                                                                                                                                                                                                                                              | **Opis**                                                                                                                                                                 | **Zachowanie rozszerzania**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <ul><li>wszystkie makra</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                          | Zapisana sekwencja tokenów poleceń/znaków                                                                                                                                | <p>W praktyce rozszerzanie makra oznacza wstawienie listy tokenów do odczytu przez TeX. Obejmuje to:</p><ul><li>tworzenie list tokenów dla dowolnych argumentów makra — proces ten obejmuje identyfikację/wchłanianie tokenów ograniczników;</li><li>pobieranie listy zapisanych tokenów (definicji makra) i przygotowywanie się do wstawienia (do definicji makra) tokenów parametrów utworzonych w pierwszym kroku.</li></ul><p>W praktyce rozszerzanie makra <em>usuwa token makra</em> usuwane z wejścia i <em>zastępuje go</em> tokenami zawartymi w definicji.</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | Zmień kolejność rozszerzania                                                                                                                                             | Filtrowanie/przetasowywanie tokenów                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | Zapobiegaj rozszerzaniu (tak, zaskakująco jest to sklasyfikowane jako polecenie rozszerzalne)                                                                            | Opóźnij rozszerzanie (coś w rodzaju filtrowania tokenów)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | Związane z wprowadzaniem nowego źródła tokenów za pomocą plików źródłowych — tak, `\scantokens` w tej kategorii ze względu na użycie tak zwanych „pseudo-plików”         | Działa jako źródło nowych tokenów                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | Rozpocznij wyrażenie warunkowe                                                                                                                                           | Rozpocznij „filtrowanie” tokenów: decydowanie, które z poniższych tokenów przetworzyć.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | Zakończ wyrażenie warunkowe                                                                                                                                              | Zatrzymaj „filtrowanie” tokenów: decydowanie, które tokeny przetworzyć                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | Konstruuj/generuj token polecenia                                                                                                                                        | Przekształć serię tokenów w pojedynczy token polecenia                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | Przekształć coś w sekwencję tokenów                                                                                                                                      | Wygeneruj pewne tokeny (reprezentujące wewnętrzną wielkość lub wartość)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` ma różne zastosowania, w tym wstawianie tokenów; `\detokenize` przekształca listę tokenów w listę tokenów znakowych; `\unexpanded` zapobiega rozszerzaniu tokenów | Wstaw/generuj pewne tokeny lub kontroluj rozszerzanie                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | Polecenia służące do dostępu do list tokenów o specjalistycznym zastosowaniu                                                                                             | Uzyskaj dostęp do źródła zapisanych tokenów (list tokenów)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |

Na podstawie powyższej listy, czy można wydzielić jakieś „ogólne zachowania” z tego zbioru poleceń — aby dalej doprecyzować nasze rozumienie rozszerzania? W dość dobrym przybliżeniu wyniki rozszerzania polecenia sprowadzają się do kilku kluczowych działań:

* generowanie tokenów
* wstawianie tokenów
* filtrowanie tokenów
* zmiana/kontrola rozszerzania następnego tokenu

### I wreszcie: znaczenie rozszerzania?

Możemy uznać, że rozszerzanie tokenu polecenia (w tym aktywnych znaków) polega na tym, że TeX **usunięcie** ten token polecenia z wejścia i **zastąpienie** ten token innymi tokenami wynikającymi z jego zachowania rozszerzającego: generowaniem/wstawianiem tokenów, filtrowaniem tokenów lub zmianą/kontrolą rozszerzania następnego tokenu. Gdy token zostanie rozszerzony, TeX będzie kontynuował odczytywanie/przetwarzanie wszelkich tokenów, które mogą wyniknąć z procesu rozszerzania. Dokładnie kiedy lub gdzie TeX wykona rozszerzanie, to zupełnie inne pytanie: ze względu na niuanse i złożoność przetwarzania TeX-a nie możemy mieć nadziei na pełne omówienie tego w tym artykule, ale możemy dać przegląd głównego zachowania TeX-a przy przetwarzaniu wejścia.

## Rozszerzanie i struktura TeX-a

Można argumentować, że najlepszym sposobem zobaczenia, jak/gdzie TeX rozróżnia polecenia rozszerzalne i nierozszerzalne, jest spojrzenie na kod źródłowy TeX-a.

Wewnętrznie TeX jest niezwykle złożonym oprogramowaniem; w konsekwencji niepraktyczne jest próbowanie pełnego opisu wielu subtelnych zachowań właściwych działaniu TeX-a. Jak wspomniano, dokładnie kiedy lub gdzie TeX rzeczywiście wykonuje rozszerzanie, gdy odczytuje tokeny, jest „dość złożone”; dlatego poniższa dyskusja zakłada, że TeX znajduje się w stanie wymagającym przeprowadzenia rozszerzania. Sytuacje, w których TeX odczytywałby/tworzyłby tokeny, ale nie wykonywałby rozszerzania, obejmują tworzenie/zapisywanie tokenów dla `\def` polecenia definiowania makra lub przechowywania tokenów w `\toks` rejestrze.

Poniższy diagram przedstawia uproszczony przegląd podstawowych części struktury TeX-a, które zajmują się wejściem i przetwarzaniem tokenów: celem jest podkreślenie sposobu, w jaki tokeny rozszerzalne i nierozszerzalne są „filtrowane” podczas przetwarzania wejścia przez TeX. Do opisu różnych kluczowych funkcji używa się języka programowania C, ale miejmy nadzieję, że podstawowa struktura będzie jasna nawet jeśli nie znasz języka C.

![](/files/128a7a162342ec0295acab1fb74be0d3b0ced4f5)

### Wyjaśnienie diagramu struktury TeX-a

W zarysie przetwarzanie TeX-a jest sterowane przez funkcję o nazwie `maincontrol()` którą w kodzie źródłowym TeX-a Knuth nazywa „głównym dyrektorem wykonawczym” i opisuje następująco:

> „Dochodzi teraz do `maincontrol` procedury, która zawiera główny przełącznik powodujący, że wszystkie różne części TeX-a robią swoje we właściwej kolejności… to jest wielki finał programu… Jesteśmy teraz w centrum sieci, w centralnym układzie nerwowym, który dotyka większości innych części i łączy je ze sobą.”

Poniższy opis jest nieco uproszczony, ale daje „poczucie” leżącej u podstaw struktury oprogramowania opartego na TeX-ie: tego, jak polecenia rozszerzalne są identyfikowane („przechwytywane”) i odfiltrowywane podczas przetwarzania wejścia przez TeX.

W istocie, na najwcześniejszym etapie przetwarzania wejścia TeX używa wartości kodu polecenia bieżącego polecenia (tokenu), aby wykrywać polecenia rozszerzalne (makra, rozszerzalne prymitywy i aktywne znaki); jeśli któryś zostanie zidentyfikowany, takie polecenia są „przechwytywane” i „wstępnie przetwarzane” — poprzez rozszerzanie. Dzięki temu procesowi filtrowania (rozszerzania) TeX usuwa polecenia rozszerzalne z wejścia i zastępuje je tokenami wynikającymi z ich odpowiedniego zachowania rozszerzającego. Gdy proces rozszerzania zostanie zakończony, TeX odczyta wszelkie tokeny powstałe w wyniku tego rozszerzenia. Tylko elementy nierozszerzalne są przekazywane do następnego etapu przetwarzania TeX-a: „dużego przełącznika”, gdzie TeX wykona wszystkie nierozszerzalne polecenia prymitywne i złoży znaki.

### Zrozumieć maincontrol()

Ta `maincontrol()` funkcja zawiera dużą tak zwaną [instrukcję switch](https://en.wikipedia.org/wiki/Switch_statement)—Knuth nazywa ją „dużym przełącznikiem” — której TeX używa do wykonywania wszystkich *nierozwijalnych* poleceń prymitywnych: tych z kodem polecenia <=100.

Aby wykonać konkretne polecenie (lub znak), ta instrukcja „dużego przełącznika” używa połączenia bieżącego trybu TeX-a:

* wewnętrznego/zewnętrznego pionowego, lub
* ograniczonego/akapitowego poziomego, lub
* trybu matematycznego wbudowanego/wyświetlanego

*plus* wartości kodu polecenia dla każdego prymitywu lub znaku — kodem polecenia *nieaktywne* znaku jest jego *kodem kategorii* wartość. Dla porządku, wszystkie 6 trybów TeX-a ma przypisaną wartość całkowitą, którą TeX może używać do zapisywania i przywracania bieżącego trybu podczas przełączania się między składem różnych konstrukcji — matematyki, akapitów, pudełek i tak dalej. Oto liczby całkowite przypisane do różnych trybów TeX-a:

|                                         |                                    |                   |
| --------------------------------------- | ---------------------------------- | ----------------- |
| **Tryb**                                | **Znaczenie**                      | **Wartość trybu** |
| Zewnętrzny pionowy                      | Między akapitami (budowanie stron) | 1                 |
| Wewnętrzny pionowy                      | Bezpośrednio wewnątrz `\vbox{...}` | -1                |
| Poziomy                                 | Gdy składane/budowane są akapity   | 102               |
| Ograniczony poziomy                     | Bezpośrednio wewnątrz `\hbox{...}` | -102              |
| Wyświetlany tryb matematyczny           | Składanie *blokowym* równań/formuł | 203               |
| Wbudowany (formułowy) tryb matematyczny | Składanie *liniowym* równań/formuł | -203              |

Zwróć uwagę na użycie wartości ujemnych dla dopełnień różnych trybów, takich jak wewnętrzny vs. zewnętrzny pionowy tryb. Podczas przetwarzania poleceń w `maincontrol()`, TeX używa wartości bezwzględnej bieżącego trybu — tj. ignoruje znak ujemny. Na przykład, jeśli TeX znajduje się w jednym ze swoich trybów poziomych i musi przetworzyć znak z kodem kategorii 11, użyje sumy $$102 + 11 = 113$$ wewnątrz swojego „dużego przełącznika”, aby przejść do kodu, który przetwarza te znaki w dowolnym trybie poziomym (budowanie akapitów lub wewnątrz `\hbox`).

#### Pobieranie następnego tokenu

Ta `maincontrol()` funkcja wywołuje funkcję `getxtoken()` aby pobrać następny token wejścia; z kolei `getxtoken()` wywołuje najniższopoziomową funkcję wejściową `getnext()`. Po tym, jak `getnext()` zakończyła swoją pracę i ustawiła wartość kluczowych *zmiennych globalnych*, `getxtoken()` sprawdza, czy właśnie wczytany element reprezentuje makro lub rozszerzalny prymityw.

Kilka uwag o `getnext()` i `getxtoken()`:

* **`getnext()`**: to jest podstawowa funkcja wejściowa TeX-a. Odczytuje i przetwarza znaki wejściowe z fizycznego pliku lub odczytuje tokeny z listy tokenów. Zauważ, że `getnext()` właściwie nie oblicza wartości tokenu, ale ustawia kilka kluczowych *globalnych* zmiennych (np. kod polecenia i `curcs`) które są używane później w przetwarzaniu.
* **`getxtoken()`**: „get expanded token” używa `getnext()` aby odczytać następny element wejścia. Następnie sprawdza kod polecenia właśnie odczytanego elementu, aby zobaczyć, czy element ten reprezentuje polecenie rozszerzalne: jeśli tak, jest rozszerzany lub wywoływane jest makro. Dla elementów nierozszerzalnych `getxtoken()` oblicza wartość tokenu i te szczegóły są przekazywane do następnego etapu przetwarzania: „dużego przełącznika”, gdzie wykonywane są nierozszerzalne prymitywy i składane są znaki.

W istocie to za pomocą `getxtoken()` wszystkie elementy rozszerzalne są „odfiltrowywane” zanim zostaną przetworzone w `maincontrol()`: skutkuje to tym, że „duży przełącznik” TeX-a przetwarza tylko nierozszerzalne polecenia prymitywne.

Jeszcze raz podkreślamy, że powyższy diagram jest uproszczeniem, ponieważ inne obszary przetwarzania TeX-a również powodują rozszerzanie tokenów; na przykład:

* gdy TeX szuka (skanuje) wartości numerycznych, uruchamia rozszerzanie w poszukiwaniu liczb całkowitych (wywołując `getxtoken()`) ;
* polecenie prymitywne `\romannumeral` powoduje rozszerzanie — zobacz artykuł [Rozszerzanie za pomocą `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) dla niuansowego wykorzystania tego faktu;
* Ta `\edef` („rozszerzona definicja”) polecenie definicji makra wymusza pełne rozszerzanie;
* TeX rozszerza tokeny w pewnych punktach podczas przetwarzania preambuły `\halign` lub `\valign` (oba polecenia są związane z algorytmami składu tabel w TeX-ie).

[Część 1](/latex/pl/artykuly-szczegolowe/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [Część 2](/latex/pl/artykuly-szczegolowe/22-how-does-expandafter-work-the-meaning-of-expansion.md) [Część 3](/latex/pl/artykuly-szczegolowe/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [Część 4](/latex/pl/artykuly-szczegolowe/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [Część 5](/latex/pl/artykuly-szczegolowe/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [Część 6](/latex/pl/artykuly-szczegolowe/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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/artykuly-szczegolowe/22-how-does-expandafter-work-the-meaning-of-expansion.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.
