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

# Pandora의 \hbox: LuaTeX를 사용해 TeX 박스의 뚜껑 열기

## 소개

Boxes and glue는 TeX의 조판 모델과 기능의 기반을 이루는 두 가지 핵심 개념입니다. 이전 글의 소개 내용을 바탕으로, [Boxes and Glue: LuaTeX를 사용한 간단하지만 시각적인 소개](/latex/ko/in-depth-articles/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), 이처럼 풍부한 삽화가 담긴 이 글에서는 boxes와 glue를 더 자세히 살펴봅니다. 또한 우리는 LuaTeX 기반의 새로운 [Overleaf 프로젝트](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) 를 소개합니다. 이를 통해 TeX 박스의 깊은 내부 구조를 탐구할 수 있으며, 박스의 동작을 진정으로 이해하는 데 도움이 되는 통찰을 얻을 수 있습니다. Overleaf 프로젝트는 Patrick Gundlach의 작업 덕분에 크게 수월하게 만들어졌으므로, 우리는 [그에게 감사의 뜻을 전합니다](#credits-thanks-patrick).

## 왜 LuaTeX를 선택할까요?

먼저 LuaTeX와 LuaLaTeX의 차이를 다시 한 번 짚고 넘어갈 가치가 있습니다:

* LuaTeX는 TeX 기반 조판 엔진 실행 파일의 이름입니다;
* LuaLaTeX는 LuaTeX 엔진과 LaTeX 매크로 패키지를 함께 사용하는 것을 가리킵니다.

이 구분은 매우 중요합니다. 왜냐하면 이 글에서는 LaTeX 매크로 패키지가 제공하는 명령의 기능만 활용하는 것이 아니라, LuaTeX 엔진 자체에 내장된 기능을 활용하고 있기 때문입니다.

TeX 엔진과 LaTeX 매크로 패키지의 차이가 확실하지 않은 독자라면, 이전에 게시한 글 중 하나인 [이름에 담긴 의미: TeX의 여러 변형에 대한 가이드](/latex/ko/in-depth-articles/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md)을 읽어보셔도 좋습니다. 그 글에서는 이러한 차이를 어느 정도 자세히 설명합니다. 같은 글에서는 프로그래밍 언어로서의 “TeX”도 다루며, TeX 기반 조판 엔진들(예: pdfTeX, XeTeX, LuaTeX)이 기능과 기능성에서 서로 다를 뿐만 아니라, 지원하는 TeX 언어의 “방언”에도 차이가 있음을 설명합니다. 이것이 LuaTeX 선택으로 이어집니다. TeX 기반 프로그래밍 언어를 지원하는 것에 더해 LuaTeX에는 Lua 스크립트 언어가 내장되어 있어, 단순하지만 매우 강력한 일반적인 프로그래밍 언어를 사용할 수 있습니다. Lua와 LuaTeX의 내장 기능을 통해, LuaTeX의 조판 활동을 다른 어떤 TeX 엔진에서도 제공하지 않는 방식으로 탐색하고 제어할 수 있습니다. 여기에는 TeX 박스의 내부 구조를 살펴볼 수 있는 기능도 포함되므로, LuaTeX는 이 글과 함께 제공되는 Overleaf 프로젝트에 이상적인(그리고 유일한) 선택입니다.

### 그림으로 보는 pdfTeX/XeTeX vs LuaTeX

다음의 *도식* 은 pdfTeX/XeTeX와 LuaTeX의 설계를 중요한 측면에서 비교하기 위한 것입니다. 물론 pdfTeX와 XeTeX 모두 사용자가 조판 동작에 영향을 줄 수 있는 TeX 코드를 작성할 수 있게 해 주지만, 이러한 TeX 엔진 내부에 담긴 더 깊은 구조와 조판 과정에서 만들어지는 저수준 데이터는 대부분 사용자 명령과 매크로로 접근할 수 없습니다. 그런 의미에서 이들은 *상대적으로* LuaTeX에 비해 닫힌 시스템입니다.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/2c9e8cd7a9e9c5ab2cfaa77df418f3abc6df67ca)

#### LuaTeX

