> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# Puszka Pandory \hbox: użycie LuaTeX do uchylenia wieka pudełek TeX-a

## Wstęp

Pudełka i klej to dwa kluczowe pojęcia, które stanowią fundament modelu składu i możliwości TeX-a. Opierając się na wprowadzającym materiale z poprzedniego wpisu, [Pudełka i klej: krótkie, ale wizualne wprowadzenie z użyciem LuaTeX](/latex/pl/artykuly-szczegolowe/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), ten bogato ilustrowany artykuł przygląda się pudełkom i klejowi bardziej szczegółowo. Przedstawiamy także nowy oparty na LuaTeX [projekt Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) który pozwala zgłębić wewnętrzną strukturę pudełek TeX-a — dostarczając wglądu, który pomoże ci naprawdę zrozumieć ich zachowanie. Stworzenie projektu Overleaf zostało w dużej mierze ułatwione przez pracę Patricka Gundlacha, więc składamy [mu podziękowania](#credits-thanks-patrick).

## Dlaczego wybrać LuaTeX?

Po pierwsze, warto jeszcze raz wyjaśnić różnicę między LuaTeX a LuaLaTeX:

* LuaTeX to nazwa wykonywalnego silnika składu opartego na TeX-ie;
* LuaLaTeX odnosi się do użycia pakietu makr LaTeX z silnikiem LuaTeX.

To rozróżnienie jest niezwykle ważne, ponieważ w tym artykule wykorzystujemy wbudowane możliwości samego silnika LuaTeX, a nie tylko korzystamy z funkcji udostępnianych przez pakiet makr LaTeX.

Czytelnikom, którzy nie są pewni różnicy między silnikiem TeX a pakietem makr LaTeX, może się przydać lektura jednego z naszych wcześniej opublikowanych artykułów, [Co kryje się w nazwie: przewodnik po wielu odmianach TeX-a](/latex/pl/artykuly-szczegolowe/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), który dość szczegółowo wyjaśnia te różnice. Ten sam artykuł omawia również „TeX” jako język programowania oraz to, że silniki składu oparte na TeX-ie (np. pdfTeX, XeTeX i LuaTeX) różnią się nie tylko funkcjami i możliwościami, ale także odmianą języka TeX, którą obsługują. To prowadzi nas do wyboru LuaTeX. Oprócz obsługi języka programowania opartego na TeX-ie, LuaTeX ma również wbudowany język skryptowy Lua — zapewniając dostęp do prostego, ale bardzo potężnego, klasycznego języka programowania. Dzięki Lua oraz wbudowanej funkcjonalności LuaTeX-a możesz badać i kontrolować działania składu LuaTeX-a w sposób, którego nie oferuje żaden inny silnik TeX — a obejmuje to także możliwość zaglądania do wewnętrznych struktur pudełek TeX-a; dlatego LuaTeX jest idealnym (jedynym) wyborem dla tego artykułu i towarzyszącego mu projektu Overleaf.

### pdfTeX/XeTeX kontra LuaTeX: w obrazach

Poniższe *schematy* mają na celu podkreślenie ważnego porównania między konstrukcją pdfTeX/XeTeX a LuaTeX. Zarówno pdfTeX, jak i XeTeX oczywiście pozwalają użytkownikom pisać kod TeX, który może wpływać na zachowanie składu; jednak głębsze wewnętrzne struktury zawarte w tych silnikach TeX oraz dane niskiego poziomu tworzone podczas procesu składu są w większości niedostępne dla poleceń i makr użytkownika. W tym sensie są *stosunkowo* zamkniętymi systemami w porównaniu z LuaTeX.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/f42bd76c1b551691eb8e70ff58431a283cc018e2)

#### LuaTeX

