> 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/14-how-do-tex-engines-typeset-tables.md).

# TeX 엔진은 표를 어떻게 조판하나

## TeX 엔진은 표를 어떻게 조판하는가

## 서론: 이 시리즈는 무엇을 다루는가?

보기 좋고 미적으로 만족스러운 표를 만드는 일은 시간이 많이 걸릴 수 있습니다. 시각적 레이아웃 도구를 사용하든, LaTeX를 사용하든, HTML이나 markdown 같은 마크업 언어를 사용하든 마찬가지입니다. 특히 LaTeX 사용자에게 표 조판은 많은 사람이 꼽는 “문제점” 목록에서 매우 높은 순위를 차지하며, 아마도 “tables”가 가장 [태그가 많이 붙은 주제들 중 하나라는 사실에서 이를 짐작할 수 있습니다 tex.stackexchange에서](https://tex.stackexchange.com/tags).

tex.stackexchange의 답변과 예시 외에도, LaTeX로 표를 조판하는 데 사용할 수 있는 지원 자료를 대략적으로만 살펴봐도 표와 관련된 여러 정보 자원을 확인할 수 있습니다:

* Overleaf의 [도움말 페이지](https://www.overleaf.com/learn/latex/tables) 와 같은 다른 사이트들, 예를 들어 [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN(Comprehensive TeX Network)에는 [70개가 넘는 TeX/LaTeX 패키지](https://ctan.org/topic/table) 가 표 작성과 관련된 것으로 나열되어 있으며
* LaTeX를 사용해 표를 조판하는 데 관한 [전체 책 한 권도 있고](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* 훌륭한 [온라인 LaTeX 표 생성기](https://www.tablesgenerator.com/latex_tables)

에 대해 간단히 Google 검색만 해도 [LaTeX tables](https://www.google.com/search?q=latex+tables) 엄청난 수의 결과가 나오며, 도움말, 조언, 예시, 설명을 제공하는 많은 사이트가 목록으로 나타납니다.

### TeX, LaTeX가 아니라

LaTeX를 사용해 표를 조판하는 데 관한 문헌이 이렇게 풍부한데도, 이 주제에 대해 더 쓸 것이 과연 남아 있을까요—또 다른 표 예시와 패키지 명령의 열거/시연 말입니다? 표 조판의 근본 원리와 개념을 이끌어내거나 그에 초점을 맞추는 방식으로 표 조판이라는 주제에 접근할 방법이 있을까요? 있습니다. 하지만 이를 위해서는 LaTeX의 양파 껍질을 하나씩 벗겨내야 합니다…

우리는 독자들에게 배경 정보와 그 이면의 *메커니즘* 을 설명하는 글 시리즈를 만들기로 했습니다. TeX 기반 표 조판의. 특정 LaTeX 매크로/패키지를 사용한 표 조판에 초점을 맞추는 대신, 우리는 *기저 동작* 에 대해 살펴볼 것입니다. TeX 엔진의: LaTeX 매크로 명령이 구축되는 토대가 되는 낮은 수준의 조판 기계를 탐구하는 것입니다. 궁극적인 목표는 TeX 기반 표 조판의 핵심 방법과 알고리즘을 끄집어내고 설명하는 것이며—그렇게 함으로써 독자/사용자들이 표가 왜 그런 식으로 동작하는지 더 잘 이해하도록 돕고자 합니다. 이 접근 방식의 불가피한 결과는, LaTeX 매크로라는 보호막을 벗겨내는 일이므로, 사용자는 보통 LaTeX 매크로 코드의 여러 층에 가려져 (그리고 기꺼이) 접하지 않는 지저분한 저수준 세부사항에 노출된다는 점입니다.

이 글들을 조사하고 쓰고 예시를 만드는 데 많은 시간이 들었으므로, 우리가 제공하는 자료가 문헌에 가치 있는 보탬이 되어 독자들에게 유익한 정보를 주고 TeX 조판의 이 복잡한 영역을 더 잘 이해하는 데 도움이 되기를 바랍니다. 이 시리즈가 *실제 데이터 값을 포함하지* 논의까지 확장되어 *미학* —표 디자인의 미학—이라는 주제로도 나아갈 수 있음을 분명히 해두고 싶습니다. 이는 주관적 취향이 가득한 주제이며, 그에 대한 논쟁은 다른 곳에서 이루어져야 합니다…

### TeX 표의 메커니즘 탐구: 어떻게 할 수 있을까?

표 조판과 같은 TeX 엔진 내부에서 일어나는 더 낮은 수준의 메커니즘과 과정을 탐구하고 그것에 대해 글을 쓰기 위해 Overleaf는 Martin Ruckert의 [Web2W 과정](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

을 사용하여 Knuth의 TeX 엔진을 디버그용 버전으로 빌드(컴파일)했습니다. 전통적으로 TeX를 빌드하는 데는 TeX Live 안에서 사용되는 Web2C라는 과정이 있으며, TeX의 원래 Pascal 소스 코드를 그에 대응하는 C 코드로 변환해 C 코드를 생성합니다. 그 과정이 생성하는 C 코드는 사람이 읽으라고 만든 것이 아니라 오직 C 컴파일러만 읽도록 만들어진 것입니다. 이렇게 기계적으로 생성된 C 코드는 *극도로* 읽기 어렵고 실험 목적으로 수정하기도 어렵습니다.

이에 비해 Web2W는 C 소스 코드(사용 가능 [여기](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c))를 생성하며, 그 코드는 *비교할 수 없을 정도로* Web2C가 생성한 코드보다 훨씬 읽기 쉽습니다. 따라서 Web2W의 C 소스 코드는 학습/실험 목적으로 수정하기에 훨씬 더 적합합니다.

Web2W는 TeX의 한 버전인 “CTeX”를 생성하며, 이는 *매우* Knuth의 원래 프로그램과 가깝습니다. “CTeX”에는 SyncTeX, 명령줄 처리, Kpathsea를 통한 파일 검색과 같이 Web2C 과정에서 도입된 많은 변경과 향상 기능이 포함되어 있지 않습니다. 그런 유용한 향상 기능을 포기하더라도, 결과적으로 얻어지는 (Web2W) C 코드는 TeX가 Pascal로 작성되었음에도 Knuth가 출판한 TeX 소스 코드를 사용해 비교적 쉽게 탐색할 수 있습니다.

* **이름에 대한 참고:** 엄밀히 말해 “TeX”라는 이름은 Donald Knuth가 작성하고 출판한 원래 소프트웨어만을 가리켜야 합니다. 그의 소프트웨어에 대한 어떤 수정도 결과적으로 생기는 TeX 기반 조판 소프트웨어에 대해선 다른 이름을 사용해야 합니다. 여기서는 Web2W 과정을 사용해 본질적으로 여전히 Knuth의 원래 소프트웨어인 엔진을 빌드했습니다. 그러나 혼동을 피하기 위해 Web2W로 빌드한 특정 버전을 뜻할 때는 “CTeX”라는 용어를 사용하고, Knuth의 TeX 원리에 기반한 조판 언어의 일반적인 용어로는 “TeX”도 사용하겠습니다. 엄밀히 올바른 용어를 때때로 엄격하게 적용/사용하지 못한 점은 독자 여러분의 양해를 바랍니다. 문맥이 의미/의도를 전달해주기를 기대합니다.

CTeX 디버그 버전은 [Eclipse IDE](https://www.eclipse.org/downloads/packages/)를 사용해 실행되었으며, 이를 통해 표 조판을 지원하도록 Knuth가 설계한 저수준 기본(내장) TeX 명령과 알고리즘을 구현하는 C 코드가 실시간으로 처리되는 모습을 관찰할 수 있었습니다.

다음의 짧은 영상(약 90초)은 CTeX 엔진이 [Eclipse IDE](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

CTeX 외에도, Knuth의 원래 소프트웨어에는 없는 몇 가지 추가 primitive에 접근하기 위해 e-TeX도 컴파일했습니다. CTeX와 e-TeX는 지금으로서는 오래된 TeX 기반 엔진이지만, 표 조판의 메커니즘을 탐구하는 기초로는 여전히 적합합니다. 왜냐하면 그러한 기반 원리는 모든 TeX 기반 조판 엔진에 여전히 적용되기 때문입니다.

### 표를 탐구하는 데 왜 더 오래된 TeX 엔진을 사용할까?

첫째, 출판된 책 [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)은 TeX의 소스 코드를 나열하고 설명하며, 30년이 훨씬 넘게(1986년) 출판되었음에도 여전히 TeX 내부 작동의 흐릿한 물길을 안내하는 매우 편리한 가이드입니다. 물론 TeX의 소스 코드 문서를 직접 조판할 수도 있습니다. 예를 들어 Overleaf 프로젝트 [TeX, e-TeX 또는 pdfTeX의 소스 코드 문서를 조판하기](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv)를 참조하세요. 1986년 TeX:The Program 출판 이후 pdfTeX, XeTeX, LuaTeX를 포함한 새로운 TeX 엔진들이 발전해 왔으며, 이들은 모두 TeX:The Program에는 문서화되어 있지 않은 기능과 명령을 도입했습니다. 그것들은 Knuth의 원래 소프트웨어에 존재하지 않았기 때문입니다.

표 조판과 같은 많은 핵심 과정에서는 TeX의 소스 코드가 Pascal로 작성되었음에도, TeX:The Program에 문서화된 코드는 여전히 연구의 기초로서 유효합니다. 게다가 Knuth의 TeX는 특히 매우 유용한 [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) 과정을 통해 비교적 쉽고 빠르게 컴파일할 수 있습니다. 이러한 컴파일의 용이성과 속도 덕분에 이 시리즈의 후반부에서 사용되는 SVG 그래픽 생성과 같은 간단한 방식으로 TeX를 수정하기가 훨씬 더 편리합니다.

### TeX와 LaTeX의 차이 이해하기

많은 독자들은 이미 LaTeX가 실제로는 *실행 가능한* 조판 프로그램이 아니라, 궁극적으로 TeX라는 더 낮은 수준의 조판/프로그래밍 언어로 작성된 명령어(*매크로*)의 방대한 모음이라는 사실을 알고 있을 것입니다. 여러분의 LaTeX 코드는 *TeX 엔진*이라는 실행 프로그램—즉 여러분의 LaTeX 코드(문서)와 조판된 PDF 사이에 놓이는 소프트웨어—이 처리한 후에야 조판 결과물을 만들어냅니다. 오늘날 사용자는 pdfTeX, XeTeX, LuaTeX의 변형을 포함해 여러 TeX 엔진 중에서 선택하여 LaTeX 코드를 조판할 수 있습니다.

TeX/LaTeX 생태계에 새로 들어온 사람들은 종종, 그리고 당연하게도, 자신들이 접하는 도구들에 쓰인 암호 같은 이름의 홍수에 당황합니다: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX, LuaLaTeX. 여러분도 같은 느낌이라면, Overleaf의 글 [이름에 담긴 의미: TeX의 여러 변종에 대한 안내서](/latex/ko/in-depth-articles/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) 를 보면 도움이 됩니다. 이 글은 그런 용어들의 기원과 의미를 설명합니다.

#### 방언과 TeX primitive

모든 TeX 엔진에는 *primitive* 라고 불리는 내장 명령 집합이 있으며, 이들은 합쳐져 해당 엔진이 갖는 TeX 조판 언어의 “방언”을 이루고, 각 엔진에 내장된 기능을 반영합니다. 여기서 TeX 엔진의 내장 명령을 설명할 때 사용하는 “primitive”라는 용어는 *실제 데이터 값을 포함하지* 그 명령들이 기본적이거나 단순하다는 뜻이 아니라, 근본적이고 분해 불가능하다는 뜻입니다. 즉 다른 명령들로 구성된 것이 아닙니다(매크로와는 다르게). 모든 TeX 엔진은 큰 핵심 primitive 집합을 공유하지만, 일부 엔진에는 그 엔진에 특화된 primitive도 포함되어 있어 TeX의 “방언”이라는 개념이 생겨납니다.

LaTeX 문서를 조판할 때 어떤 TeX 엔진을 사용하든, 그 역할은 문서를 작성하고 구성하는 데 사용된 LaTeX 명령들(즉, 매크로) 모음을 처리(“실행”)하는 것입니다. 사실상 TeX 엔진은 여러분의 LaTeX 코드(매크로)를 *다시* 엔진이 실제 조판을 수행할 수 있는 구성 요소인 TeX 엔진 primitive 명령으로 “변환”합니다. TeX 엔진으로 문서를 조판할 때 반드시 LaTeX 명령을 사용할 필요는 없습니다—여러분은 *pdfLaTeX를 사용해야 하고 XeLaTeX를 사용할 수 없다면,* 굳이 *문서를 전부 TeX primitive만으로, 즉 저수준의* TeX 프로그래밍 언어 *에 직접 작성하는 방식으로 구성할 수도 있습니다. 하지만 오늘날의 기준에서 TeX 언어는 꽤 난해하며 일반적으로 프로그래밍하기 어려운 언어로 여겨집니다. 또한 조판 목표를 달성하기 위해 매우 많은 내장 primitive가 필요할 수 있어, 오류가 발생하기 쉽고 잠재적으로 반복적인 프로그래밍 작업이 됩니다.* TeX 언어로 직접 작성하거나 같은 명령열을 계속 다시 입력하는 일을 피하기 위해, TeX 엔진은

라고 불리는 “지름길”을 만들 수 있게 해줍니다. *매크로*매크로입니다. 매크로를 만들면 잠재적으로 길고 복잡한 TeX 언어 primitive(또는 다른 매크로) 시퀀스를 하나의 “상위 수준” 명령으로 묶는 자신만의 명령을 정의하게 됩니다. TeX 프로그래머는 LaTeX가 제공하는 명령처럼, 하나의 명령 안에 많은 기능을 캡슐화하는 매우 정교한 매크로를 작성할 수 있습니다. LaTeX나 [ConTeXt](https://wiki.contextgarden.net/Main_Page)같은 매크로 패키지를 사용하면, 문서 작성자는 (대부분) 많은 지루한 세부사항으로부터 보호받아, TeX 언어의 복잡성과 미묘함을 계속 다루는 대신 글쓰기와 조판에 집중할 수 있습니다.

## 처음에는...

수학 조판과 정교한 줄 바꿈 알고리즘을 설계하는 일과 함께, Knuth는 표를 조판하도록 TeX 소프트웨어를 프로그래밍해야 하는 과제에 직면했습니다. 분명 어떤 표 구성 알고리즘도 지나치게 제한적이어서는 안 됩니다. 그렇게 되면 사실상 무한에 가까운 다양한 표 레이아웃을 만들 자유가 필요한 사용자들이 불편을 겪게 되기 때문입니다. 게다가 표 셀에는 수학, 그래픽, 그리고 보기 좋게 조판된 줄로 나뉜 텍스트 조각 등 다양한 내용이 들어갈 수 있습니다. 사실 TeX가 조판할 수 있는 것은 무엇이든 들어갈 수 있습니다. 이러한 유연성을 제공하려면 TeX의 표 구축 알고리즘이 TeX 조판 기계의 다른 부분들과 긴밀하게 협력해야 합니다.

하지만 TeX 엔진은 표 구성 기능이 제공하는 유연성에 대한 대가를 요구합니다. 즉, 내장(primitive) 표 조판 명령들의 저수준 동작에는 수많은 미묘함과 뉘앙스가 있으며, 그것은 9개입니다:

* **`\halign`**, **`\valign`**: 핵심 표 구성 명령
* **`\tabskip`**: \halign의 열 또는 \valign의 행 사이에 놓이는 glue
* **`\cr`**: 표의 모든 줄에 필요한 “carriage return” 종료 명령
* **`\noalign`**: \halign의 행 또는 \valign의 열 사이에 재료를 삽입
* **`\everycr`**: \cr를 감지한 뒤 읽을 명령(토큰 레지스터)
* **`\span`**: 이중 기능 명령: \span은 열이나 행에 걸친 셀을 만들거나, 표 프리앰블의 명령을 확장합니다(이에 대해서는 자세히 살펴보겠습니다)
* **`\omit`**: 특정 셀에 대한 템플릿을 건너뜀
* **`\crcr`**: 사용자가 필요한 \cr을 잊었을 때 오류를 피하기 위해 매크로에서 사용

우리는 표 구성의 여정을 따라가며 이 명령들을 만나게 될 것입니다.

### 어려움의 아득한 메아리

묻혀 있는 [TeX의 소스 코드](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) 에는 표를 조판하도록 설계된 저수준 명령 \halign과 \valign을 구현하는 주제를 소개하는, 다소 압도적인 설명이 들어 있습니다:

> “\halign과 \valign이 작동할 때마다 약간의 기적 같은 일이 일어납니다. 왜냐하면 그것들은 TeX의 너무나 많은 제어 구조를 가로지르기 때문입니다. 따라서 지금의 이 페이지는 아마 초보자가 이 프로그램을 읽기 시작하기에 가장 좋은 곳은 아닐 것입니다. 먼저 다른 모든 것을 익히는 편이 낫습니다.”

Knuth는 이어서 말합니다

> “\halign이 처리되는 동안 우리는 거리낌 없이 제어를 TeX의 나머지 부분에 넘깁니다. 중요한 분기점에서는 조정 루틴이 개입해 약간의 작업을 수행하곤 하지만, 대부분의 시간에는 이 루틴들이 배경에 숨어 있습니다. 마치 최면 후 암시와 비슷합니다.”

이러한 মন্তব্য들로부터, Knuth에게조차 TeX의 표 조판을 구현하는 일은 “어느 정도 도전”이었던 것으로 결론내리는 것이 타당해 보입니다—사용자에게 제어와 유연성을 제공하면서도 동시에 TeX의 자동 표 구성 알고리즘이 TeX의 핵심 조판 과정과 잘 조율되도록 보장해야 했기 때문입니다.

저자는 TeX의 표 조판 기능 뒤에 있는 코드와 알고리즘의 복잡성을 기꺼이 인정하지만, 또한 비교적 적은 양의, 비록 밀도 높기는 하나, Pascal(또는 C) 코드 안에 담긴 엄청난 역량에 대해서는 감탄을 표합니다.


---

# 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/14-how-do-tex-engines-typeset-tables.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.