LuaTeX는 `\directlua{...}` 이라는 새로운 primitive 명령을 도입합니다. 이를 통해 Lua 언어에 완전히 접근할 수 있는 코드를 작성할 수 있을 뿐만 아니라, C 및 C++ 같은 언어를 사용하여 플러그인을 작성함으로써 LuaTeX의 기능을 확장할 수도 있습니다. Windows에서는 이러한 플러그인을 *동적 링크 라이브러리* (.DLL)라고 하며; Linux에서는 *공유 객체 라이브러리* (.so)라고 합니다. 그러나 LuaTeX의 진정한 힘은 LuaTeX 내부에 접근할 수 있게 해 주는 방대한 내장 Lua 함수 집합에서 비롯됩니다. 이는 TeX 기반 조판을 매우 정교하게 제어하고 프로그래밍할 수 있게 합니다. 이러한 함수 집합을 API(Application Programming Interface)라고 하며, LuaTeX의 API를 통해 Lua 프로그램을 사용해 TeX 기반 조판 엔진과 데이터 구조와 통신할 수 있습니다.

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

LuaTeX의 `\directlua{...}` 명령을 사용하면 예를 들어 다른 TeX 엔진에서는 보이지 않는 저수준 내부 TeX 데이터 구조에 접근할 수 있습니다. 또한 Lua 스크립트를 사용해 각종 프로그래밍 계산, 문자열 조작 등을 수행하고 그 결과를 TeX에 돌려줄 수 있습니다. 가능성은 거의 무한합니다. 하지만 이 글은 LuaTeX에 대한 자세한 해설이나 튜토리얼을 목적으로 하지는 않습니다. 다만 이 놀라울 정도로 강력한 TeX 엔진의 엄청난 다재다능함을 보여주는 예시를 제시하고 싶은 마음이 들긴 합니다.

## Boxes and glue: 짧은 복습

글에서 소개했듯이 [Boxes and Glue: LuaTeX를 사용한 간단하지만 시각적인 소개](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) boxes와 glue는 TeX의 조판 기능을 떠받치는 두 가지 핵심 개념입니다. 아래 도식은 TeX의 수평 및 수직 박스 유형이 어떻게 동작하는지를 매우 간단히 기억해 둘 수 있도록 제시한 것입니다. 참고: 수평 박스에는 물론 아랍어 또는 히브리어와 같은 오른쪽에서 왼쪽으로 쓰는 언어의 텍스트도 들어갈 수 있으므로, 박스가 자라는 방향은 아래 도식의 수평 박스에 표시된 것과 반대일 수 있습니다.

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

### 박스 구성을 위한 TeX primitive

오늘날 대부분의 사람들은 LaTeX 매크로 패키지를 사용해 TeX 문서를 작성합니다. LaTeX는 사용자가 TeX의 저수준 언어, 즉 소위 *primitive*—TeX 엔진에 내장된 핵심 명령들입니다(글 [이름에 담긴 의미: TeX의 여러 변형에 대한 가이드](/latex/ko/in-depth-articles/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) 에서 TeX primitive에 대한 논의를 참조하세요). LaTeX 매크로 모음은 박스 생성과 저장(보존)을 위한 다양한 매크로를 제공하지만, 매크로 코드를 모두 걷어내고 나면 박스 구성을 위한 저수준 primitive 명령은 단 4개뿐입니다:

수평 리스트를 만들 때:

* \hbox{...}

수직 리스트를 만들고 쌓을 때:

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

이 모든 박스 명령의 사용법을 여기서 설명하지는 않겠습니다. 웹이나 TeX/LaTeX 서적에는 예제와 튜토리얼이 충분히 많기 때문입니다. 대신 박스가 TeX 데이터 구조 내부에서 어떻게 표현되고 저장되는지 살펴볼 것입니다.

### Glue: 유연한 간격

Glue는 사실 TeX가 항목들을 수평 또는 수직으로 띄우거나 배치할 때 사용하는 간격의 한 형태입니다. TeX 사용자로서 우리는 TeX에게 고정 크기의 glue를 삽입하도록 지시할 수도 있고, 또는 필요에 따라 늘어나거나 줄어들 수 있는 유연한 glue를 사용할 수도 있습니다. 수평 간격용 glue를 만드는 TeX 명령 중 하나는 `\hskip` 이며, 형식은 다음과 같습니다

`**\hskip** <natural width> **plus** <amount to stretch> **minus** <amount to shrink>`

