> 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/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

# TeX 표: TeX가 걸친 열 너비를 계산하는 방법

## 이 글의 목표

이 글에서는 어떻게 $$\mathrm\TeX$$ 테이블에 여러 열에 걸친 항목(예: 표 제목)이 포함될 때(예: 다음을 사용하여) 표 열 너비를 계산하는지 $$\mathrm\TeX$$ 원시 명령 `\omit` 및 `\span`). 기본적인 [“기준” 표](#reference-table) 를 출발점으로 삼아, 우리는 그 기준 표에서 파생된 다양한 예시들을 만들어 간다. 이를 위해 여러 항목을 수정해 병합된 열을 만든다. 이러한 변경의 효과를 살펴보면 $$\mathrm\TeX$$ 이 병합된 열의 너비를 계산하는 데 사용하는 기본 알고리즘을 이해하기 시작할 수 있다.

### 사용하기 $$\mathrm\TeX$$ 작동하지 $$\mathrm\LaTeX$$

를 살펴보고 설명하기 위해 *어떻게* $$\mathrm\TeX$$ 병합된 열의 너비를 결정하는 $$\mathrm\LaTeX$$ 마법 같은 모든 `\halign{...}`, `\span` 및 `\omit`. [기존의 $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ 표 패키지](https://ctan.org/topic/table) 는 물론 필수적인 생산성 도구이며, 사용자가 다음을 사용해 다양한 표 형식 자료를 빠르게 만들 수 있게 해주는 매우 유용한 기능들을 풍부하게 제공한다. $$\mathrm\LaTeX$$. 그런 패키지들은 $$\mathrm\TeX$$의 저수준 동작을 둘러싼 필수적인 “매크로 뼈대”를 제공하며, 개발자들은 그 아래의 복잡성을 처리해 주는 매우 반가운 추상화와 완충층을 제공한다. 그런 패키지들 중 상당수는 정말로 놀라운 수준의 복잡한 $$\mathrm\TeX$$ 프로그래밍의 성취다. 우리 모두는 원시 $$\mathrm\TeX$$!

실제 알고리즘은 $$\mathrm\TeX$$ 가 병합된 열의 너비를 계산하는 데 사용하는 알고리즘은 [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) 의 245쪽에 설명되어 있으며, 더 자세한 내용은 인쇄본 책의 801절(336쪽)에 나온다. $$\mathrm\TeX$$의 원본 코드 [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). 그러나 많은 사람들(저를 포함해)에게 Knuth의 설명은 때때로 꽤 압축적이고 간결해서, 세부 내용을 따라가기가 어려울 수 있다. 예시가 항상 매우 도움이 된다.

### 네, 표는 복잡하다

책의 768절(322쪽)에서 [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), Knuth는 흥미로운 말을 한다:

> “가끔은 `\halign` 및 `\valign` 가 작동하는 것이 거의 기적 같다. 왜냐하면 그것들은 $$\mathrm\TeX$$”이라는 구절에 나타납니다.

또한 4권짜리 책 시리즈의 제4권인 [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) 는 표를 만드는 데 무려 180쪽(pp199–379)을 할애한다. $$\mathrm\TeX$$ 통해 `\halign` 및 `\valign`.

그러므로 다음과 같이 관찰해도 무방하다. $$\mathrm\TeX$$ 표는 정말로 “꽤 까다롭다”.

### 열 병합: \omit, \span 및 \multispan

앞서 언급했듯이, 를 살펴보기 위해 $$\mathrm\TeX$$의 열 너비 계산을 탐구하려면 “원시” $$\mathrm\TeX$$를 사용해야 한다. 즉, 기본 명령들과 하나의 $$\text{Plain }\mathrm\TeX$$ 라는 매크로의 조합을 뜻한다. `\multispan`. 이 명령들을 우리의 예시 표를 직접 설명하는 데 사용할 것은 아니지만(즉, 모든 $$\mathrm\TeX$$ 코드를 완전히 설명하지는 않겠지만), 이들을 간단히 소개해 둘 만한 가치가 있다.

* `\halign`: 표를 만드는 두 개의 $$\mathrm\TeX$$ 기본 명령(프리미티브) 중 하나이다. 다른 하나는 `\valign` 이지만, 그것은 그다지 널리 쓰이지 않으며 이 글에서는 다루지 않는다.
* `\omit`: $$\mathrm\TeX$$ 가 $$\mathrm\TeX$$ 표 항목의 프리앰블 템플릿을 무시하도록 지시하는 기본 명령이다.
* `\span`: $$\mathrm\TeX$$ 인접한 두 표 항목을 결합하는 데 사용되는 기본 명령이다.
* `\multispan{n}`: 일반 $$\mathrm\TeX$$ 열을 걸치게 하는 매크로 `n` 다.

본질적으로, 열을 걸치려면 $$\mathrm\TeX$$ 적절한 수의 표 프리앰블 템플릿을 무시하고 필요한 수의 표 항목을 하나의 항목으로 결합한다. `\multispan{n}` 는 다음의 순서로 확장되어 작동한다. `\omit` 및 `\span` 열을 걸치는 데 필요한 토큰들 `n` 를 들어, `\multispan{3}` 는 다음으로 확장된다. `\omit\span\omit\span\omit`.

## 우리의 “기준” 표 소개

다음은 우리의 기준 표와, 그 구성 요소를 설명하는 주석 버전이다:

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

기준 표를 수정해 가면서, 여러 열에 걸친 항목을 추가할 때 표의 전체 너비와 개별 열의 너비가 어떻게 변하는지 관찰할 것이다. 이 기준 표는 원시 $$\mathrm\TeX$$ 다음 설정을 사용하여 `\halign{...}` 기본 명령과 표를 조판하는 데 필요한 여러 사용자 정의 매크로를 함께 사용해 만들어졌다. 이 매크로들은 예시와 설명을 이해하는 데 필수적이지 않으므로 여기서는 논의하지 않겠다.

우리 기준 표의 특징을 설명하는 주석 버전은 다음과 같다:

![{{{alt}}}](/files/5d5f43b4fb3cf87eaeecaed9517d6a46cc76cd7a)

우리의 첫 번째 예시 표 묶음과 초기 기준 표는 모두 `\tabskip=0pt` 로 설정되어 있어 $$\mathrm\TeX$$ 열 사이에 어떤 공간도 추가하지 않는다. 사실상 모든 열이 서로 맞붙어 있다. 이렇게 하는 이유는 초기 논의와 뒤따르는 계산을 단순화하기 위해서다. 나중에 이 글에서 0이 아닌 `\tabskip` 간격(glue)을 다시 도입해 그것이 병합된 열 너비 계산에 미치는 영향을 살펴볼 것이다.

주석에서 언급했듯이, 첫 번째 행을 제외한 모든 비병합 표 항목의 시작 부분에 약간의 공백(5pt)을 추가했다. 그 5pt의 공백은 첫 번째 행을 제외한 모든 비병합 항목의 총 너비의 일부이며, 표가 조금 덜 복잡해 보이도록 하기 위해 추가한 것이다.

### 표 너비에 대한 간단한 메모

다음 `\halign{...}` 명령에는 세 가지 형태가 있다:

* `\halign{...}`: 표를 $$\mathrm\TeX$$ 항목의 크기(및 `\tabskip` 간격(glue))를 바탕으로 계산한 너비로 설정한다.
* `\halign to *width* {...}`: $$\mathrm\TeX$$ 가 표를 지정된 `*너비*`;
* `\halign spread *amount*{...}`: 계산된 너비를 `*amount*`.

언제 $$\mathrm\TeX$$ 를 사용해 표를 조판한다 `\halign{...}` 는 조판에 필요한 여러 계산을 수행하기 위해 전체 표를 메모리로 읽어 들여야 한다. 따라서 다음을 사용해 너비를 지정하지 않는 한 `\halign to *width* {...}` 에서 처리가 끝나기 전까지 최종 너비를 알 수 없다. $$\mathrm\TeX$$ 로 만든 표의 너비를 얻는 한 가지 방법은 먼저 표를 `\halign{...}` 안에 조판하는 것이다 `\vbox{...}` (예: `\setbox0=\vbox{\halign{...}}`) 그리고 나서, 예를 들어 `\the\wd0` 을 사용해 너비를 얻을 수 있다.

### 표 항목 안에서 자동 줄바꿈은 이루어지지 않는다

중요한 점은 다음과 같다: $$\mathrm\TeX$$ 가 `\halign{...}` \halign *로 만든 표를 조판할 때, 표 항목 안의 어떤 텍스트도 자동으로 줄바꿈되지 않는다. 표 항목은*제한된 가로 모드 `\hbox`— 바로 `\vbox{...}` 처럼 —에서 조판된다. 줄바꿈을 가능하게 하려면 표 항목의 텍스트를 `\hsize` 에 적절한 값을 함께 사용해야 한다 `\vbox{...}`. 그러나 `\noalign{...}` 명령(하나의 $$\mathrm\TeX$$ 기본 명령)은 `\halign{...}` 에서 사용되며 $$\mathrm\TeX$$의 줄바꿈 규칙을 따른다. 본질적으로 이름이 암시하듯, `\noalign{...}` 는 $$\mathrm\TeX$$ 가 `\halign{...}` 에서 “벗어나” 표의 행 사이에 재료를 배치할 수 있게 해준다. 보통은 표 행 사이에 가로선을 넣는 데 사용된다.

### 허용되지 않음: \hbox{...} 안의 \halign{...}

당신은 *직접* 를 조판할 수 없다 `\halign{...}` 를 `\hbox{...}`안에. 다음과 같이 사용하려고 하면 `\hbox{\halign{...}}` 다소 혼란스러운 오류가 발생한다:

```latex
! Missing } inserted.
<inserted text>
                }
<to be read again>
                   \halign
l.1 \hbox{\halign
```

#### 이 오류에 대한 설명

둘러싸는 `\hbox{...}` $$\mathrm\TeX$$ 때문에 *로 만든 표를 조판할 때, 표 항목 안의 어떤 텍스트도 자동으로 줄바꿈되지 않는다. 표 항목은*는 `\halign{...}` 안에 있고, 그 다음 *수직 모드* 명령인 것을 감지한다. 예를 들어, 문단 안에서 `\halign{...}` 를 사용하면 $$\mathrm\TeX$$ 은 문단을 종료하고, `\halign{...}` 를 처리한 다음 문단의 나머지를 계속 진행한다.

안에서 사용되면 `\hbox{...}`에서 관찰했듯이, `\halign{...}` 를 유발해 $$\mathrm\TeX$$ 현재 그룹을 강제로 닫으려 하면서 다시 수직 모드로 빠져나가려 한다: $$\mathrm\TeX$$ 는 “`! Missing }`”를 보고하고, 그룹 사용에서 실수를 했다고 생각하기 때문에 오류를 낸다. 오른쪽 중괄호(`}`)가 $$\mathrm\TeX$$ 코드에서 빠져 있지는 않을지라도, 오류 메시지는 `\hbox{...}` 가 “끼어들어” 문제를 해결하기 위해 적절한 다음 조치를 “최선의 추측”으로 택한 결과에 따른 증상이다. $$\mathrm\TeX$$ 예시들: 병합된 열을 가진 표

## 다음 일련의 표 그림은 표 열을 병합하는 효과를 보여 주는 다양한 예시를 제공한다. 이는 긴 표 항목이 특정 열의 너비에 예상치 못한 결과를 가져올 수 있으며, 그 결과 표 자체의 너비에도 영향을 준다는 것을 보여준다. 우리가 다루려는 질문은, 특정 표 항목이 여러 열에 걸치는데도 “들어가기엔 너무 넓을” 때

가 무엇을 하는가이다. 앞서 언급했듯, $$\mathrm\TeX$$ 는 열 너비 계산이라는 이 문제에 대해 실제로 특정 알고리즘을 적용한다. 다음 예시들은 그 알고리즘의 작동 방식을 “감”으로 익히는 데 도움이 되도록 설계되었다. $$\mathrm\TeX$$ 예시 표 1

### 이 예시에서는

\multispan{2} `를 사용해 1열과 2열을 걸치며, 그 항목의 텍스트는` 표 제목 **이다**:

![{{{alt}}}](/files/9650618b8f3edc0a447ba799210387003d2f47b1)

#### 관찰

* 이 표의 너비는 [기준 표](#reference-table): $$327.71722\text{pt}$$.
* 1열과 2열을 걸치는 항목의 너비는 $$81.04953\text{pt}$$ 이며, 이것은 그것이 걸치는 열들의 총 너비보다 작다: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## 예시 표 2

에서와 같이, [이 예시에서는](#example-table-1)이 예시도 `를 사용해 1열과 2열을 걸치며, 그 항목의 텍스트는` 를 사용해 1열과 2열을 걸치지만, 여기서는 텍스트가 **약간 더 긴 표 제목**.

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

#### 관찰

인 더 긴 항목을 사용한다. [기준 표](#reference-table) 이 예시를 우리의

* 와 비교해 보면 다음을 볼 수 있다: $$327.71722\text{pt}$$ 을 $$374.37032\text{pt}$$이 표의 너비가 $$46.6531\text{pt}$$.
* 에서 증가했다.$$156.28664\text{pt}$$1열과 2열을 걸치는 항목( $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$)의 너비는 그것이 걸치는 열들의 총 너비보다 크다: $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ . 그 차이는
* $$\mathrm\TeX$$ 이며, 표 너비가 증가한 양과 같다. $$\mathrm\TeX$$ 는 2열의 너비를 조정해 필요한 추가 공간을 제공했다. 나중에
* 가 2열을 얼마나 늘려야 하는지 계산하는 방법을 보게 될 것이다.

### 1열은 영향을 받지 않는다. 1열과 2열을 걸치는 항목은 1열의 너비에 영향을 주지 않는다.

\multispan{2} `\multispan{3}` 1열부터 3열까지를 걸치며, 항목의 텍스트는 [예시 표 2](#example-table-2): **약간 더 긴 표 제목**.

![{{{alt}}}](/files/90a5445e9955d3fa4aa6ee6f36dd6d05f53a4409)

#### 관찰

* 이 표의 너비는 [기준 표](#reference-table): $$327.71722\text{pt}$$.
* 1열부터 3열까지를 걸치는 항목의 너비($$156.28664\text{pt}$$)는 그것이 걸치는 세 열의 총 너비보다 작다: $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* 1열부터 3열까지를 걸치는 항목은 어떤 열 너비에도 영향을 주지 않았다.

이제 어떤 패턴이 보이기 시작하는가?

### 예시 표 4

와 마찬가지로 [1열은 영향을 받지 않는다. 1열과 2열을 걸치는 항목은 1열의 너비에 영향을 주지 않는다.](#example-table-3)에서와 같이, 여기서는 `\multispan{3}` 를 사용해 1열부터 3열까지를 걸치되 이번에는 텍스트가 훨씬 더 긴 항목을 사용한다: **훨씬 더 길고 한참 이어지는 표 제목**.

![{{{alt}}}](/files/898ce8010674406e4b11f96144e1f456ca2aeb1d)

#### 관찰

* 와 비교하면 [기준 표](#reference-table)이 표의 너비가 $$327.71722\text{pt}$$ 을 $$465.95685\text{pt}$$까지 증가했다: 증가분은 $$138.23963\text{pt}$$.
* 1열부터 3열까지를 걸치는 항목의 너비는 $$306.91216\text{pt}$$.
* 세 개의 걸친 열에 있는 항목들의 총 너비는 $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* 긴 걸친 항목과 1열부터 3열까지의 항목들 사이의 너비 차이는 $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. 표 너비가 증가한 양과 정확히 같다(소수점 넷째 자리까지!).
* 오직 3열만 너비가 증가했다. 1열도 2열도 영향을 받지 않았다.

#### 패턴이 드러난다

를 살펴보면 [예시 표 2](#example-table-2) 및 [예시 표 4](#example-table-4) 두 경우 모두 **병합 범위의 마지막 열** 의 너비가 늘어나 긴 항목을 수용하도록 했음을 알 수 있다.

* In [예시 표 2](#example-table-2): 긴 항목은 1열과 2열을 걸쳤다. 2열이 “늘어났다”.
* In [예시 표 4](#example-table-4): 긴 항목은 1열부터 3열까지를 걸쳤다. 3열이 “늘어났다”.

#### 3열의 너비: 알고리즘이 드러나는가?

다음 계산은 $$\mathrm\TeX$$ 가 무엇을 하는지 더 분명하게 보여 준다. 우리가 아는 것은 다음과 같다:

* 1열부터 3열까지를 걸치는 긴 항목의 너비는 $$306.91216\text{pt}$$.
* 1열과 2열의 항목 총 너비는 $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

그 값들의 차이는 무엇인가? 그것은 $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ 이며, 이것이 3열에 사용되는 너비다. 이는 $$\mathrm\TeX$$.

### 예시 표 5

더 복잡한 예시로 가기 전에, 여기 또 하나의 “단순한” 예시가 있다. 이 표에는 [예시 표 4](#example-table-4): **훨씬 더 길고 한참 이어지는 표 제목**와 같은 긴 항목이 들어 있지만, 이번에는 `\multispan{6}` 을 사용해 그 항목이 표 전체를 걸치도록 한다. 보시다시피, 그 결과 표의 너비는 여전히 우리의 [기준 표](#reference-table) ($$327.71722\text{pt}$$와 같은 너비를 유지한다. 즉, 어떤 열도 이 아주 긴 항목의 영향을 받지 않는다. 분명한 이유는 항목의 너비($$306.91216\text{pt}$$)가 그것이 걸치고 있는 모든 항목의 총 너비보다 작기 때문이다: $$327.71722\text{pt}$$즉, 표의 너비보다 작다.

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

### 예시 표 6: 조금 더 복잡함

여기서는 두 가지 서로 다른 항목이 모두 5열까지 걸치는 효과를 보여 주기 위해 세 개의 예시 표(6(a)–6(c))를 살펴본다. [예시 표 6(a)](#example-table-6a) 및 [예시 표 6(b)](#example-table-6b) 는 각각 5열까지 여러 열에 걸치는 하나의 항목을 포함한 표를 보여 준다. [예시 표 6(c)](#example-table-6c) 는 두 걸친 항목을 하나의 표로 결합하고 다음 질문을 던진다: 실제로 5열의 너비를 결정하는 것은 어느 항목이며, 왜 그런가? 그 답은 $$\mathrm\TeX$$.

#### 예시 표 6(a)

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

**관찰**

* 와 비교하면 [기준 표](#reference-table)이 표의 너비가 $$327.71722\text{pt}$$ 을 $$371.11153\text{pt}$$까지 증가했다: 증가분은 $$43.39431\text{pt}$$.
* 3열부터 5열까지를 걸치는 항목의 너비는 $$215.06683\text{pt}$$.
* 3열부터 5열까지의 항목 총 너비는 $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* 3열부터 5열까지 걸친 항목들과 걸친 항목의 너비 사이의 차이는 $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: 표 너비가 증가한 정확한 양(소수점 넷째 자리까지!)이다.

#### 예시 표 6(b)

![{{{alt}}}](/files/17795cbf8e48cd3c75084d51cf11aca55d917e00)

**관찰**

* 와 비교하면 [기준 표](#reference-table)이 표의 너비가 $$327.71722\text{pt}$$ 을 $$353.3233\text{pt}$$까지 증가했다: 증가분은 $$25.60608\text{pt}$$.
* 1열부터 5열까지를 걸치는 항목의 너비는 $$306.91216\text{pt}$$.
* 1열부터 5열까지의 항목 총 너비는 $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* 1열부터 5열까지 걸친 항목들과 걸친 항목의 너비 사이의 차이는 $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **메모** 이것은 *더 적다* 보다 계산된 값보다 [예시 6(a)](#example-table-6a)에서의 값인 $$43.3943\text{pt}$$.

#### 예시 표 6(c)

여기서는 예시 표 [6(a)](#example-table-6a) 및 [6(b)](#example-table-6b) 의 항목을 하나의 표로 결합한다: 무슨 일이 일어나는가?

![{{{alt}}}](/files/83a39fe12f110989bbbcd44ed2ed231ff66ae056)

**관찰**

* 와 비교하면 [기준 표](#reference-table)이 표의 너비가 $$327.71722\text{pt}$$ 을 $$371.11153\text{pt}$$까지 증가했다: 증가분은 $$43.39431\text{pt}$$. 이것이 정확히 [예시 표 6(a)](#example-table-6a).

#### 무엇이 $$\mathrm\TeX$$ 를 하고 있는가?

의 알고리즘과 의사결정 과정을 이해하려면, 이 항목이 $$\mathrm\TeX$$가 걸치고 있는 항목들을 넘어선다는 점에 주목하자.

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

그러나 이 항목은 $$25.60608\text{pt}$$가 걸치고 있는 항목들을 훨씬 더 넘어

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

간다: $$43.3943\text{pt}$$만큼. 따라서 그 항목이 “경주에서 이기고”, 5열의 너비는 **최대** 이 두 값($$43.3943\text{pt}$$) 중 더 큰 값만큼 늘어난다. 이제 5열의 너비는 $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ 3열부터 5열까지를 걸치는 항목을 수용하게 된다. 사건의 정확한 “순서”에 대한 우리의 설명은 약간 단순화되어 있지만, 결과는 우리가 설명한 바와 같다.

## 약간의 복잡성 되살리기

지금까지 논의의 복잡성을 최소화하기 위해 우리는 $$\mathrm\TeX$$의 알고리즘의 원리를 보여 주는 비교적 단순한 예시들을 사용했다. 특히 우리는 `\tabskip=0pt`로 설정했다. 실제로는 “현실 세계”의 표에는 여러 열에 걸치는 항목이 많이 있을 가능성이 높고, 물론 `\tabskip` 간격(glue)의 값도 0이 아닐 것이다. 이제 그 주제로 돌아가 보자.

### \tabskip glue와 병합된 열 너비

표 설계에서는 종종 열 사이에 공백을 추가해야 하며, 물론 $$\mathrm\TeX$$ 는 이를 위해 다음과 같은 기본 명령을 제공한다: `\tabskip`이 명령은 고정되거나 유연한 간격(glue)(간격)을 넣는 데 사용할 수 있다:

* 표 앞에(즉, 1열의 왼쪽에);
* 하나 이상의 열 사이에;
* 표 뒤에(즉, 마지막 열의 오른쪽에).

다시 떠올리기 위한 예시:

![{{{alt}}}](/files/05892fedcfecfbcf48e7bd88a098c26503eac7d3)

### \tabskip 간격(glue)은 병합된 열 너비에 어떤 영향을 미치는가?

0이 아닌 `\tabskip` 열 사이 간격(glue)의 존재는 $$\mathrm\TeX$$ 가 병합 범위의 마지막 열 너비를 늘릴 필요가 있다고 생각하기 전에 추가 공간을 제공한다.

다음 예시에서는 두 개의 표를 사용해 두 열을 걸치는 결과를 비교할 것이다. 표들 사이의 유일한 차이는 `\tabskip` 간격(glue)의 사용이다.

* 첫 번째 예시는 우리가 원래 사용한 “기준” 표를 사용하며, 기억하시겠지만 `\tabskip=0pt`.
* 두 번째 예시는 우리의 [기준 표](#reference-table) (위에 주석 처리된) 수정된 버전을 사용하며, 여기에는 `\tabskip=10pt` 가 표의 앞과 뒤에 설정되어 있지만, 더 중요한 것은 `\tabskip=20pt` 가 열들 사이에 설정되어 있다는 점이다.

수정된 *기준 표에서는 두 개의 걸친 열이 열 너비에는 영향을 주지 않지만,* 원본 *에서는 2열(그리고 표 너비)에 영향을 준다.* [기준 표](#reference-table).

### 원래 기준 표: \tabskip=0pt

여기서는 우리의 원래 [기준 표](#reference-table) 와, 원래 [기준 표](#reference-table)에서 파생된 두 번째 표를 함께 보여 주는데, 이 두 번째 표에는 “**더 긴 표 제목을 시험**”이라는 항목이 1열과 2열을 걸친다. 분명히 도표의 두 번째 표에서 2열과 전체 표 모두가 걸친 열의 영향을 받는다.

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

### 수정된 기준 표: \tabskip=20pt

여기서는 수정된 기준 표와, 수정된 기준 표에서 파생된 두 번째 표를 함께 보여 주는데, 이 두 번째 표에도 “**더 긴 표 제목을 시험**”이라는 항목이 1열과 2열을 걸친다. 분명히 도표의 두 번째 표에서는 2열의 너비도 표의 너비도 걸친 열의 영향을 받지 않는다. 이 경우 `\tabskip` 간격(glue)(`20pt`)가 열들 사이에 있어 1열과 2열을 걸치는 항목의 텍스트가 필요로 하는 공간을 “흡수”하는 데 도움이 되었다:

![{{{alt}}}](/files/40e14aa2f568c4dd0b9187d3410f5349df570074)

## 의 핵심 $$\mathrm\TeX$$의 알고리즘

앞서 제공한 예시들이 $$\mathrm\TeX$$ 가 걸친 항목을 수용하기 위해 무엇을 하는지, 그리고 $$\mathrm\TeX$$ 가 필요한 경우 **마지막** 병합된 열 범위마다 그 안의 열 너비를 조정하는 방법에 대한 “감”을 익히는 데 도움이 되었기를 바란다. 개별 열 안의 항목 너비 외에도, 0이 아닌 `\tabskip` 간격(glue)의 존재는 $$\mathrm\TeX$$ 가 어느 열 너비를 조정해야 하는지 결정할 때 고려하는 중요한 요소다. 기억해야 할 핵심은 $$\mathrm\TeX$$의 목표가 **마지막 열** 의 적절한 너비를 계산하는 것이라는 점이다.

### 최종 표 예시: 병합 범위의 마지막 열

이 최종 예시에서는 다시 한 번 우리의 수정된 기준 표를 사용한다(그리고 `\tabskip` 위에서 논의한 glue 값들)을 이용해, rule로 가로지르는 여러 열을 포함한 또 다른 표를 도출한다—span을 더 보기 쉽게 하기 위해 rule을 사용했다.

두 표는 상단 표에서 5열 이전의 어떤 열도 span된 열의 영향을 받지 않았음을 보여 주도록 세심하게 정렬되어 있다. 도표 왼쪽의 더 짙은 초록색 영역은 두 표의 1열부터 4열까지가 여전히 완벽하게 정렬되어 있음을 보여 준다. 오른쪽의 더 옅은 초록색 음영 영역은 5열과 6열만 span된 항목의 영향을 받았음을 보여 준다.

상단 표에서 span은 다음과 같다:

* 1열부터 5열까지: 하나의 $$400\text{pt}$$ rule;
* 3열부터 5열까지: 하나의 $$200\text{pt}$$ rule;
* 4열부터 6열까지: 하나의 $$250\text{pt}$$ rule.

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

다시 말해, 설명은 span된 열들의 연속 안에서는 마지막 열의 너비만(필요한 경우) 조정되고, 중간 열들은 영향을 받지 않는다는 것이다. 여기서는 그것이 1열부터 4열까지를 의미한다—물론, 1열부터 4열까지의 너비(그리고 중간에 있는 `\tabskip` glue)는 5열과 6열의 조정된 너비를 계산할 때 고려된다.

### 에 대한 단계별 설명 $$\mathrm\TeX$$의 알고리즘

마지막으로, 하나의 *간소화된* “에 대한 단계별 설명$$\mathrm\TeX$$’의 사고 과정을 따라가며, span된 항목에서 열의 너비를 계산하는 과정이다. 설명하는 $$\mathrm\TeX$$’의 알고리즘을 설명하는 것은 항상 간단하지 않으므로, 지금 일어나고 있는 일을 개괄적으로 보여 주기 위해 약간의 “단순화를 위한 예술적 재량”을 취하겠다. 모든 복잡한 세부 사항에 관심 있는 독자는 다음이 수록된 인쇄본의 801절(336쪽)을 참고하기 바란다. $$\mathrm\TeX$$의 원본 코드 [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

실제 표는 종종 다음을 많이 사용하여 만들어진다: `\span` 기본 원시어(예: 내부에서 $$\mathrm\LaTeX$$ 패키지) 표 안에 span된 열의 여러 인스턴스를 구성한다. 이를 관리하기 위해, (깊숙한 내부의) 데이터 구조는 $$\mathrm\TeX$$) *span 노드*)은 다음을 알려 준다: $$\mathrm\TeX$$ 표 항목/열 사이의 연결(span)에 관하여. 분명히, $$\mathrm\TeX$$ 는 알고리즘을 체계적으로 적용해야 하며, 최종 계산을 하기 위해 표 전체를 처리해야 한다—모든 열의 너비, 표의 전체 너비, 그리고 필요하다면 표에서 사용된 유연한 glue가 늘어나거나 줄어들어야 하는 양을 결정해야 한다. 따라서 다음이 그리 놀라운 일은 아니다: $$\mathrm\TeX$$ 가 다음을 완전히 처리하기 전까지는 최종 표 너비를 알려 줄 수 없다: `\halign{...}` 명령—정말 할 일이 많다!

열 너비 계산의 시작점은 1열이다. 물론 아무것도 (그리고 *가로질러/안으로*) 1열로 span할 수 없기 때문이다. $$\mathrm\TeX$$ 는 최대값을 가지는 항목이 무엇인지 판별하여 1열의 너비를 먼저 결정한다. *자연 너비*그 최대 너비를 $$w\_1$$그리고 1열에서 2열까지 span하는 항목이 있다면, 그 항목의 너비를 $$w\_{12}$$ (1에서 2까지의 너비)라고 하자. 또한 다음을 `\tabskip` 1열과 2열 사이의 glue를 $$t\_{1}$$—여기서 우리는 오직 다음만 고려하고 있다는 점에 주의하자: *자연 너비* 그것의 `\tabskip` glue이며, 일단 그 안에 있을 수 있는 늘어남이나 줄어듦 요소는 무시한다. 또한 2열의 모든 비span 항목의 최대 자연 너비를 $$w\_2$$.

주목해야 할 핵심은 $$\mathrm\TeX$$ 는 span이 있는 항목만 고려하여 2열의 너비를 계산하려 한다는 점이다. *시작합니다* 1열과 함께 시작하고 *끝나며* 2열에서 끝난다. 에 대한 핵심 고려 사항은 $$\mathrm\TeX$$ 다음 테스트이다 $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—1열과 2열을 span하는 항목이 여러 개 있을 수 있다: 어떤 것은 좁을 수 있고(작은 $$w\_{12}$$), 다른 것은 매우 넓을 수 있다(큰 $$w\_{12}$$) 그래서 $$\mathrm\TeX$$ 는 가장 큰 영향을 미치는 것을 찾고 있다(따라서 $$\max(\text{...})$$). 여기서 다음의 값은 $$w\_{12} -(w\_1+ t\_1)$$ 는 1열과 2열을 span하는 항목이 1열에서 2열로 “넘쳐 들어가는” 양이다: 다음에 유의하자 $$\mathrm\TeX$$ 는 1열의 너비를 사용하고 있다 **및** 다음 `\tabskip` 간격(glue)($$t\_{1}$$) 1열과 2열 사이에서. 일단 $$\mathrm\TeX$$ 가 1열에서 2열로의 어떤 span이 2열의 너비에 영향을 미치는지 판별하면, (설명한 테스트를 사용하여) 판별한 최대값으로 2열의 너비를 설정한다. $$\mathrm\TeX$$ 는 다른 모든 열을 계속 훑어가며 유사한 테스트를 수행한다.

그리고 마지막으로, 완전성을 위해 여기서는 다음의 요지를 인용한다: $$\mathrm\TeX$$의 열 너비 계산 알고리즘(Knuth의 소스 코드 문서에서 가져온) $$\mathrm\TeX$$):

다음이 되도록 하자 $$w\_{ij}$$ 을 span하는 모든 항목의 자연 너비의 최댓값을 $$i$$ 부터 $$j$$까지, 양끝 포함으로 한다. 최종 열 너비는 다음 공식으로 정의된다:

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

여기서 $$t\_k$$ 는 열 사이의 tabskip glue의 자연 너비이다 $$k$$ 및 $$k+1$$.

## 콜로폰: Overleaf를 사용해 표를 SVG 그래픽으로 만들기

모든 $$\mathrm\TeX$$ 이 글에 제시된 표는 모두 Overleaf 플랫폼에서 생성한 SVG(Scalable Vector Graphics) 파일이다. 주석(화살표와 초록색 상자)은 SVG 그래픽을 Inkscape에서 열어 추가했다—그러나 주석의 텍스트는 다음에서 조판되었다는 점에 유의하자: $$\mathrm\TeX$$ 를 표에 덧붙이는 추가 텍스트로 사용했다: Inkscape에서 추가한 것은 화살표와 초록색 배경뿐이었다. 이것이 어떻게 이루어졌는지 궁금하다면 계속 읽어 보라.

Overleaf의 서버는 다음을 사용한다: $$\mathrm\TeX \text{ Live}$$ 배포판으로, 다음 외에도 $$\mathrm\TeX$$-기반 조판 엔진 외에도 매우 유용한 $$\mathrm\TeX$$-관련 소프트웨어 도구와 유틸리티를 풍부하게 제공한다. 그중 하나는 다음과 같은 것이다: [`dvisvgm`](https://dvisvgm.de) 이름에서 알 수 있듯이, 다음을 변환한다: $$\mathrm\TeX$$의 전통적인 DVI (**D**e**V**ice **I**ndependent) 출력 파일 형식을 SVG로 바꾼다. 그 많은 [명령행 옵션들 가운데](https://dvisvgm.de/Manpage/) `dvisvgm` 다음 옵션을 제공한다 (`-n` 또는 `--no-fonts`)은 모든 텍스트를 다음으로 변환하도록 지시한다: *경로* 즉, SVG 그래픽의 텍스트가 실제 글꼴과 글리프가 아니라 선과 곡선을 사용해 그려진다는 뜻이다. 이는 결과 SVG 그래픽의 파일 크기를 늘릴 수 있지만, 매우 휴대성이 높고 거의 모든 기기에서 잘 작동하도록 보장한다.

### 그래서... 어떻게 한 걸까?

이 [이전 글에서](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) 나는 다음을 사용해 $$\text{Lua}\mathrm\TeX$$ Overleaf 서버에 설치된 다양한 소프트웨어 도구와 유틸리티를 실행하는 방법을 설명했다—이는 매우 쉽고 편리한 기법이다. 그 기법은 조판된 다음의 SVG 그래픽을 생성하는 데 사용되었다: $$\mathrm\TeX$$ 표는 다음과 같다. 메인 $$\mathrm\TeX$$ 문서 파일에서, 각 표를 조판하는 코드(using using `\halign`)을 사용해 만든)가 다음에 기록되었다: `.tex` 파일. 이는 표 코드를 내가 다음이라고 부른 명령 쌍 안에 넣음으로써 이루어졌다: `\beginscoop` 및 `\endscoop`. 원하는 결과를 얻는 다른 많은 방법이 있을 테지만, 내가 사용한 매크로 정의는 다음과 같다:

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

이것들을 다음과 같이 사용한다:

```latex
\beginscoop
\halign{...}
\endscoop
```

다음에 유의하세요 `\endscoop` token은 단지 다음의 매개변수를 구분하는 역할만 한다: `\scoop` 매크로: $$\mathrm\TeX$$ 실질적으로 다음을 버린다: `\endscoop` token이므로 실제로는 이를 정의할 필요가 없다(예: `\def\endscoop{...}`).

다음 $$\mathrm\TeX$$ 다음에 들어 있는 코드가 `\halign{...}` 다음에 저장된다: `toks` 라는 이름의 레지스터에 `\fulltoks`. 내가 마주친 까다로운 점 하나는( $$\text{Lua}\mathrm\TeX$$) 다음을 방지해야 했다는 것이다: `#` 다음 내부의 문자들이 `\halign{...}` 프리앰블에서 “두 배로” 다음이 되는 것을 `##` 파일에 기록될 때 `.tex` 파일. 이를 피하기 위해 나는 일시적으로 다음을 설정해야 했다: `\catcode`의 `#` 문자 코드를 12로, 저장하기 전에 $$\mathrm\TeX$$ 코드(token)를 다음의 `\fulltoks` 토큰 레지스터에 저장했다.

다음 단계는 다음에 들어 있는 토큰을 기록하는 것이다: `\fulltoks` 다음으로 $$\mathrm\TeX$$ 파일에—나는 $$\text{Lua}\mathrm\TeX$$ 이것은 다음 덕분에 *매우* 쉽게 가능했다: $$\text{Lua}\mathrm\TeX$$의 훌륭한 Lua API. 간단히 말해, 나는 다음이라는 매크로를 작성했다: `\writefile{...}` 이 매개변수로는 파일로 기록하려는 토큰을 담고 있는 토큰 레지스터의 이름을 받는다(예: `\writefile{fulltoks}`). 다음의 내부에서 `\writefile{...}` 매크로에서 나는 Lua API를 사용해 다음의 텍스트 표현을 얻었다: `\fulltoks` 토큰 레지스터:

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

여기에 다음의 일부를 조금 더 보여 주는 스크린샷이 있다: `\writefile{...}` 명령:

[![{{{alt}}}](/files/0f57fddfe71b33b29eb8b275a935f8b1f9e1506e)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Lua 언어와 다음이 제공하는 Lua API는 $$\text{Lua}\mathrm\TeX$$ 종종 다음을 단순화할 수 있다: $$\mathrm\TeX$$ 프로그래밍 작업이며, 바로 이러한 유용하고 강력한 기능들 때문에 나는 다음을 사용해 왔다: $$\text{Lua}\mathrm\TeX$$ \~2009년부터—그리고 이 진정으로 놀라운 다음의 열렬한 팬으로 남아 있다: $$\mathrm\TeX$$ 엔진이다. 좋다, 다음 광고는 $$\text{Lua}\mathrm\TeX$$ 이제 끝난다.

그렇게 쉽게 다음을 얻은 뒤, $$\mathrm\TeX$$ 다음에 저장된 코드를 `\fulltoks` 올바른 형식의 다음이 되도록 약간의 추가 코드와 함께 파일로 기록된다: $$\mathrm\LaTeX$$ 파일. 다음 단계는 다음과 같다:

1. 다음을 처리한다: `.tex` 우리의 표가 들어 있는 파일을 다음으로 $$\text{pdf}\mathrm\LaTeX$$ (DVI 모드에서) 처리하여 표를 조판하고 다음을 생성한다: `.dvi` 다음이 처리할 파일을 `dvisvgm` 처리하도록. 그렇다, 다음을 사용할 수 있다: $$\text{Lua}\mathrm\TeX$$ 를 실행하기 위해 $$\text{pdf}\mathrm\LaTeX$$—다시 한 번, 나는 다음에서 논의한 방법을 사용했다: [이전 글에서](/latex/ko/in-depth-articles/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. 그리고 마지막으로, 다음을 실행하여 `dvisvgm` 다음을 처리한다: `.dvi` 파일을 처리해 조판된 다음의 SVG 그래픽을 생성한다: $$\mathrm\TeX$$ 표.
3. 실제 SVG 그래픽을 얻으려면 Overleaf에서 ZIP 파일을 내려받을 수 있다—반드시 다음을 선택하자: **입력 및 출력 파일** 옵션을 찾습니다.


---

# 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/47-tex-tables-how-tex-calculates-spanned-column-widths.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.