LuaTeX wprowadza nowe polecenie pierwotne zwane `\directlua{...}` za pomocą którego możesz pisać kod, który nie tylko daje pełny dostęp do języka Lua, ale także pozwala rozszerzać możliwości LuaTeX-a, pisząc wtyczki w językach takich jak C i C++. W systemie Windows takie wtyczki nazywane są *bibliotekami dynamicznego linkowania* (.DLL); w systemie Linux są znane jako *biblioteki obiektów współdzielonych* (.so). Jednak prawdziwa moc LuaTeX-a wynika z ogromnego zestawu wbudowanych funkcji Lua, które zapewniają dostęp do wnętrza LuaTeX-a — umożliwiając niezwykle zaawansowane sterowanie i programowanie składu opartego na TeX-ie. Zbiór takich funkcji nazywa się API (Application Programming Interface) i to właśnie przez API LuaTeX-a używasz programów Lua do komunikacji z jego silnikiem składu opartym na TeX-ie i strukturami danych.

![{{{alt}}}](/files/7706d9d1ad17ffefa7e7897971e06b61fc2c6091)

Dzięki `\directlua{...}` poleceniu możesz na przykład uzyskać dostęp do niskopoziomowych wewnętrznych struktur danych TeX ukrytych przed użytkownikiem w innych silnikach TeX. Dodatkowo możesz używać skryptów Lua do wykonywania wszelkiego rodzaju obliczeń programistycznych, manipulacji ciągami znaków itp. i przekazywać wyniki z powrotem do TeX-a: możliwości są niemal nieograniczone. Jednak ten artykuł nie ma być szczegółowym omówieniem ani samouczkiem LuaTeX-a — choć kusi, by podać przykłady pokazujące niesamowitą wszechstronność tego zdumiewająco potężnego silnika TeX.

## Pudełka i klej: krótkie przypomnienie

Jak wprowadzono w artykule [Pudełka i klej: krótkie, ale wizualne wprowadzenie z użyciem LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) pudełka i klej to dwa kluczowe pojęcia, które stanowią podstawę możliwości składu TeX-a. Poniższy diagram ma służyć jako bardzo krótkie aide-mémoire dotyczące zachowania poziomych i pionowych typów pudełek TeX-a. Uwaga: poziome pudełka mogą oczywiście zawierać tekst składany w językach pisanych od prawej do lewej, takich jak arabski czy hebrajski, co oznacza, że kierunek wzrostu pudełka może być przeciwny do tego, który pokazano dla poziomego pudełka na diagramie poniżej.

![{{{alt}}}](/files/741333fea3d70a0cf89617939736c9fc44334776)

### Prymitywy TeX-a do budowy pudełek

Obecnie większość osób przygotowuje dokumenty TeX za pomocą pakietu makr LaTeX, którego zadaniem jest dostarczanie poleceń izolujących użytkowników od znacznej części niskopoziomowego języka TeX-a — jego tak zwanych *prymitywów*— podstawowych poleceń wbudowanych w silniki TeX (zob. artykuł [Co kryje się w nazwie: przewodnik po wielu odmianach TeX-a](/latex/pl/artykuly-szczegolowe/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) poświęcony omówieniu prymitywów TeX-a). Zbiór makr LaTeX udostępnia różnorodne makra do tworzenia i zapisywania pudełek, ale jeśli odrzucić cały kod makr, okaże się, że istnieją tylko 4 niskopoziomowe polecenia pierwotne do budowy pudełek:

Do tworzenia list poziomych:

* \hbox{...}

Do tworzenia i układania list pionowych:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

Nie będziemy wyjaśniać, jak używać wszystkich tych poleceń do tworzenia pudełek, ponieważ w sieci oraz w książkach o TeX/LaTeX można znaleźć mnóstwo przykładów i samouczków — przyjrzymy się jednak temu, jak pudełka są reprezentowane i przechowywane wewnątrz struktur danych TeX-a.

### Klej: elastyczne odstępy

Klej jest w praktyce formą odstępu używaną przez TeX do rozmieszczania/pozycjonowania elementów w poziomie lub w pionie. Jako użytkownik TeX-a możemy polecić TeX-owi wstawienie kleju o stałym rozmiarze albo użyć kleju elastycznego — tak elastycznego, jak potrzebujemy, by mógł się rozciągać lub kurczyć w zależności od naszych wymagań. Jednym z poleceń TeX-a do tworzenia kleju do odstępów poziomych jest `\hskip` które ma postać