`**plus**` 및 `**minus**` 는 TeX 키워드이지만, 모든 glue에 반드시 사용할 필요는 없습니다. 만약 `**plus**` 또는 `**minus**` 가 없으면 해당 `<amount to stretch>` 또는 `<amount to shrink>` 는 0으로 간주됩니다. 예를 들면, `\hskip 3pt` 는 늘어나거나 줄어드는 성분이 없는 고정 폭 glue를 삽입합니다.

우선 `<amount to stretch>` 및 `<amount to shrink>` 을 우리의 *권장값* 으로 생각하면 됩니다. 정확히 얼마나 늘어나거나 줄어들지는 TeX가 계산합니다.

이 개념을 이해하는 데 도움이 되도록, glue를 스프링으로 나타낸 도식이 있습니다.  `<natural width>` 는 장력이 없을 때(늘어남)나 압축이 없을 때(줄어듦)의 스프링 길이입니다.  `<amount to stretch>` 및 `<amount to shrink>` 는 스프링의 자연 길이에 대한 상대값으로 표시됩니다.

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

#### \hbox 예시

다음과 같은 박스를 만들고 싶다고 가정해 봅시다: `\hbox{...}` A, B, C, D라는 글자만 들어 있는 박스를 만들고, 이 박스의 너비가 100pt(TeX 포인트 100개)여야 한다고 합시다. 또한 이 네 글자의 총 너비는 100pt보다 훨씬 작다고 가정해도 무방하므로, TeX가 박스 안의 남은 공간을 채울 방법이 필요합니다. 이를 위해 glue를 사용하겠습니다. 하지만 박스를 채우는 데 정확히 어느 정도의 glue가 필요한지는 알 수 없으므로, 유연한 glue를 몇 개 추가해 두고 TeX가 그 glue들이 차지해야 할 공간의 양을 계산하게 하는 것이 좋습니다. 아래 코드 조각에서는 줄 끝 문자에서 발생하는 단어 사이 공백을 억제하기 위해 “%”를 사용하는 점에 주목하세요.

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

그 결과 박스는 다음과 같습니다(명확하게 보이도록 확대했습니다):

![{{{alt}}}](/files/6820143b189360a43e855de20abae052eeb6983d)

외부 파일들이 컴파일되도록 보장하는 코드가 포함되어 있습니다. `\\hbox` 에는 점선 상자(빨간색)가 겹쳐져 있어 글자들의 폭을 나타냅니다(TeX가 보는 방식대로). 조판 관점에서 글자는 작은 상자로 간주되며, 이 `\\hbox`를 채우기 위해 필요한 glue의 양은 각 글자의 폭을 고려해 결정(계산)됩니다.

결과적으로 TeX는 A와 B 사이의 glue(4pt로 설정됨)를 늘리거나 줄이지 않았고, B와 C 사이에는 glue가 없습니다(0pt로 설정됨). 그러나 C와 D 사이의 glue와 D와 박스 끝 사이의 glue는 둘 다 상당히 늘어났습니다. 왜냐하면 그 glue들이 가장 유연한 늘어남 성분을 가지고 있었기 때문입니다. למעשה, 그 glue들이 박스를 채우기 위해 필요한 모든 늘어남을 흡수한 셈입니다.

## LuaTeX로 돌아가서

지금까지 우리는 boxes와 glue를 살펴보았고, LuaTeX가 pdfTeX와 XeTeX에서는 보이지 않던 내부 TeX 구조에 접근할 수 있게 해 준다는 사실도 확인했습니다. 이를 더 분명히 보여 줄 예시가 필요한 때입니다. 하지만 그에 앞서, TeX가 메모리에 박스를 저장하는 방식을 간단히 익혀 볼 필요가 있습니다. 우선 비유부터 시작하겠습니다.

### TeX가 메모리에 박스를 저장하는 방식: 비유

어떤 이유에서든 물리적 박스를 설명하는 데이터 모델을 만들어야 한다고 가정해 봅시다. 그런 설명을 위해 어떤 데이터를 선택하시겠습니까? 한 가지 방법은 정보를 두 부분으로 나누는 것입니다. 즉, 물리적 박스 자체에 대한 데이터와 박스 내용물의 목록을 제공하는 데이터로 나누는 것입니다. 그러면 우리의 단순한 모델은 다음과 같을 수 있습니다:

