> 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/23-how-tex-macros-actually-work-part-5.md).

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

[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 i omówienie

W Części 4 omówiliśmy kilka podstawowych właściwości makr TeX-a w ramach przygotowań do dwóch następnych artykułów, w których przyjrzymy się z bliska mechanice stojącej za makrami TeX-a: specjalnym listom tokenów. W tych dwóch ostatnich artykułach używamy diagramów, zwanych listami węzłów, które przygotowano na podstawie danych wygenerowanych za pomocą specjalnie zmodyfikowanej wersji oryginalnego oprogramowania TeX Knutha — modyfikacje te miały na celu uzyskanie dostępu do wewnętrznych struktur danych TeX-a, które normalnie są niedostępne dla użytkownika. Dzięki „wpięciu się” w wewnętrzne procedury przetwarzania i wykonywania makr TeX-a udało się zapisać dane graficzne, które umożliwiają bardziej szczegółową i dokładną dyskusję o zachowaniu TeX-a podczas przetwarzania makr. Overleaf ma nadzieję, że te diagramy pomogą czytelnikom lepiej zrozumieć, jak naprawdę działają makra TeX-a.

### Możliwe dodatkowe materiały do przeczytania

Overleaf opublikował już dwa artykuły dotyczące tokenów, które dostarczają dodatkowych informacji o tokenach TeX-a i listach tokenów TeX-a. Poświęć proszę chwilę, aby je sprawdzić, jeśli musisz uzupełnić jakieś luki w swojej wiedzy i w pełni skorzystać z Części 5 i 6 tej serii.

* [Czym jest „token TeX-a”?](/latex/pl/artykuly-szczegolowe/53-what-is-a-tex-token.md)
* [Czym jest lista tokenów TeX-a?](/latex/pl/artykuly-szczegolowe/54-what-is-a-tex-token-list.md)

## Makra jako listy tokenów

Gdy TeX wykrywa polecenie tworzenia makra (`\def`, `\edef`, `\gdef` lub `\xdef`) w strumieniu wejściowym, uruchamia proces, który przekształca obie sekcje `<tekst parametrów><tekst zastępczy>` naszej definicji makra w jedną długą listę tokenów — ale bardzo szczególnego rodzaju listę tokenów.

Listy tokenów dla makr różnią się nieco od innych list tokenów używanych w TeX-ie, ponieważ zawierają „specjalne” wartości tokenów, które mogą być tworzone/generowane tylko przez procesy wewnętrzne samego TeX-a: takich specjalnych tokenów nie da się bezpośrednio utworzyć żadnym poleceniem, które można umieścić w pliku .tex. TeX tworzy i używa tych „specjalnych” wartości tokenów, aby ułatwić przetwarzanie wywołania makra, jak wyjaśnimy i omówimy poniżej.

### Krótkie słowo o tym, jak są przechowywane listy tokenów: węzły

Do przechowywania listy tokenów (wartości całkowitych) TeX używa struktury danych zwanej [listą połączoną](https://en.wikipedia.org/wiki/Linked_list), która w przypadku TeX-a składa się z listy tak zwanych *węzłów*. Można myśleć o węźle jako o małym pakiecie pamięci komputerowej, który może służyć do przechowywania zbioru elementów danych. Aby przechować makro, węzły te są łączone w łańcuch, gdzie każdy węzeł (ogniwo łańcucha) może przechowywać kilka informacji — w tym wartość tokenu i adres pamięci następnego węzła na liście. Więcej informacji znajdziesz w artykule [Czym jest lista tokenów TeX-a](/latex/pl/artykuly-szczegolowe/54-what-is-a-tex-token-list.md) , ale poniższy diagram podsumowuje najważniejsze cechy makra przechowywanego jako lista tokenów:

![Diagram listy tokenów makra TeX-a przechowywanego jako połączona lista węzłów](/files/ddea9ada543436b26ff7a67d2313ff756741f4e2)

### Przypomnienie: 4 części definicji makra

Jak omówiono w Części 4, strukturę dowolnego makra można zapisać jako:

```
<prymityw makra TeX-a><nazwa makra><tekst parametrów>{<tekst zastępczy>}
```

gdzie:

* `<prymityw makra TeX-a>` = jeden z `\def`, `\edef`, `\gdef` lub `\xdef`;
* `<nazwa makra>`= nazwa Twojego makra, taka jak `\foo`;
* `<tekst parametrów>` może być „pusty” (nieobecny) albo może być ciągiem tokenów separatora i tokenów parametrów makra;
* `<tekst zastępczy>` jest rzeczywistym ciałem Twojego makra: sekcją, która jest „wykonywana” po wywołaniu makra.

**UWAGA**: (Jak zauważono również w Części 4) w całej dyskusji zakładamy, że `<nazwa makra>` będzie poprzedzone spacją o kodzie kategorii 10, która posłuży jako separator kończący `<nazwa makra>`. My *nie* pokazaliśmy wyraźnie tej spacji w naszym tekście/dyskusji, ale zakładamy, że tam jest. Ściśle rzecz biorąc, powinniśmy przedstawić to mniej więcej tak:

```
<prymityw makra TeX-a><nazwa makra><spacja><tekst parametrów>{<tekst zastępczy>}
```

Jednak pominiemy jawne uwzględnianie `<spacja>` znaku i domyślnie założymy jego obecność.

**UWAGA**: Znaki `{` i `}` *nie* stają się częścią listy tokenów makra: ich celem jest po prostu wskazanie skanerowi wejścia TeX-a (który tworzy tokeny), gdzie `<tekst zastępczy>` zaczyna się i kończy.

Gdy TeX definiuje makro, sekcje `<tekst parametrów><tekst zastępczy>` są przekształcane w jedną długą, ciągłą listę tokenów — całkowita liczba tokenów na tej liście zależy od złożoności makra. Jak widzieliśmy, sekcja ma konkretny cel: działa jako „szablon tokenów” lub „plan”, z którego TeX korzysta, aby wyodrębnić tokeny tworzące argumenty (wartości) używane z rzeczywistym makrem: czyli tokeny przekazywane do `<tekst zastępczy>`.

Aby doprecyzować te idee, weźmy przykładowe makro, ale zachowajmy je krótkie, aby kolejne diagramy nie stały się zbyt przeładowane:

```
\def\foo A#1\fake{123 #1}
```

Dla naszego makra, `\foo`

* `<tekst parametrów>` = `A#1\fake`
* `<tekst zastępczy>` = `123 #1`

Chociaż ten przykład jest prostym makrem, zawiera wszystkie cechy, które musimy zbadać.

Jak zauważono, TeX przekształci `<tekst parametrów><tekst zastępczy>` w jedną długą listę tokenów, którą możesz zobaczyć na poniższym diagramie. W naszym przykładzie tokeny utworzone z `A#1\fake{123 #1}` zostały przekształcone w kolejny ciąg tokenów przechowywany w liście tokenów (jako lista połączona z węzłów).

## Grafika pokazująca rzeczywistą listę tokenów makra

Poniższy diagram, pokazujący, jak przechowywane jest makro `\def\foo A#1\fake{123 #1}` , wykorzystuje prawdziwe dane z wnętrza silnika TeX. Został utworzony przy użyciu [spersonalizowanej wersji TeX-a Knutha](/latex/pl/artykuly-szczegolowe/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) , zmodyfikowanej dodatkowymi kodami przechwytującymi wywołania makr, analizującymi wewnętrzne dane TeX-a i eksportującymi je w formacie do przetwarzania za pomocą programu graficznego open source o nazwie [Graphviz](https://www.graphviz.org/).

Poniższą grafikę możesz pobrać jako [plik PDF](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 KB) lub [plik SVG](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 MB).

![Diagram anotowanej listy tokenów TeX-a](/files/8358d9edbb90b6f6320a6586c346667ac59593b6)

#### Zrozumienie węzłów

W powyższym diagramie zobaczysz, że każdy węzeł zawiera dwa elementy danych zwane **następnym węzłem** oraz **bieżącym węzłem**. Są to po prostu wartości całkowite reprezentujące lokalizacje pamięci wewnątrz TeX-a — miejsca, w których przechowywane są inne węzły. Wartości **następnym węzłem** i **bieżącym węzłem** nie są istotne, po prostu przechowują lokalizacje (adresy pamięci), które pozwalają łączyć węzły w listę.

![Znaczenie następnego węzła i bieżącego węzła](/files/f250a391c81b25199363dd7c19ac1b0e2502f3a8)

#### Powrót do przykładu

W diagramie węzłów lista tokenów utworzona z `A#1\fake{123 #1}` zawiera kilka „specjalnych tokenów” wprowadzonych na początku tego artykułu. Ponadto lista węzłów reprezentująca nasze makro zaczyna się od „specjalnego pierwszego węzła”: przyjrzymy się temu, czym one są i co robią.

Pierwszy element w liście tokenów makra (i w niektórych innych typach list tokenów) nie przechowuje wartości tokenu, lecz element danych zwany *liczbą odwołań* makra, którą TeX wykorzystuje do śledzenia użycia makra.

![Węzeł liczby odwołań jest pierwszym w liście tokenów](/files/9ed6048b562d2d573c12013456cb807ba1a71bf8)

Pierwszy token `<tekst parametrów>` jest przechowywany w węźle następującym bezpośrednio po liczbie odwołań: widać, że jest to token reprezentujący literę `Skopiowany` o kodzie kategorii 11. Z dyskusji w Częściach 2 i 3 wiemy, że token znaku jest obliczany za pomocą

$$\text{token value}=256\times \text{category code} + \text{character code}$$

który dla litery `Skopiowany` o kodzie kategorii 11 wynosi

$$\text{token value}=256\times 11 + 65$$

dając wartość 2881, jak pokazano w węźle.

#### „Polecenie” \fake użyte w \foo

W naszej definicji makra `\def\foo A#1\fake{123 #1}` jednym z ograniczników jest *niezdefiniowane* polecenie `\fake` , które jest przechowywane w liście tokenów jako część `<tekst parametrów>` sekcji. Jak widać, w całej liście tokenów makra `\fake` jest token, którego wartość wynosi `19491`— wartość całkowita obliczona przez TeX za pomocą wzoru omówionego w Części 3. Gdy TeX spróbuje wykonać `\foo` będzie oczekiwał znalezienia wartości tokenu `\fake` na końcu sekcji `<tekst parametrów>` . TeX *nie będzie* próbował wykonać `\fake` polecenia, ponieważ jego rola ogranicza się jedynie do dostarczenia formy „interpunkcji” w `<tekst parametrów>` „szablonie tokenów”.

![Użycie tokenu polecenia jako ogranicznika makra](/files/e281b1b6c012cba6fa8098ca4923213177ee9ded)

#### Specjalne tokeny w liście tokenów

**Token „końca dopasowania”**

Podczas wywoływania makra pierwszym zadaniem TeX-a jest przeskanowanie makra tak, jak zostało wpisane przez użytkownika, i porównanie tokenów obecnych w sekcji `<tekst parametrów>` z tokenami zawartymi w szablonie `<tekst parametrów>` przechowywanym w pamięci (utworzonym w momencie zdefiniowania makra). Ponieważ pełna definicja makra, skonstruowana z `<tekst parametrów><tekst zastępczy>` jest przechowywana jako jedna długa, ciągła lista tokenów, TeX musi wiedzieć, gdzie w tej liście tokenów `<tekst parametrów>` *zatrzymuje się* i gdzie `<tekst zastępczy>` *zaczyna się*. Aby to osiągnąć, gdy TeX definiuje makro (buduje listę tokenów), wstawi specjalny token kończący zwany **końcem dopasowania** token jako ostatni token w zbiorze tokenów wygenerowanych z `<tekst parametrów>`. Pakiet **końcem dopasowania** token nie może być wygenerowany przez polecenia użytkownika; tylko sam TeX może go utworzyć, dlatego TeX z pewnością wykryje koniec `<tekst parametrów>`.

![Pokazanie tokenu końca dopasowania w liście tokenów TeX-a](/files/e46a2971549bd1d843ba6414ff4b74e03e1335eb)

Tutaj widzimy, że pierwszy token następujący po **końcem dopasowania** jest tokenem reprezentującym cyfrę `1` o kodzie kategorii 12. Można się tego spodziewać, ponieważ `<tekst zastępczy>` dla naszego makra `\foo` to `123 #1`— czyli zaczyna się od tokenu reprezentującego cyfrę `1` (o kodzie kategorii 12).

Z dyskusji w Częściach 2 i 3 wiemy, że token znaku jest obliczany za pomocą

$$\text{token value}=256\times \text{category code} + \text{character code}$$

który dla cyfry `1` o kodzie kategorii 12 wynosi

$$\text{token value}=256\times 12 + 49$$

dając wartość tokenu 3121, jak pokazano w węźle.

**tokeny „parametru dopasowania”**

Gdy TeX przechowuje definicję makra, przekształca dowolne tokeny parametrów (`#1`, `#2`… `#9`) w `<tekst parametrów>` token zwany **parametrem dopasowania** . Tokeny te mówią TeX-owi, że musi zacząć szukać tokenów w wywołaniu makra użytkownika, które są argumentami makra.

![Pokazanie tokenu parametru dopasowania w liście tokenów TeX-a](/files/64f65fb98451e1cad64bc1413db3634eefe06034)

### Specjalne tokeny w liście tokenów

#### tokeny „parametru wyjściowego”

Gdy TeX przetworzy wszystko i jest gotów faktycznie uruchomić (rozszerzyć) makro, **tokeny parametru wyjściowego** instruują TeX, gdzie w `<tekst zastępczy>` ma wprowadzić tokeny reprezentujące argumenty podane przez użytkownika podczas wywołania makra. W praktyce: „W tym miejscu wstaw tokeny reprezentujące argument użytkownika n, gdzie n=1...9”.

W `<tekst zastępczy>` sekcji przechowywanej listy tokenów definicji makra będzie **tokeny parametru wyjściowego** token odpowiadający każdemu `#1`, `#2`... `#9` obecnemu w oryginalnej definicji.

![Pokazanie tokenu parametru wyjściowego w liście tokenów TeX-a](/files/acc053703a08efc41f2b211101099ad531189062)

Jeśli spojrzymy na naszą definicję `\foo` (`\def\foo A#1\fake{123 #1}`) widzimy, że istnieje tylko 1 parametr makra (`#1`) w `<tekst parametrów>` (`A#1\fake`) i w konsekwencji tylko 1 parametr makra (`#1`) pojawia się w `<tekst zastępczy>` (`123 #1`): to skutkuje tylko 1 **tokeny parametru wyjściowego** tokenem obecnym w liście tokenów reprezentującej `<tekst zastępczy>`.

Zauważ następujące rzeczy w liście węzłów reprezentującej `\foo`jego `<tekst zastępczy>`:

* token bezpośrednio przed **tokeny parametru wyjściowego** token reprezentuje znak spacji (kod kategorii 10, kod znaku 32), ponieważ między `123` a parametrem makra (`#1`) w oryginalnej definicji `\foo`;
* stronie **tokeny parametru wyjściowego** jest ostatnim tokenem na liście: **następnym węzłem** ma specjalną wartość „null” (co oznacza „pusty”), która jest używana do zakończenia listy: po **tokeny parametru wyjściowego** nie ma już żadnych węzłów, ponieważ jest to token końcowy, wskazujący koniec `<tekst zastępczy>` a tym samym koniec definicji makra.

## Część 6

W Części 6 używamy szczegółowych grafik, aby wyjaśnić i zbadać dokładne znaczenie rozwinięcia makra oraz konsekwencje tokenizacji argumentów makra przez TeX-a przed przekazaniem ich do makra `<tekst zastępczy>`.

[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/23-how-tex-macros-actually-work-part-5.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.