`**\hskip** <naturalna szerokość> **plus** <ilość do rozciągnięcia> **minus** <ilość do skurczenia>`

`**plus**` i `**minus**` to słowa kluczowe TeX-a, ale nie musisz ich używać dla każdego kleju. Jeśli `**plus**` lub `**minus**` nie występują, wtedy odpowiadające `<ilość do rozciągnięcia>` lub `<ilość do skurczenia>` przyjmuje się, że wynosi zero. Na przykład, `\hskip 3pt` wstawia klej o stałej szerokości bez składników rozciągania ani kurczenia.

Na razie myśl o `<ilość do rozciągnięcia>` i `<ilość do skurczenia>` jako o naszych *zaleceniach* dla TeX-a, ponieważ dokładna ilość rozciągnięcia lub skurczenia zostanie obliczona przez TeX.

Aby ułatwić zrozumienie tych pojęć, oto diagram przedstawiający klej jako sprężynę. `<naturalna szerokość>` to długość sprężyny, gdy nie ma naprężenia (rozciągania) ani ściskania (kurczenia). `<ilość do rozciągnięcia>` i `<ilość do skurczenia>` są pokazane względem naturalnej długości sprężyny.

![{{{alt}}}](/files/a1df298242a8709952f545da3629da358a4e22a5)

#### Przykład \hbox

Załóżmy, że chcemy utworzyć `\hbox{...}` zawierające tylko litery A, B, C i D i potrzebujemy, aby to pudełko miało szerokość 100pt (100 punktów TeX-a). Dodatkowo można założyć, że łączna szerokość tych czterech znaków jest znacznie mniejsza niż 100pt, co oznacza, że TeX potrzebuje jakiegoś sposobu, by wypełnić pozostałą przestrzeń wewnątrz pudełka: użyjemy do tego kleju. Ponieważ jednak nie znamy dokładnej ilości kleju potrzebnej do wypełnienia pudełka, zaleca się dodać trochę elastycznych klejów i pozwolić TeX-owi zająć się obliczeniem ilości miejsca, które te kleje muszą zająć. W poniższym fragmencie kodu zwróć uwagę na użycie „%” do tłumienia odstępów międzywyrazowych wynikających ze znaków końca linii.

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

Powstałe pudełko wygląda tak (powiększone dla przejrzystości):

![{{{alt}}}](/files/8c22e783b296bb2f33cf02f7d332588458fff1f0)

Ten `\hbox` jest nałożone przerywanymi ramkami (na czerwono), aby wskazać szerokość znaków (tak jak widzi je TeX). Do celów składu znaki są traktowane jak małe pudełka, a ilość kleju potrzebna do wypełnienia tego `\hbox`jest określana (obliczana) z uwzględnieniem szerokości każdego znaku.

Okazuje się, że TeX nie rozciągnął ani nie skurczył kleju między A i B (ustawionego na 4pt) i nie ma kleju między B i C (ustawionego na 0pt). Jednak klej między C i D oraz klej między D i końcem pudełka oba znacznie się rozciągnęły, ponieważ miały najbardziej elastyczny składnik rozciągania — w praktyce te kleje przejęły całe rozciągnięcie potrzebne do wypełnienia pudełka.

## Powrót do LuateX

Jak dotąd zbadaliśmy pudełka i klej oraz zobaczyliśmy, że LuaTeX umożliwia dostęp do wewnętrznych struktur TeX-a ukrytych przed użytkownikiem w pdfTeX i XeTeX. Czas na przykład, aby uczynić to bardziej jednoznacznym, ale najpierw musimy krótko zapoznać się ze sposobem, w jaki TeX przechowuje pudełka w pamięci — zaczniemy od analogii.

### Jak TeX przechowuje pudełka w pamięci: analogia