1. 물리적 박스에 대한 데이터(“메타데이터”):

* 너비
* 높이
* 깊이
* 무게
* 색상
* 유형(나무, 플라스틱, 골판지)

3. 박스 내용물에 대한 데이터: 포함된 항목들을 설명하는 어떤 형태의 목록—아마도 특별한 순서 없이 나열된 목록일 것입니다.

그리고 이것은 TeX가 박스를 저장하는 방식과 매우 유사합니다.

### TeX가 메모리에 박스를 저장하는 방식: hlist와 vlist

내부적으로 TeX는 다음과 같은 “컨테이너”를 만듭니다: *hlist* (수평 리스트)와 *vlist* (수직 리스트)이며, 각각 hbox와 vbox를 나타냅니다. 이 hlist/vlist 객체는 박스에 대한 “메타데이터” 묶음을 제공할 뿐만 아니라, 실제로 박스가 포함하는 객체 목록에도 접근할 수 있게 해 줍니다. 그 목록을 *node list*라고 합니다. 물리적 박스에서는 물건을 안에 어떤 순서로든 넣을 수 있지만, TeX에서는 박스 내용의 순서가 매우 중요합니다. 그것들은 조판될 항목들이기 때문입니다. 프로그래밍이나 컴퓨터과학 배경이 있다면, TeX 박스 안의 객체들이 소위 [doubly-linked list](https://en.wikipedia.org/wiki/Doubly_linked_list)를 사용해 저장되고 생성 순서가 보존된다고 해도 놀랍지 않을 것입니다. 링크드 리스트에 대해서는 더 이상 자세히 다루지 않겠습니다. 웹에는 튜토리얼, 예제, 설명이 넘쳐나기 때문입니다.

노드와 노드 리스트의 개념은 TeX가 작동하는 방식의 기본적인 부분이지만, 이 글에서는 간단히 개요만 다루겠습니다. 노드는 본질적으로 일종의 “미니 컨테이너”이며 (LuaTeX 1.04 기준) 약 50가지의 서로 다른 노드 유형이 있습니다. 이는 LuaTeX가 조판에 사용하는 내부 데이터 유형과 구성 요소를 반영합니다. 예를 들어, glyph(“문자”에서 비롯됨), glue, 수평/수직 rule, penalty, “whatsit”, kern 등을 나타내는 노드가 있습니다. 모든 조판된 सामग्री는 결국 거대한 노드 리스트의 일부가 되며, LuaTeX는 이러한 내부 데이터 구조에 직접 접근할 수 있게 해 줍니다. 또한 LuaTeX는 노드 리스트를 추가, 편집, 수정 또는 생성할 수 있게 해 주므로, 예를 들어 TeX 코드를 전혀 쓰지 않고도 Lua 코드 안에서 직접 박스를 만들 수 있습니다. 하지만 그 이야기는 다음 기회로 미루겠습니다.

### \directlua{...}의 간단한 동작 예시

다음 예시는 다음을 생성합니다: `\\hbox` 를 박스 레지스터 0에 저장합니다. 그런 다음 전통적인 TeX 코드를 사용해 박스의 폭을 출력하고, 또 다른 방법으로 `\directlua{}`를 통해 같은 정보를 얻습니다. 여기서는 TeX의 내부 박스 저장 영역에 접근하는 작은 Lua 스크립트를 실행해 박스의 폭을 얻습니다. 물론 두 값은 동일합니다: 2412092sp(sp=scaled point: 65536sp = 1 TeX point). 결국 이 매우 단순한 예시에서는 TeX 코드와 Lua 코드가 모두 같은 내부 데이터 구조를 살펴서 박스의 폭을 얻는 셈이지만, LuaTeX가 제공하는 직접 접근 경로를 통해 다른 엔진에서는 사용할 수 없는 풍부한 정보와 제어 기능을 열 수 있습니다.

![{{{alt}}}](/files/1294db3694d02718fb7ab68e6137cb30429c5bdd)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent TeX 코드를 사용하면, 박스 0의 폭은 \number\wd0\relax \space sp입니다\par
\noindent Lua를 사용해서도 Lua\TeX의 함수 중 하나를 호출하여 같은
정보를 얻을 수 있습니다.\vskip10mm
\noindent Lua 코드에서는 박스 0의 폭이
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
}이며, 물론 \TeX{} 코드로 얻은 값과 동일합니다.
\end{document}
```

## 모두 합쳐서: Overleaf 프로젝트

내부적으로 TeX는 박스를 박스에 대한 “메타데이터”를 저장하고, 박스를 구성하는 구성 요소 목록에 접근할 수 있게 해 주는 hlists/vlists라는 “컨테이너”로 표현한다는 점을 확인했습니다. LuaTeX를 사용하면 박스의 “메타데이터”와 TeX 박스에 들어 있는 항목들, 즉 glyph, glue, penalty, 다른 박스 등을 접근할 수 있습니다. Lua 스크립트를 사용하면 TeX 메모리에 놓인 박스를 검사하고 그 박스가 무엇을 담고 있는지 자세히 표현할 수 있습니다. TeX 박스와 그 내용물을 적절히 표현하는 방법은 *노드 그래프* 를 사용하며, 우리는 [Overleaf 프로젝트](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) 를 준비했습니다. 이는 Patrick Gundlach가 작성한 훌륭한 Lua 스크립트(크레딧 참조)를 활용해 그렇게 합니다. 박스를 검사하고 노드 그래프를 생성하는 데 필요한 세부 과정은 설명하지 않겠습니다. 다만 TeX 박스를 처리하는 어떤 프로그램/스크립트든 *재귀적* 중첩 가능해야 한다는 점만 언급하겠습니다. 즉, vbox 안에 hbox가 있고, 또 그 안에 hbox가 들어가는 식으로… 모든 박스 유형이 매우 깊은 수준으로 중첩될 수 있기 때문입니다.

![{{{alt}}}](/files/0335508fb15b9e5f8b61d20e835a5652ea958144)

### 이 프로젝트는 무엇을 제공하나요?

이 프로젝트는 다음과 같은 단 하나의 명령만 구현합니다: `\dobox{box command}`예를 들면:

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

이 `\dobox{...}` 명령은 여러 작업을 수행합니다:

1. 문서 내에서 박스에 대한 TeX 코드를 원문 그대로 조판합니다;
2. TeX 박스의 SVG 그래픽을 생성합니다. 이를 웹 페이지에 삽입할 수 있습니다(이 블로그 글에서 우리가 한 것처럼);
3. 노드 리스트의 SVG 그래픽을 생성합니다. 이것 역시 웹 페이지에 삽입할 수 있습니다(이 블로그 글에서 우리가 한 것처럼);
4. 노드 리스트의 PDF 그래픽을 출력하고, 이것이 프로젝트가 생성한 मुख्य PDF 문서로 가져와집니다.

Node graph는 LuaTeX가 복잡한 TeX 박스—예를 들어 현재 구성 중인 페이지나 조판된 수식—를 표현하기 위해 저장해야 하는 방대한 데이터 때문에 아주 빠르게 매우 커질 수 있습니다. 더 큰 노드 리스트의 경우, 가져온 PDF 그래픽이 문서의 페이지 경계에 의해 잘릴 수 있습니다. 큰 노드 그래프를 보고 싶다면 프로젝트의 ZIP 파일을 내려받아 관심 있는 PDF 그래픽을 추출하면 됩니다. 프로젝트의 ZIP 파일을 다운로드할 때는 드롭다운 옵션 목록에서 “Input and Output Files”를 선택하는 것을 잊지 마세요:

![{{{alt}}}](/files/1e39f279d60369771945297b12c9b0598a84f6c6)

### Overleaf 프로젝트의 그래픽: 간단한 설명

몇 가지 예시를 보여드리기 전에, Overleaf 프로젝트가 생성한 그래픽에 대해 몇 가지 관찰을 해볼 가치가 있습니다. 우리는 앞서 언급한 것과 같은 `\\hbox` 예시를 사용할 것입니다. 여기서는 프로젝트의 `\dobox{...}` 명령:

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

다음은 `\\hbox` TeX가 생성한 것입니다. 알아보기 쉽도록 박스를 확대했지만, Overleaf 프로젝트가 생성한 그래픽에는 테두리가 포함됩니다.

![{{{alt}}}](/files/6b859084decf6f963a7277835a300060a68f9860)

다음은 *주석이 달린* 위 박스를 나타내는 노드 리스트의 SVG 도식입니다. 박스의 “메타데이터”와 그 안에 들어 있는 객체 목록을 강조하기 위해 주석을 추가했습니다. 이러한 주석은 Overleaf 프로젝트가 생성한 그래픽에는 포함되지 않습니다.

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

“메타데이터” 섹션을 보면 익숙하지 않은 매개변수 몇 가지를 볼 수 있습니다:

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

이 매개변수들은 이 박스 안에서 glue가 얼마나 늘어나거나 줄어들어야 하는지를 계산하기 위해 TeX가 사용하는 설정이며, LuaTeX에서는 쉽게 얻을 수 있지만 다른 TeX 엔진에서는 그렇지 않은 데이터의 한 예일 뿐입니다. 박스 구성 요소 안에 포함된 glue 노드들은 *보존합니다* 박스를 만들 때 우리가 입력한 원래의 glue 값을. 이는 TeX가 다음 명령들을 제공하기 때문에 매우 중요합니다: `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` 이 명령들은 박스의 내용을 “unbox”하여 입력 스트림으로 다시 풀어놓고, 다시 조판 작업에 참여하게 합니다. TeX가 최종적으로 박스를 PDF 또는 DVI 파일로 출력할 때에만 `glue_set`, `glue_sign` 및 `glue_order` 박스에 들어 있는 모든 glue에 적용됩니다. 이를 통해 박스 내부 구성 요소를 배치하는 데 필요한 실제 늘어남 또는 줄어듦의 양을 계산한 다음, 적절한 PDF 데이터나 DVI opcode를 생성합니다.

“메타데이터”에 나열된 또 다른 매개변수는 `shift`: 이것은 TeX 명령을 적용했을 때 발생한 박스 이동값입니다:

* `\raise`, `\lower` (다음에 적용됨 `\\hbox`);
* `\moveleft`, `\moveright` (다음에 적용됨 `\\vbox`).

우리 예시에서는 `shift` 는 0pt입니다. 왜냐하면 우리는 `\\hbox` 를 본래 위치에서 이동시키지 않았기 때문입니다.

이 [Overleaf 프로젝트](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) 은 PDF 형식의 노드 그래프 도식도 출력합니다. 아래 링크에서 다운로드할 수 있습니다: [PDF 파일 버전](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) 의 위 노드 그래프.

### Overleaf 프로젝트는 그 그래픽을 어떻게 생성하나요?

Overleaf 프로젝트는 Overleaf 서버에 설치된 소프트웨어 도구와 유틸리티를 실행할 수 있는 기능을 활용합니다. 자세한 내용은 [이 블로그 글](/latex/ko/in-depth-articles/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) 에서 더 자세한 내용과 샘플 프로젝트를 보세요. TeX 박스를 나타내는 SVG 그래픽을 만들기 위해 박스의 TeX 코드는 작은 파일에 기록되고, 그 파일은 pdfTeX로 조판되어 DVI 파일을 생성합니다. 참고로 pdfTeX 프로그램은 몇 줄의 Lua 스크립트를 통해 LuaTeX에 의해 실행됩니다. 그 DVI 파일은 즉석에서 다음을 사용해 SVG로 변환됩니다: `dvisvgm` 유틸리티입니다. 이 도구는 Overleaf 서버에 설치된 TeX Live 배포판에 포함되어 있습니다. `dvisvgm` 는 다음 명령줄 옵션과 함께 실행됩니다: `-n` 조판된 텍스트가 선/곡선으로 변환되도록 하여, SVG 파일의 올바른 렌더링이 TeX 글꼴 설치 여부에 의존하지 않도록 하기 위해서입니다.

노드 그래프를 만들기 위해 우리는 다음과 같은 Lua 스크립트를 사용합니다: `hiviznodelist.lua` 은 Patrick Gundlach의 작업을 바탕으로 합니다. 이 스크립트는 소위 `.gv` (Graphviz) 파일을 출력합니다. 이 파일은 다음 언어로 설명된 노드 그래프를 담고 있는 텍스트 파일입니다: `dot` 언어입니다.  `.gv` 파일은 다음 유틸리티 프로그램으로 처리됩니다: `dot` 이 프로그램은 PDF와 SVG 파일 형식 모두로 노드 도식을 출력합니다.

### 프로젝트 예시

Overleaf 프로젝트를 사용해 생성한 SVG 그래픽의 추가 예시를 몇 가지 소개합니다. 텍스트가 아주 많이 들어 있는 박스(예: \vbox 안의 박스)나 복잡한 수식을 포함하는 박스는 매우 거대한 노드 그래프를 생성합니다. Overleaf 프로젝트를 살펴볼 때는 관심 있는 기능을 보여 주기 위해 불필요하게 복잡한 박스를 사용하는 것은 피하는 것이 좋습니다.

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

이 예시는 텍스트를 직접 다음 안에 넣었을 때의 효과를 보여줍니다: `\\vbox`: 이렇게 단순한 박스인데도 노드 구조가 꽤 복잡합니다. 이 복잡성의 이유는 텍스트를 직접 `\\vbox` 에 넣으면 TeX이 줄바꿈을 수행하기 때문입니다. 다음을 볼 수 있습니다: `\\vbox` 는 345pt 너비입니다: `\hsize` 이 박스가 만들어졌을 당시의 값입니다. 또한 문자 “A”가 다음 안에 들어 있다는 점도 주목하세요: `hlist` 인데, 이 역시 345포인트 너비입니다. 그리고 큰 penalty(10000)와 함께 `\parfillskip` 및 `\rightskip` glue가 박스 내용의 끝에 있는 것을 볼 수 있습니다. 이 penalty와 두 개의 glue 항목은 TeX의 줄바꿈 작업이 삽입한 것입니다. 다음의 `glue_set` 문단 줄에 대한 값(`hlist`)를 보면 값이 매우 크다(322.500000)는 것을 알 수 있습니다. 왜 그럴까요? 문단 줄의 너비는 345pt이지만 `\parindent` 와 문자 “A”만 들어 있기 때문입니다. 남은 공간은 `\parfillskip` 가 채워야 하며, 줄의 남은 공간을 메우기 위해 상당히 많이 늘어나야 합니다.

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

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

[PDF 파일 다운로드](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

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

이 예시를 이전 것과 비교해보면 매우 유익합니다. 여기서는 노드 그래프가 훨씬 작을 뿐만 아니라,  `\\vbox` 의 폭은 단지 7.50002pt입니다. 이는 문자 “A”와 같은 폭입니다. 그 이유는 “A”가 다음에 감싸져 있기 때문입니다: `\\hbox` 이어서 `\\vbox` TeX이 줄바꿈을 수행하도록 유발하는 것을 막기 때문입니다. 이는 다음으로 만들어진 박스의 중요한 특징입니다: `\\vbox`.

![{{{alt}}}](/files/25a4fa3b22fb2ec83c503a695054c562678a37f6)

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

[PDF 파일 다운로드](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Simple maths: \hbox{$$\displaystyle \int f(x) dx$$}, complex box!

이 예시는 아주 단순한 조판 수식조차 세부적인 박스 구조를 생성함을 보여줍니다. 수식을 조판하면 *매우* TeX 내부에 복잡한 데이터 구조가 만들어집니다!

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

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

[PDF 파일 다운로드](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## 크레딧: Patrick에게 감사!

감사의 뜻을 전합니다 [Patrick Gundlach](https://twitter.com/patrickgundlach) 에게. 그는 Overleaf가 자신의 Lua 스크립트 수정본을 사용하고 배포할 수 있도록 허가해 주었습니다. `viznodelist.lua`를 처리하여 다음 형식의 파일을 출력합니다( `dot` 언어)이며, 이를 처리해 노드 그래프를 그릴 수 있습니다. Overleaf 프로젝트에는 다음과 같은 Lua 스크립트가 포함되어 있습니다: `hiviznodelist.lua`—Patrick의 원본 코드를 이름을 바꾸고 수정한 버전으로, 다음에서 이용할 수 있습니다: [GitHub](http://gist.github.com/556247). Patrick은 다음과 같은 오픈 소스 LuaTeX 기반 조판 시스템을 만들었습니다: [speedata Publisher](https://speedata.github.io/publisher/index.html) 이를 무료로 다운로드해 사용할 수 있으며, 상업적 지원 옵션도 제공됩니다.


---

# 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/ko/in-depth-articles/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.