Załóżmy, że z jakiegoś powodu trzeba było utworzyć model danych opisujący fizyczne pudełko. Jakie dane można by wybrać do takiego opisu? Jednym z możliwych podejść jest podzielenie informacji na dwie części: dane o samym fizycznym pudełku oraz dane zawierające listę zawartości pudełka. Nasz prosty model mógłby więc wyglądać tak:

1. Dane o fizycznym pudełku („metadane”):

* width
* wysokość
* głębokość
* waga
* kolor
* typ (drewniane, plastikowe, kartonowe)

3. Dane o zawartości pudełka: jakaś forma listy opisującej przedmioty, które zawiera — prawdopodobnie wymienione w dowolnej kolejności.

I istnieje bardzo bliska analogia do sposobu, w jaki TeX przechowuje pudełka.

### Jak TeX przechowuje pudełka w pamięci: hlists i vlists

Wewnętrznie TeX tworzy „kontenery” zwane *hlistami* (listami poziomymi) oraz *vlistami* (listami pionowymi), które reprezentują odpowiednio hboxy i vboxy. Te obiekty hlist/vlist dostarczają zbiór „metadanych” o pudełku oraz zapewniają dostęp do listy obiektów, z których pudełko jest rzeczywiście zbudowane — ta lista nazywa się *lista węzłów*. W przeciwieństwie do fizycznego pudełka, do którego można wkładać przedmioty w dowolnej kolejności, w TeX-ie kolejność zawartości pudełka ma ogromne znaczenie — są to elementy przeznaczone do składu. Jeśli masz doświadczenie w programowaniu lub informatyce, nie zdziwi cię, że obiekty w pudełku TeX-a są przechowywane, a ich kolejność tworzenia jest zachowywana, przy użyciu tak zwanej [listy dwukierunkowo łączonej](https://en.wikipedia.org/wiki/Doubly_linked_list). Nie będziemy omawiać list łączonych szerzej, ponieważ w sieci nie brakuje samouczków, przykładów i wyjaśnień.

Pojęcie węzłów i list węzłów jest fundamentalnym aspektem działania TeX-a, ale na potrzeby tego artykułu podamy tylko krótki zarys. Węzły są w istocie rodzajem „mini-kontenera” i (od LuaTeX 1.04) istnieje około 50 różnych typów węzłów: odzwierciedlających wewnętrzne typy danych i komponenty używane przez LuaTeX do składu. Na przykład istnieją węzły reprezentujące: glify (powstające z „znaków”), klej, poziome/pionowe linie, kary, „whatsits”, kerny i tym podobne. Cały składany materiał ostatecznie stanie się częścią ogromnej listy węzłów, a LuaTeX daje bezpośredni dostęp do tych wewnętrznych struktur danych. LuaTeX pozwala także dodawać, edytować, poprawiać lub tworzyć listy węzłów, dzięki czemu na przykład możesz tworzyć pudełka bezpośrednio w kodzie Lua, bez użycia jakiegokolwiek kodu TeX. Jednak o tym opowiemy innym razem.

### Prosty przykład \directlua{...} w działaniu

Poniższy przykład tworzy `\hbox` i zapisuje go w rejestrze pudełka 0. Następnie podajemy szerokość pudełka, używając tradycyjnego kodu TeX, oraz uzyskujemy tę samą informację drugą metodą za pośrednictwem `\directlua{}`. Tutaj uruchamiamy mały skrypt Lua, który uzyskuje dostęp do wewnętrznego obszaru przechowywania pudełek w TeX, aby odczytać szerokość pudełka — oczywiście oba wyniki są identyczne: 2412092sp (sp = scaled point: 65536sp = 1 punkt TeX-a). Ostatecznie w tym niezwykle prostym przykładzie kod TeX i kod Lua badają te same wewnętrzne struktury danych, aby uzyskać szerokość pudełka, ale to właśnie dzięki bezpośredniemu dostępowi LuaTeX otwiera drzwi do bogactwa informacji i kontroli, które nie są dostępne w innych silnikach.

![{{{alt}}}](/files/dd9b8d09433699e8d085219d79ec7986377405c1)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Używając kodu \TeX{}, pudełko 0 ma szerokość \number\wd0\relax \space sp\par
\noindent Możemy też użyć Lua i wywołać jedną z funkcji Lua\TeX-a, aby uzyskać te same
informacje.\vskip10mm
\noindent Z kodu Lua pudełko 0 ma szerokość
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} co oczywiście jest identyczne z wartością uzyskaną z kodu \TeX{}.
\end{document}
```

## Spójrzmy na to całościowo: projekt Overleaf

Zauważyliśmy, że wewnętrznie TeX reprezentuje pudełka jako „kontenery” zwane hlistami/vlistami, które przechowują „metadane” o pudełku i zapewniają dostęp do listy komponentów, z których jest ono zbudowane. Używając LuaTeX, możesz uzyskać dostęp do „metadanych” pudełka i listy elementów zawartych w pudełku TeX: glifów, kleju, kar, innych pudełek i tym podobnych. Używając skryptów Lua, można zbadać pudełko znajdujące się w pamięci TeX-a i narysować szczegółową reprezentację tego, co zawiera. Odpowiednią reprezentację pudełka TeX i jego zawartości uzyskuje się za pomocą *grafów węzłów* i przygotowaliśmy [projekt Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) który robi to, wykorzystując doskonały skrypt Lua napisany przez Patricka Gundlacha (zob. podziękowania). Nie będziemy opisywać szczegółowych procesów potrzebnych do badania pudełek i generowania grafów węzłów — poza zaznaczeniem, że każdy program/skrypt przetwarzający pudełka TeX musi być *rekurencyjnego* rekurencyjny

![{{{alt}}}](/files/71495c49c8b5ed3fc995a67454e3161bbe96aeb0)

### Co oferuje projekt?

Implementuje tylko 1 polecenie o nazwie `\dobox{polecenie pudełka}`, na przykład:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Ta `\dobox{...}` polecenie wykonuje szereg zadań:

1. w twoim dokumencie składa dosłowny kod TeX twojego pudełka;
2. generuje grafikę SVG pudełka TeX — możesz ją osadzić w stronie WWW (tak jak zrobiliśmy to w tym wpisie na blogu);
3. generuje grafikę SVG listy węzłów — którą również możesz osadzić w stronach WWW (tak jak zrobiliśmy to w tym wpisie na blogu);
4. tworzy grafikę PDF listy węzłów, która następnie jest importowana do głównego dokumentu PDF tworzonego przez projekt.

Grafy węzłów mogą bardzo szybko stać się ogromne ze względu na olbrzymią ilość danych, które LuaTeX musi przechowywać, aby reprezentować złożone pudełka TeX — takie jak aktualnie budowana strona lub składana matematyka. W przypadku większych list węzłów importowana grafika PDF może zostać przycięta przez granicę strony twojego dokumentu — jeśli chcesz obejrzeć duży graf węzłów, możesz pobrać plik ZIP projektu i wyodrębnić interesującą cię grafikę PDF. Podczas pobierania pliku ZIP projektu upewnij się, że wybierasz „Pliki wejściowe i wyjściowe” z rozwijanej listy opcji:

![{{{alt}}}](/files/09ad11621728bb41245cd817c3f9f37fce6fc005)

### Grafiki z projektu Overleaf: krótki opis

Zanim pokażemy kilka przykładów, warto poczynić kilka uwag na temat grafik tworzonych przez projekt Overleaf — użyjemy tego samego `\hbox` przykładu wspomnianego wcześniej w artykule. Oto on, opakowany w `\dobox{...}` polecenia:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Oto `\hbox` wygenerowane przez TeX — dla przejrzystości pudełko zostało powiększone, ale obramowanie jest uwzględnione w grafikach tworzonych przez projekt Overleaf.

![{{{alt}}}](/files/276d3f3ac4e415929b1dbd3c45c131a5cda7cbe7)

Oto *opisany* diagram SVG listy węzłów reprezentującej powyższe pudełko — adnotacje zostały dodane, aby podkreślić „metadane” pudełka i listę obiektów, które zawiera: tych adnotacji nie ma w grafikach tworzonych przez projekt Overleaf.

[![{{{alt}}}](/files/415327f56849584fe04552c75a8559fa08493518)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

Jeśli spojrzysz na sekcję „metadane”, możesz zauważyć kilka nieznanych parametrów:

* `glue_set`
* `glue_sign`
* `glue_order`

Te parametry to ustawienia używane przez TeX do obliczania, o ile klej musi się rozciągnąć lub skurczyć w obrębie tego pudełka, i są tylko jednym z przykładów danych, które możesz łatwo uzyskać przez LuaTeX, ale nie przez inne silniki TeX. Zwróć uwagę, że węzły kleju zawarte w komponentach pudełka *zachowują* oryginalne wartości kleju, które wpisaliśmy podczas tworzenia pudełka. Jest to niezbędne, ponieważ TeX udostępnia polecenia `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` które „rozpakowują” zawartość pudełka i zwracają ją do strumienia wejściowego, aby ponownie mogła brać udział w operacjach składu. Dopiero gdy TeX ostatecznie wyprowadza (wysyła) pudełko do pliku PDF lub DVI, `glue_set`, `glue_sign` i `glue_order` są stosowane do wszystkich klejów zawartych w pudełku — aby obliczyć rzeczywistą ilość rozciągnięcia lub skurczenia potrzebną do rozmieszczenia komponentów wewnątrz pudełka, a następnie wygenerować odpowiednie dane PDF lub kody opowe DVI.

Innym parametrem wymienionym w „metadanych” jest `shift`: to wartość przesunięcia pudełka wynikająca ze stosowania poleceń TeX:

* `\raise`, `\lower` (stosowane do `\hbox`);
* `\moveleft`, `\moveright` (stosowane do `\vbox`).

W naszym przykładzie, `shift` wynosi 0pt, ponieważ nie przesunęliśmy `\hbox` z jego naturalnej pozycji.

Ta [projekt Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) udostępnia również diagramy grafów węzłów w formacie PDF: tutaj znajduje się link do pobrania [wersji pliku PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) powyższego grafu węzłów.

### Jak projekt Overleaf tworzy te grafiki?

Projekt Overleaf wykorzystuje możliwość uruchamiania narzędzi i programów zainstalowanych na serwerach Overleaf — zob. [ten wpis na blogu](/latex/pl/artykuly-szczegolowe/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) po więcej szczegółów i przykładowy projekt. Aby stworzyć grafikę SVG reprezentującą pudełko TeX, kod TeX tego pudełka jest zapisywany do małego pliku, który następnie jest składany za pomocą pdfTeX, aby wygenerować plik DVI — zauważ, że program pdfTeX jest uruchamiany przez LuaTeX za pomocą kilku linii skryptu Lua. Ten plik DVI jest konwertowany „w locie” do SVG przy użyciu `dvisvgm` narzędzia — które jest dostarczane z dystrybucją TeX Live zainstalowaną na serwerach Overleaf. `dvisvgm` jest uruchamiane z opcją wiersza poleceń `-n` aby zapewnić, że każdy składany tekst zostanie zamieniony na linie/krzywe, tak aby poprawne renderowanie pliku SVG nie zależało od zainstalowanych fontów TeX.

Do tworzenia grafów węzłów używamy skryptu Lua o nazwie `hiviznodelist.lua` który opiera się na pracy Patricka Gundlacha. Skrypt ten zapisuje tak zwany `.gv` (Graphviz), czyli plik tekstowy zawierający graf węzłów opisany w języku `dot` Język `.gv` plik jest przetwarzany przez program narzędziowy o nazwie `dot` który generuje diagram węzłowy zarówno w formacie PDF, jak i SVG.

### Przykłady projektu

Oto kilka dodatkowych przykładów z grafikami SVG wygenerowanymi przy użyciu projektu Overleaf. Pudełka zawierające dużo tekstu (np. w \vbox) lub złożoną matematykę będą generować ogromne grafy węzłów — jeśli eksplorujesz projekt Overleaf, zaleca się nie używać niepotrzebnie złożonych pudełek do demonstrowania interesujących cię funkcji.

#### \vbox to 25pt{A}

Ten przykład pokazuje efekt umieszczenia tekstu bezpośrednio w `\vbox`: zauważ, że struktura węzłów jest dość złożona nawet dla tak prostego pudełka. Powodem tej złożoności jest to, że tekst umieszczony bezpośrednio w `\vbox` powoduje, że TeX dokonuje dzielenia wierszy. Możesz zauważyć, że `\vbox` ma szerokość 345pt: to wartość `\hsize` w chwili tworzenia tego pudełka. Zauważ też, że znak „A” znajduje się w `hlist` o szerokości również 345 punktów, i zwróć uwagę na dużą karę (10000) wraz z `\parfillskip` i `\rightskip` klejami na końcu zawartości pudełka. Ta kara i dwa elementy kleju są wstawiane przez działania TeX-a związane z dzieleniem wierszy. Jeśli spojrzysz na `glue_set` wartość dla wiersza akapitu (`hlist`) zawierającego literę „A”, zobaczysz, że jest ona niezwykle duża (322.500000): dlaczego? Ponieważ wiersz akapitu ma szerokość 345pt, ale zawiera tylko `\parindent` i literę „A”: pozostałe miejsce musi zostać wypełnione przez `\parfillskip` klej, który musi rozciągnąć się na znaczną odległość, aby wypełnić pozostałe miejsce w wierszu.

![{{{alt}}}](/files/f06f1f2cc47a79753846572e3f645c8c3590bb21)

[![{{{alt}}}](/files/ceab12f7152e3e88de4b5d3b0099b0ad81e1f52c)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[Pobierz plik PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

Bardzo pouczające jest porównanie tego przykładu z poprzednim. Tutaj nie tylko graf węzłów jest znacznie mniejszy, ale szerokość `\vbox` wynosi zaledwie 7.50002pt: to ta sama szerokość co znak „A”. Powodem jest to, że „A” zostało opakowane w `\hbox` co uniemożliwia `\vbox` wyzwalanie przez TeX dzielenia wierszy — ważna cecha pudełek tworzonych za pomocą `\vbox`.

![{{{alt}}}](/files/9ad2295ebaa0886c9acb7499464f9da592608ca5)

[![{{{alt}}}](/files/0034e3ed6260b8534a39f03860bd33bee002370f)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[Pobierz plik PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Prosta matematyka: \hbox{$$\displaystyle \int f(x) dx$$}, złożone pudełko!

Ten przykład pokazuje, że nawet bardzo prosto składana matematyka tworzy szczegółową strukturę pudełka: skład matematyki wytwarza *skrajnie* złożone struktury danych w TeX!

![{{{alt}}}](/files/e55b41f9ac878a7142c61b5374b298891bf855d4)

[![{{{alt}}}](/files/ae034094ffaff999fd134d60318393bb534e061d)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[Pobierz plik PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Podziękowania: dzięki Patricku!

Nasze podziękowania dla [Patricka Gundlacha](https://twitter.com/patrickgundlach) który udzielił Overleafowi pozwolenia na używanie i rozpowszechnianie zmodyfikowanej wersji swojego skryptu Lua, `viznodelist.lua`, który przetwarza pudełka TeX i generuje plik (w `dot` języku), który może być przetworzony w celu narysowania grafu węzłów. Projekt Overleaf zawiera skrypt Lua o nazwie `hiviznodelist.lua`— przemianowaną i zmodyfikowaną wersję oryginalnego kodu Patricka, dostępną na [GitHubie](http://gist.github.com/556247). Patrick stworzył oparty na LuaTeX system składu o otwartym kodzie źródłowym o nazwie [speedata Publisher](https://speedata.github.io/publisher/index.html) który możesz pobrać i używać za darmo — dostępne są również komercyjne opcje wsparcia.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
