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

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

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

## TeX 엔진은 표를 정렬이라고 부른다

수정된 [TeX 소스 코드 문서](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth는 TeX의 “표를 조판하는” 능력에 대해 논의하지 않고, 대신 TeX의 이른바 *정렬*. TeX의 표 조판은 본질적으로 자동 박스 정렬 과정이다: 박스(표 셀, 행, 열)를 배열하여 보기 좋은 직사각형 격자나 배열을 이루는 것—물론 TeX답게, 그 과정에는 *많은* 미묘한 차이들이 있다.

“정렬”이라는 용어는 모든 TeX 엔진에 내장된 두 표 조판 명령의 이름에도 반영되어 있다:

* `\halign` (수평 정렬), 그리고
* `\valign` (수직 정렬).

이 글 시리즈 전반에서 두 명령을 모두 살펴볼 것이며, 우선 이 시리즈의 후반부에 나올 더 심화된 글들을 위한 기초로서, 형식/구조에 대한 좀 더 형식적인 개요부터 시작한다. `\halign` 및 `\valign` 명령들에 대한 기초를 마련하기 위해 설명한다.

### TeX의 표는 박스와 간격

개별 표 셀에는 일반적으로 텍스트 줄, 수학식, 그래픽 등 다양한 내용이 들어가며, 그 결과 조판된 재료의 너비, 높이, 깊이가 서로 다른 표 셀들의 집합이 만들어진다. TeX은 이렇게 내용 차원이 제각각인 셀들을 바탕으로, 각 행은 일정한 높이를, 각 열은 특정한 너비를 갖는 최종 표를 구성해야 한다. TeX은 크기가 다른 표 셀들의 집합으로부터 각 행의 높이와 각 열의 너비에 대한 적절한 값을 추론해야 한다.

하지만 TeX은 그 내용이 조판되기 전까지는 각 셀 내용의 실제 크기를 알 수 없다. 따라서 TeX은 전체 표를 훑으며 각 셀을 조판해 표 레이아웃을 완성하는 데 필요한 크기 데이터를 얻는다. 그 크기 데이터로부터 TeX은 각 행의 올바른 높이와 각 열의 너비를 결정할 수 있다. 또한 TeX은 빈 셀이나 사용자가 여러 열 또는 여러 행에 걸쳐 배치하고자 하는 셀을 만날 수 있으며, TeX은 이 모든 것을 계산에 신중히 반영해야 한다. 이렇게 서로 다른 셀(박스) 크기 데이터들을 “필터링”한 뒤에야 비로소 TeX은 ...의 열 너비 최종값을 결정할 수 있다 `\halign`, 또는 행 높이를 `\valign` 결정하고 그 값을 표 레이아웃 알고리즘의 마지막 단계에서 사용한다.

실제로, 그리고 “내부적으로” TeX의 표 조판은 여러 단계로 이루어진다. 개요를 말하자면, TeX은 먼저 셀 크기 데이터와 표에서 사용된 ...에 대한 데이터를 수집하고 처리하는 동안 표의 “초안” 또는 “불완전한” 버전을 조판한다. `\span` 마지막 단계에서 TeX은 그 “불완전한” 버전의 표를 다시 처리하여 ...을 확정한다 `\halign` 열 너비 또는 `\valign` 행 높이를 확정하고 완성된 레이아웃을 이룬다—이 모든 것은 이 글 시리즈에서 살펴볼 것이다.

## \halign과 \valign: 표를 구성하는 두 가지 방법

모든 TeX 엔진은 표(정렬) 조판을 위해 설계된 두 *내장된* 명령(프리미티브)을 제공한다: `\halign` 및 `\valign`, 이들은 많은 핵심 기능을 공유하지만 어떤 근본적인 점에서는 다르다. 다음의 핵심 차이점은 `\halign` 및 `\valign` 각각의 표를 어떻게 구성하느냐에 있다: 행 단위인가 열 단위인가:

* `\halign`: 행 단위로 표를 조판하여 개별 행을 만들고, 이를 세로로 쌓아 표의 열을 이룬다
* `\valign`: 열 단위로 표를 조판하여 개별 열을 만들고, 이를 가로로 쌓아 표의 행을 이룬다

### \halign

다음 도표는 `\halign`으로 만들어진 표의 구성을 보여준다. 이 표는 개별 행을 세로로 쌓는 방식으로 행 단위 조판된다. 그 결과로는 다음과 같은 점이 있다:

* 표의 열은 표 행을 세로로 쌓아 만들어진다
* 페이지 나누기는 표 행 사이에서 일어날 수 있다
* 비표 형식의 내용은 행 사이에 삽입될 수 있다 (via `\nolign`, 나중에 살펴볼 것이다)

![](/files/4cd8161c27b0dba9adb5a0686221150ef620eb63)

### \valign

다음 도표는 `\valign`. 이 표는 개별 열을 가로로(나란히) 쌓는 방식으로 열 단위 조판된다. 그 결과로는 다음과 같은 점이 있다:

* 표의 행은 표 열을 가로로 쌓아 만들어진다
* 줄 나누기는 표 열 사이에서 일어날 수 있다
* 비표 형식의 내용은 열 사이에 삽입될 수 있다 (via `\noalign`, 나중에 살펴볼 것이다)

![](/files/8730f91aa480e86e80445b1daa0499911a8b0564)

### 예시

다음 예제는 \halign과 \valign의 행 *대*열 접근 방식을 강조하기 위한 것이다.

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% 박스 테두리를 딱 맞게
\setlength{\fboxsep}{0pt}

여기 \verb|\valign| 표가 있다:
\begingroup
% \hsize가 \valign을 제어한다
% 열 너비도. 또한
% \parindent를 더 작은 값으로 설정한다
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % 서문: 나중에 다룰 것이다(상세히!)
A&B&C\cr % 이 \valign 표의 첫 번째 열
D&E&F\cr
G&H&I\cr
}}
\endgroup

% 참고: 나중에 설명하겠지만
% \halign은 \vbox 안에 넣어야 한다
여기 \verb|\halign| 표가 있다: \fbox{%
\vbox{\halign{
#&#&#\cr % 서문: 나중에 다룰 것이다(상세히!)
A&B&C\cr % 이 \halign 표의 첫 번째 행
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다: ![](/files/1500a35cd620b1474ab3cfd2a00292f829bc26f2)

다음 그래픽은 위 코드로 생성된 표의 주석 달린 버전을 보여준다. 이 글 시리즈의 후반부에서는 다음과 같은 주제를 다룰 것이다:

* 표 프리앰블이란 무엇인가?
* 왜 `\hsize` 및 `\parindent` 에는 `\valign` 표를 설정하는가?

현재로서는, `\halign` *대*. `\valign` 표 구성의 행 대 열 접근 방식만 확인하자:

![](/files/fe73b0a1d2d0e1cf1ff30311474a5f5cc5e5e8f0)

## \halign과 \valign의 일반 형식

우선 \halign과 \valign의 기본 속성과 일반 형식을 살펴보고 `\halign` 및 `\valign` 아직은 실제 세부 사항까지는 들어가지 않겠다. [앞서 언급했듯이](#intro), 우리는 `\halign` 및 `\valign` 명령의 형식/구조를 약간 형식적으로 개관하여 이 시리즈의 후속 글들을 위한 기초를 마련한다.

가장 일반적인 형식의 `\halign` 및 `\valign` 명령은 다음과 같이 쓸 수 있다:

`\halign` $$\langle$$⁠`선택 사양`⁠$$\rangle$$ { $$\langle$$⁠`프리앰블`⁠$$\rangle$$ $$\langle$$⁠`본문`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`선택 사양`⁠$$\rangle$$ { $$\langle$$⁠`프리앰블`⁠$$\rangle$$ $$\langle$$⁠`본문`⁠$$\rangle$$ }

보시다시피, 두 `\halign` 및 `\valign` 는 세 개의 주요 섹션으로 구성된다:

* [$$\langle$$⁠`선택 사양`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`프리앰블`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`본문`⁠$$\rangle$$](#body)

## 다음 $$\langle$$⁠선택 사양⁠$$\rangle$$

표의 기본 크기/범위, 이른바 “자연 크기”는 그 내용에 의해 결정된다—정확히 말하면, 크기/범위란

* 다음 *너비* 로 생성된 표의 `\halign`, 또는
* 다음 *높이* 로 생성된 표의 `\valign`

다음 중 하나: $$\langle$$⁠`선택 사양`⁠$$\rangle$$ 는 표의 자연 크기를 “재정의”하는 데 사용할 수 있으며, 다음 두 가지 형식 중 하나를 취한다:

* **`을`** $$\langle$$**⁠`차원`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`차원`⁠**$$\rangle$$

여기서

* $$\langle$$**⁠`차원`⁠**$$\rangle$$ 은 TeX이 이해하는 단위, 예를 들어 pt, mm 또는 cm로 주어진 길이이다—이 길이는 적절한 단위로 지정된 값으로 확장되는 명령으로도 지정할 수 있다;
* **`을`** 및 **`spread`** 는 자연 크기 “재정의”의 유형을 지정하는 TeX 키워드이다:
  * **`을`**: 표의 크기를 지정된 $$\langle$$⁠`차원`⁠$$\rangle$$ 값으로 설정됩니다
  * **`spread`**: 지정된 $$\langle$$⁠`차원`⁠$$\rangle$$ 값을 표의 자연 크기에 더한다

의 효과는 $$\langle$$⁠`선택 사양`⁠$$\rangle$$ 조판 중인 표의 유형에 따라 달라진다: 이는 ...을 조정한다 `\halign` 표의 자연 *너비*, 또는 `\valign` 표의 자연 *높이*.

여기에 몇 가지 예가 있다:

* `\halign **to 100pt**{...}`: 표의 너비를 `\halign` 100pt로 설정한다 `100pt`
* `\valign **to 50pt**{...}`: 표의 너비를 `\valign` 표의 높이를 `30pt로`
* `\halign **spread 30pt**{...}`: 30pt를 `\halign` 표의 자연 너비에 더한다. 반대로 **spread -30pt** 를 쓰면 표의 너비가 30pt 줄어든다.
* `\valign **spread 20pt**{...}`: 20pt를 `\valign` 표의 자연 높이에 더한다. 반대로 **spread -20pt** 를 쓰면 표의 높이가 20pt 줄어든다.

다음 코드는 위의 표 예제를 재사용하지만, $$\langle$$⁠`선택 사양`⁠$$\rangle$$ 를 `\valign` 및 `\halign` 표에 적용한다:

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% 박스 테두리를 딱 맞게
\setlength{\fboxsep}{0pt}

여기 \verb|\valign| 표가 있다:
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

여기 \verb|\halign| 표가 있다:
\fbox{%
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

이 예제는 아래에 보이는 출력을 만든다:

![](/files/662a8f7011d28fe514827027893d2a43f107dc54)

—하지만 두 표의 내용이 “뭉쳐 있는” 듯 보인다는 점에 주목하자. 그 이유는 TeX이 추가 공간을 채우기 위해 내용을 늘리는 데 사용할 수 있는 유연한 간격(glue)이 없기 때문이다 **`을`** $$\langle$$**⁠`차원`⁠**$$\rangle$$. 여기서는 `\tabskip` 명령을 사용해.

#### \tabskip 명령에 대한 간단한 소개로 건너뛰어 보자

표 레이아웃의 미관상 행이나 열 사이의 간격을 조정할 필요가 있을 수 있으므로, TeX 엔진이 `\tabskip` 라는 명령을 제공하는 것은 놀라운 일이 아니다. `\tabskip` 은 TeX이 `\halign` 의 열들 사이에 두는 유연한 공간(“glue”)의 양을 설정(및 변경)하는 데 사용된다 `\valign`이나 `\tabskip` 의 행들 사이에. 후속 글에서

을 더 자세히 살펴볼 것이다. `\tabskip` 에 대한 설정을 사용한다 `\valign` 이는 TeX이 $$\langle$$⁠`선택 사양`⁠$$\rangle$$ 의 **`표의 행들 사이에 어느 정도(매우) 유연한 공간을 삽입하게 한다. 그 유연한 공간 덕분에 표 행들이 벌어져`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
여기 \verb|\valign| 표가 있다:
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

아래는 같은 \verb|\valign| 표이지만 ``\texttt{to 50pt}''라는 \optspec{}을 사용한 것이다. 행 사이에 사용할 수 있는 ``늘어날 수 있는 글루''가 없기 때문에 행들이 ``꽉 모여'' 있는 모습을 주목하자:

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

이제 ``\texttt{to 50pt}''라는 \optspec{}을 가진 \verb|\valign| 표를 사용하되, \verb|\tabskip| 명령을 통해 ``유연한 간격''을 제공하자. 여기서 \verb|\tabskip|은 \verb|\valign|의 행들이 ``늘어나'' 남는 추가 공간을 채울 수 있도록 충분한 ``글루''를 제공하고 있다. 아래는 ``늘어난'' \verb|\valign| 표이다:

\tabskip=0pt plus1fil % 이것은 \tabskip을 매우 유연한 글루로 설정한다
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/89c8f4fd609982b3a030480dd8e50424a457ac98)

## 표 프리앰블 소개 $$\langle$$⁠프리앰블⁠$$\rangle$$ 및 $$\langle$$⁠본문⁠$$\rangle$$

이 절에서는 표 $$\langle$$⁠`프리앰블`⁠$$\rangle$$, 그리고 *를 간략히 소개하고* 표 $$\langle$$⁠`본문`⁠$$\rangle$$ 를 간단히 살피며 [이후 더 자세히 다룬다](#bodydetails).

이 시리즈의 후속 글에서는 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 및 $$\langle$$⁠`본문`⁠$$\rangle$$ 를 더 자세히 살펴볼 것이며, 특히 TeX이 표 $$\langle$$⁠`프리앰블`⁠$$\rangle$$.

의 가장 일반적인 형식은 앞서 언급했듯이 `\halign` 또는 `\valign` 표는 다음과 같이 쓸 수 있다:

`\halign` $$\langle$$⁠`선택 사양`⁠$$\rangle$$ { $$\langle$$⁠`프리앰블`⁠$$\rangle$$ $$\langle$$⁠`본문`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`선택 사양`⁠$$\rangle$$ { $$\langle$$⁠`프리앰블`⁠$$\rangle$$ $$\langle$$⁠`본문`⁠$$\rangle$$ }

### 다음 $$\langle$$⁠프리앰블⁠$$\rangle$$

다음 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 절에는 하나의 $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$ 의 22페이지에서 재현한 것입니다 *로 끝난* 다음의 `\cr` 명령에 의해; 따라서 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 는 다음과 같이 다시 쓸 수 있다:

$$\langle$$⁠`프리앰블`⁠$$\rangle$$=$$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$**`\cr`**

### 다음 $$\langle$$⁠본문⁠$$\rangle$$

마찬가지로, $$\langle$$⁠본문⁠$$\rangle$$ 절은 하나 이상의 구성 요소 “줄”로 더 세분할 수 있지만, 여기서는 각 줄에 대해 두 가지 선택지가 있다:

* 한 줄은 `\halign` 행 또는 `\valign` 열을 이루는 셀 집합으로 구성되거나; 또는
* 하나의 `\noalign` 명령으로, `\halign`의 행들 사이 또는 `\valign`의 열들 사이에 내용을 “주입”한다.

현재로서는 `\noalign` 명령은 무시하자 ( [나중에 글에서](#noalign)) 그리고 $$\langle$$⁠본문⁠$$\rangle$$ 의 각 줄이 셀 집합에 대한 데이터라고 가정하자 *로 끝난* 는 `\cr` 명령을 사용해.

에 의해 `\noalign`에서 관찰했듯이, $$\langle$$⁠`본문`⁠$$\rangle$$ 절은 사용자의 내용을 나타내며, 일련의 줄로 이루어지는데, 우리는 각 줄을 $$\langle$$⁠`본문 줄`⁠$$\rangle$$ 이라고 부를 것이다 *로 끝난* 그에 딸린 `\cr` 명령을 사용해.

다음 $$\langle$$⁠`본문`⁠$$\rangle$$ 는 다음과 같이 다시 쓸 수 있다:

$$\langle$$⁠본문 줄⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠본문 줄⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr

이를 합치면, 우리는 `\halign` 및 `\valign` 다음과 같이

`\halign` $$\langle$$⁠`선택 사양`⁠$$\rangle$$ { $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠본문 줄⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`선택 사양`⁠$$\rangle$$ { $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠본문 줄⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

후속 글들에서 다룰 이유들로 인해 $$\langle$$⁠`프리앰블`⁠$$\rangle$$, 단 하나의 $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$조차도, 표의 다른 모든 줄과는 다른 형식을 갖는다 $$\langle$$⁠`본문`⁠$$\rangle$$. 또한 우리는 [다시 살펴볼 것이다 `\noalign` 명령을 사용합니다](#noalign) 표 안에서도 사용할 수 있는 $$\langle$$⁠`본문`⁠$$\rangle$$.

### 다음 $$\langle$$⁠프리앰블 줄⁠$$\rangle$$

다음 $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$ 은 *핵심적인* 역할을 한다. 표의 내용을 조판하는 데 쓰이는 일종의 “청사진”을 제공하기 때문이다—`\halign` 행 또는 `\valign` 열—로 구성된 표 안의 $$\langle$$⁠`본문`⁠$$\rangle$$. 다음 $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$ 셀 “템플릿”도 포함할 수 있으며, 이는 `\halign` 의 행이나 `\valign`의 열을 구성하는 데 쓰인다—이 주제는 자세히 살펴볼 것이다.

의 목적은 두 가지다: $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$ 은

* 를 결정하고 *최대* 행당 셀 수를 `\halign` 또는 `\valign`.
* 열당 셀 수를 *셀 템플릿* 을 저장한다 $$\langle$$⁠`본문`⁠$$\rangle$$이는 표 안의 셀들에서 서식 지정이나 내용 삽입을 자동화하는 데 사용할 수 있다. 셀 템플릿은 선택 사항이며 비워 둘 수도 있고, TeX이 특정 셀의 실제 내용 앞 및/또는 뒤에 자동으로 삽입할 문자나 명령을 포함할 수도 있다. 그러면 그런 문자나 명령을 적용할 모든 셀에 일일이 직접 써 넣어야 하는 번거로움을 덜 수 있다.

**참고**: 한 `\halign` 행 또는 `\valign` 열에는 최대값으로 지정된 셀 수보다 적은 셀을 포함할 수는 있지만 $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$ 프리앰블이 지정한 최대값보다 적은 수의 셀을 포함할 수는 있지만 *순환* 프리앰블.

구조 도표를 계속 보면 $$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$ 에는

* 하나의 `\halign` 최대 $$\mathrm{K}$$ 셀을 가진 *행*, 또는
* 하나의 `\valign` 최대 $$\mathrm{K}$$ 셀을 가진 *열당*

표는 다음과 같이 쓸 수 있다:

$$\langle$$⁠템플릿⁠$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠템플릿⁠$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠템플릿⁠$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠템플릿⁠$${}*\mathrm{K}$$⁠$$\rangle$$

여기서 `&` 은 *정렬 탭 문자* 이는 한 셀의 끝과 다음 셀의 시작을 나타낸다. 전통적으로 앰퍼샌드 문자(`&`)가 정렬 탭으로 사용되지만 [범주 코드](/latex/ko/more-topics/43-table-of-tex-category-codes.md) 4의 카테고리 코드를 가진 문자라면 무엇이든 대신 사용할 수 있다.

다시 상기하면, $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 는 다음과 같이 쓸 수 있다 $$\langle$$⁠`프리앰블`⁠$$\rangle$$=$$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$**`\cr`**, 또는 동등하게

$$\langle$$⁠`프리앰블`⁠$$\rangle$$=$$\langle$$⁠템플릿⁠$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠템플릿⁠$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠템플릿⁠$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠템플릿⁠$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### 각 셀의 구조 $$\langle$$⁠템플릿⁠$$\rangle$$

각 셀 $$\langle$$⁠템플릿⁠$${}\_i$$⁠$$\rangle$$ 표는 다음과 같이 쓸 수 있다:

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 여기서:

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ 은 TeX이 자동으로 삽입할 문자 또는 명령(토큰)의 집합이다 *이전의* 셀에 대한 사용자가 제공한 내용 $$i$$;
* $$\texttt{#}$$ 은 셀에 사용자가 제공한 내용이 들어갈 위치를 보여 주는 자리 표시자이다 $$i$$. 다시 말해 `#` 문자는 단지 *전통적 표기일 뿐이다*, [범주 코드](/latex/ko/more-topics/43-table-of-tex-category-codes.md) 6의 카테고리 코드를 가진 문자라면 무엇이든 대신 사용할 수 있다. 카테고리 코드 6은 매크로 매개변수에 사용된다는 점에 유의하라;
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 은 TeX이 자동으로 삽입할 문자 또는 명령(토큰)의 집합이다 *뒤에* 셀에 대한 사용자가 제공한 내용 $$i$$.

모든 $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ 및 $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 는 *선택적*: 셀 내용 앞이나 뒤에 어떤 문자나 명령도 사용할 필요가 없다.

**완성하기** $$\langle$$**⁠프리앰블⁠**$$\rangle$$

마지막으로, 위의 표기법을 사용하면 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 에는

* 하나의 `\halign` 최대 $$\mathrm{K}$$ 셀을 가진 *행*, 또는
* 하나의 `\valign` 최대 $$\mathrm{K}$$ 셀을 가진 *열당*

표는 다음과 같이 쓸 수 있다:

$$\langle$$⁠`프리앰블`⁠$$\rangle$$=$$\langle$$⁠`프리앰블 줄이`⁠$$\rangle$$`**\cr**`

또는

$$\langle$$⁠`프리앰블`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**다음** $$\langle$$**⁠프리앰블⁠**$$\rangle$$ **와 행 및 열의 개수 세기를 통해**

다음 중 하나: **`\halign`** 하나의 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 를 지정하는 $$\mathrm{K}$$ 셀과 하나의 $$\langle$$⁠`본문`⁠$$\rangle$$ 를 포함하는 $$\mathrm{N}$$ $$\langle$$⁠`본문 줄`⁠$$\rangle$$ 은 다음과 같은 표를 생성한다 $$\mathrm{K}$$ *열* 및 $$\mathrm{N}$$ *행*, 아래 도표에 보이는 것처럼:

![](/files/4136f0fec50cfb3c9bc715091bd0d2f0951dc2c6)

하나의 **`\valign`** 하나의 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 를 지정하는 $$\mathrm{K}$$ 셀과 하나의 $$\langle$$⁠`본문`⁠$$\rangle$$ 를 포함하는 $$\mathrm{N}$$ $$\langle$$⁠`본문 줄`⁠$$\rangle$$ 은 다음과 같은 표를 생성한다 $$\mathrm{K}$$ *행* 및 $$\mathrm{N}$$ *열*, 아래 도표에 보이는 것처럼:

![](/files/680865d39337a233c9a092b34e25897645fdd14e)

### 이제 이론은 충분하니, 예제를 보자!

나중에 자세히 보겠지만, TeX이 표의 내용을 처리할 때—즉 [$$\langle$$⁠`본문`⁠$$\rangle$$](#body)본문에 포함된 표 셀들을 처리할 때— $$\langle$$⁠`프리앰블`⁠$$\rangle$$셀 템플릿의 존재를 확인한다. 셀 템플릿은 프리앰블에 정의되어 있는데, TeX이 사용자의 내용 앞 및/또는 뒤에 삽입할 템플릿 토큰을 찾고 있기 때문이다. 다음의 최소한의 예제들은 셀 템플릿의 사용 $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 을 보여준다 `\halign` 및 `\valign` 표.

#### 셀 템플릿을 사용하는 \halign 표

다음 예제는 `\halign` 표가 각 행의 첫 번째 셀 내용 주위에 자동으로 큰따옴표를 삽입하는 셀 템플릿을 사용하는 모습을 보여준다: 즉, 첫 번째 열의 모든 셀에 영향을 주는 템플릿이다:

```latex
\documentclass{article}
\usepackage{parskip} % \parindent를 0pt로 설정
% 편의상 작은 페이지 크기를 선택
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % \halign의 열 간격을 넓힌다
\begin{document}
\pagestyle{empty}

여기 셀 템플릿이 \textit{없는} \verb|\halign| 표가 있다:

\halign{
% <preamble>에서 각 '#' 앞뒤에는 아무것도 없다
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

아래는 같은 \verb|\halign| 표이지만 각 행의 첫 번째 셀에 큰따옴표가 자동으로 추가된다; 즉, 첫 번째 열의 모든 셀에 영향을 준다:

\halign{
% 프리앰블의 큰따옴표 템플릿:
``#''&#&#\cr % 첫 번째 # 앞뒤에 큰따옴표 표시
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/0d4271c565a7ae79b658cfbc6ebd3549ec1c278c)

다음 그래픽은 위 예제로 생성된 `\halign` 표의 주석 달린 버전이다. 여기서는 세 셀로 이루어진 $$\langle$$⁠`프리앰블`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

의 “형식적” 구조를 실제 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 의 ` ``#''&#&#**\cr** `와 비교하여 셀 템플릿의 존재 여부 또는 부재를 강조한다:

![](/files/fab3cc486ffa41aa6d43bd60dc36184adaf58679)

#### 셀 템플릿을 사용하는 \valign 표

다음 예제는 `\valign` 표가 각 셀마다 템플릿을 사용하여 사용자의 내용 양옆에 숫자를 자동으로 삽입하는 모습을 보여준다.

```latex
\documentclass{article}
\usepackage{parskip} % \parindent를 0pt로 설정
% 편의상 작은 페이지 크기를 선택
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % \valign의 행 간격을 넓힌다
\begin{document}
\pagestyle{empty}

여기 셀 템플릿이 \textit{없는} \verb|\valign| 표가 있다:

\begingroup
\hsize=25pt
\valign{
% 각 '#' 앞뒤에는 아무것도 없다
% <preamble>에서
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

아래는 같은 \verb|\valign| 표이지만 셀 템플릿을 사용하여 모든 셀에 숫자를 자동으로 삽입한다:

\begingroup
\hsize=25pt
\valign{
% 각 '#' 앞뒤에 숫자를 삽입
% <preamble>에서
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/964a5e07667f5c354671416432aa4cd11f70866a)

다음 그래픽은 위 예제로 생성된 `\valign` 표의 주석 달린 버전이다. 여기서는 세 셀로 이루어진 $$\langle$$⁠`프리앰블`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

의 “형식적” 구조를 실제 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 의 `1#2&3#4&5#6**\cr**`, 셀 템플릿의 사용을 강조한다 $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/337694cf8ef00979894060df33a1cdb0b6bd3aa2)

셀 $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$)에 대한 템플릿이 $$i$$각 `\valign` 번째 $$i$$번째 *행* 의 모든 셀이 영향을 받게 된다.

#### 셀 템플릿을 이용한 텍스트 스타일링

다음 예제는 각 행 또는 열에 포함된 텍스트의 스타일을 지정하기 위해 다음 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ (셀 템플릿)을 사용한다:

`\textbf{#}&\textit{#}&\texttt{#}\cr`

이 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 를 세 셀로 이루어진 우리의 “형식적” 구조와 비교해 보면 $$\langle$$⁠`프리앰블`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

다음과 같이 볼 수 있습니다:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

이러한 셀 템플릿이, 예를 들어 `\textbf{#}` 단일 매개변수(셀 내용)를 가진 매크로와 비슷하다는 점에 주목하세요.

```latex
\verb|\valign| 테이블에서 셀 템플릿을 사용해 스타일링한 텍스트:

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

\verb|\halign| 테이블에서 셀 템플릿을 사용해 스타일링한 텍스트:

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/d1a74678dd1999145d287e6993646e21ea6c471f)

## 테이블에 대한 자세한 내용 $$\langle$$⁠본문⁠$$\rangle$$

섹션 [표 프리앰블 소개 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 및 $$\langle$$⁠`본문`⁠$$\rangle$$](#preamble) 에서, 잠시 무시하면 `\noalign`에서 관찰했듯이, $$\langle$$⁠`본문`⁠$$\rangle$$ 의 `\halign` 또는 `\valign` 테이블은 여러 줄로 구성되며, 각 줄은 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$다음으로 끝납니다:

* 각 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$ 다음으로 끝납니다 `\cr` 명령을 사용합니다
* 각 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$ 의 `\halign` 는 테이블 행
* 각 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$ 의 `\valign` 는 테이블 열

줄의 순서 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$여기서 $$j=1\ldots\mathrm{N}$$를 생성합니다 $$\mathrm{N}$$ 의 행 `\halign` 또는 $$\mathrm{N}$$ 의 열을 위한 `\valign`. 아래 다이어그램에 요약된 바와 같이, 일반적인 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 예를 들어

$$\langle$$⁠`프리앰블`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

은 최대 $$\mathrm{K}$$ 각 $$\mathrm{N}$$ $$\langle$$⁠`본문 줄`⁠$$\rangle$$ 의 항목에 대한 셀 템플릿을 지정합니다 $$\langle$$⁠`본문`⁠$$\rangle$$:

![](/files/68b837e52a7314a8fdba73efae61a775f25862b4)

### 각각의 구조는 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$

각 줄은 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$ 테이블의 $$\langle$$⁠본문⁠$$\rangle$$ 최대 $$\mathrm{K}$$ 개의 셀 내용을 포함하며—테이블 $$\langle$$⁠프리앰블⁠$$\rangle$$—그리고 일반적인 형식은 다음과 같습니다:

$$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$=$$\langle$$셀$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$셀$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$셀$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$셀$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

여기서:

* $$\langle$$셀$${}\_i$$⁠$$\rangle$$ 는 사용자의 내용을 나타냅니다 $$i$$번째 셀 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$
* 다음 **`&`** 문자를 *정렬 탭* (다음에서 사용되는 것과 동일합니다 $$\langle$$⁠프리앰블⁠$$\rangle$$)로, 한 셀의 끝과 다음 셀의 시작을 알립니다. 다시 말해, 사용되는 **`&`** 은 단지 전통(관례)일 뿐입니다. 왜냐하면 어떤 문자라도 [범주 코드](/latex/ko/more-topics/43-table-of-tex-category-codes.md) 4의 카테고리 코드를 가진 문자라면 무엇이든 대신 사용할 수 있다.

비록 각 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$ 은 최대 $$\mathrm{K}$$ 개의 셀(에 의해 결정되는 $$\langle$$⁠프리앰블⁠$$\rangle$$을 포함할 수 있지만 *더 적은* 보다 $$\mathrm{K}$$ 개의 셀을 포함할 수 있으며, 어떤 $$\langle$$셀$${}\_i$$⁠$$\rangle$$ 에서 $$\langle$$⁠본문 줄⁠$${}\_j$$⁠$$\rangle$$ 도 비어 있을 수 있습니다.

다음 예제는 $$\langle$$⁠프리앰블⁠$$\rangle$$ 의 `#&#&#&#&#\cr` 각 $$\langle$$본문 줄$$\rangle$$; 그러나 조판된 테이블에는 5개 미만의 셀을 가진 줄이 있습니다:

```latex
\textit{열}당 1~5개의 셀을 가진 \verb|\valign| 테이블:

\begingroup
% \hsize는 \valign 열 너비(조판된 줄의 크기)를 제어합니다.
\hsize=40pt
\fbox{\valign{
% 열당 5개의 셀을 허용하는 preamble을 사용합니다
% 대부분의 열은 5개의 셀에 대한 내용을 제공하지 않습니다
#&#&#&#&#\cr% 5 cells per column
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% 참고: 나중에 설명하겠지만
% \halign은 \vbox 안에 넣어야 한다
\textit{행}당 1~5개의 셀을 가진 \verb|\halign| 테이블:

\fbox{%
\vbox{\halign{
% 행당 5개의 셀을 허용하는 preamble을 사용합니다
% 대부분의 행은 5개의 셀에 대한 내용을 제공하지 않습니다
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[이 예제를 Overleaf에서 열기](/latex/ko/in-depth-articles/15-how-do-tex-engines-typeset-tables-2.md)

이 예제는 다음 출력을 생성합니다:

![](/files/3a61dd8575794415058263718355cee3fe3f22e9)

다음 `\halign` 예제는 행마다 서로 다른 개수의 셀과 셀을 비워 둘 수 있는 기능을 보여줍니다—연속된 **`&`** 문자에 의해 빈 셀이 만들어지는 방식을 주의해서 보세요:

```latex
일부 빈 셀이 있는 \verb|\halign| 테이블---테이블 \(\langle\texttt{body}\rangle\)에 연속된 \texttt{\&} 문자가 있습니다:

\fbox{%
\vbox{\halign{
% 행당 5개의 셀을 허용하는 preamble을 사용합니다
% 대부분의 행은 5개의 셀에 대한 내용을 제공하지 않습니다
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/7dc7ec81d02aeb0eb7785784a8ec9ac2ede79082)

### 테이블 조판에서 &와 #에 특별한 것은 없습니다

TeX이 문자를 사용하는 방식은 `&` 및 `#` 조판에서 `\halign`- 또는 `\valign`-기반 테이블에서의 사용은 Knuth의 원래 plain TeX 매크로에서 비롯된 전통입니다. 다음이 아닌 다른 문자를 사용하는 것도 충분히 가능합니다 `&` 및 `#` 아래 예제에서 보이듯, 원하는 대체 문자에 적절한 카테고리 코드를 할당함으로써

* 그것을 `&` 다음으로 바꾸면 `@` 를 할당함으로써 `@` 카테고리 코드 4로
* 그것을 `#` 다음으로 바꾸면 `|` 를 할당함으로써 `|` 카테고리 코드 6으로(이는 매크로 매개변수에 사용됩니다)

카테고리 변경은 다음을 사용해 로컬로 유지됩니다 `\begingroup` 및 `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## \noalign 명령 다시 소개

TeX 엔진은 내장(primitive)인 `\noalign` 명령:

`\noalign{`$$\langle$$⁠`토큰`⁠$$\rangle$$`}`

여기서 $$\langle$$⁠`토큰`⁠$$\rangle$$ 은 문자 및/또는 TeX/LaTeX 명령입니다. The `\noalign` 명령은 오직 `\halign` 또는 `\valign` 테이블 안에서만 사용해야 합니다. 이 밖에서 사용하면 오류가 발생합니다.

의 목적은 `\noalign` 텍스트와 TeX/LaTeX 명령을 "삽입"할 수 있게 하는 것입니다 *사이에* 의 행들 `\halign` 의 열들 `\valign` 가장 흔한 사용은 `\noalign` 테이블 규칙(선)을 만드는 것입니다:

* *수평* 선 `\halign` 테이블 행 사이의
* *수직* 선 `\valign` 테이블 열 사이의

다음 사항에 유의하세요:

* 다음 `\noalign` 명령의 일반 형식은 ***\*\*\*\*로 끝나지 않는\*\*\*\* ****`\cr`**** \*\*\*\*\*\*\*\*명령***
* 안에서 허용되는 명령 집합은 `\noalign{...}` 에서 사용되는지 여부에 따라 달라집니다 $$\langle$$⁠`본문`⁠$$\rangle$$ 의 `\halign` 또는 `\valign` 테이블(즉, 수직 모드 또는 수평 모드)인지에 따라.

이제 테이블이 $$\langle$$⁠`본문`⁠$$\rangle$$ 의 `\halign` 또는 `\valign` 개별 줄들로 구성될 수 있으며 $$\langle$$⁠본문 줄⁠$${}\_i$$⁠$$\rangle$$`\cr` 사이에 `\noalign` 명령이 끼어들 수 있습니다. 가능한 여러 조합 중 하나는 다음과 같습니다:

`\noalign{`$$\langle$$⁠`토큰`⁠$$\rangle$$`}` $$\langle$$⁠본문 줄⁠$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠본문 줄⁠$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`더 많은 토큰`⁠$$\rangle$$`}` $$\langle$$⁠본문 줄⁠$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠본문 줄⁠$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`다른 토큰`⁠$$\rangle$$`}`

### \noalign 사용 예제

이 글 시리즈의 뒤쪽에서 다른 사용 사례를 살펴보겠지만, 여기서는 다음을 통해 테이블 규칙을 만드는 기본 예제를 보여드립니다 `\noalign`:

```latex
\setlength{\tabskip}{5pt}

\verb|\noalign|을 사용해 \verb|\halign| 테이블의 행 사이에 수평선을 넣기:
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

\verb|\noalign|을 사용해 \verb|\valign| 테이블의 열 사이에 수직선을 넣기:
\vspace{6pt}

\begingroup % \parindent와 \hsize의 변경을 로컬로 유지
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/437f7b56972a79dc0c414c3d676c5660240c3e8a)

## tabskip 다시 살펴보기

다음에 대해 더 자세히 살펴보겠습니다 `\tabskip` 명령을, 이전 섹션의 [소개를 바탕으로](#tabskip).

다음 `\tabskip` 명령은 다음에 사용되는 특별한 형태의 "간격"(glue) 값을 설정합니다 *오로지* 테이블 조판에서: 그 목적은 테이블 행 또는 열 사이에 간격을 제공하는 것입니다:

* 에는 `\halign` 테이블: `\tabskip` glue는 테이블 앞뒤(즉, 왼쪽과 오른쪽)에 그리고 테이블 열 사이에 삽입됩니다
* 에는 `\valign` 테이블: `\tabskip` glue는 테이블 앞뒤(즉, 위와 아래)에 그리고 테이블 행 사이에 삽입됩니다

의 값은 `\tabskip` LaTeX `\setlength` 명령:

`\setlength{\tabskip}{`$$\langle$$⁠`glue 값`⁠$$\rangle$$`}`

여기서 $$\langle$$⁠`glue 값`⁠$$\rangle$$ 은 다음과 같을 수 있습니다:

* 예를 들어 고정 길이 `5pt`, `3mm`, 또는
* 예를 들어 유한한 유연 glue `3pt plus 2pt minus 1pt`, 또는
* 예를 들어 무한히 유연한 glue `0pt plus1fill`.

다음을 직접 설정할 수도 있습니다 `\tabskip` (를 거치지 않고 `\setlength`) 다음과 같이 작성하여

`\tabskip`=$$\langle$$⁠`glue 값`⁠$$\rangle$$

그러나 `\tabskip` glue 값의 변경은 다음의 경우에만 테이블 간격에 영향을 줍니다:

* 적용될 때 *이전의* 다음 `\halign` 또는 `\valign` 명령이 처리되도록 만들거나
* 테이블 내부에서 적용될 때 $$\langle$$⁠`프리앰블`⁠$$\rangle$$

설정하려는 시도는 `\tabskip` 테이블 내용(테이블의 셀) 내부의 값을 $$\langle$$⁠`본문`⁠$$\rangle$$) *하지 않습니다* 의 간격을 변경하지 않습니다 `\halign` 테이블 열이나 `\valign` 테이블 행의 간격을 변경하지 않습니다. 이러한 `\tabskip` 동작의 원인은 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 가 테이블 조판 중에 수행하는 역할에서 찾을 수 있습니다—이 과정은 나중에 자세히 살펴보겠습니다.

### 보는 것이 믿는 것

테이블 조판에 사용되는 다양한 종류의 간격/glue의 존재를 시각화하는 데 도움이 되도록, 특히

* `\tabskip` glue
* `\baselineskip` glue
* 수동 커닝(`\kern`)

Overleaf는 테이블의 구성 요소에 색을 입히기 위해 LuaTeX 기반 프로젝트를 준비했습니다. LuaTeX가 선택된 이유는 조판된 테이블의 내부 데이터/구조를 저수준에서 재처리할 수 있게 해주기 때문이지만, 여기서는 그 세부 사항을 다루지 않겠습니다.

다음은 여러 가지 `\tabskip`의 적용을 보여주는 몇 가지 예입니다. 각 예제마다 실제 출력과 LuaTeX가 생성한 색상 버전을 보여드리겠습니다.

### \tabskip 예제 1

다음의 사용을 살펴보겠습니다 `\tabskip` 을 보여준다 `\halign` 및 `\valign` 테이블. 크기와 간격을 시각화하기 위해 테두리를 넣은 실제 조판 테이블과, 각 테이블의 다양한 glue/간격의 크기를 명확히 보여주는 주석이 달린 색상 버전 그래픽을 함께 보여드리겠습니다.

먼저, `\halign`:

```latex
% 테이블의 범위를 시각화하기 위해 테두리를 둘 것입니다
\setlength{\fboxsep}{0pt} % Use close-fitting borders

% 여기서는 \tabskip를 "직접" 설정합니다
\tabskip5pt % 테이블 바깥에서 초기 \tabskip 값을 설정

% 테이블 주위에 테두리를 넣으려면 TeX 박스에 저장해야 합니다.
% \halign은 \vbox 안에 배치해야 하는데, \halign은 반드시
% "수직 모드"에서 처리되어야 하기 때문입니다. \hbox는 작동하지 않는데
% 이는 "수평 모드"에서 처리되기 때문입니다

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/fbd387b9b9f234e6d0e8a42602e5eb39df577937)

다음 그래픽은 앞선 예제에서 만들어진 테이블의 더 큰 색상/주석 버전입니다:

![](/files/67ff724f5e46c69fcd677a66785a22e300451c52)

다음의 4개 인스턴스가 있습니다 `\tabskip` 명령이 있으며, 각각은 테이블 내 특정 간격 위치에 해당합니다:

1. `\tabskip5pt` 는 테이블 밖에서 사용되며 `\tabskip` 각 행의 첫 번째 셀 앞(왼쪽)에 적용되는 값을 설정합니다.
2. `\tabskip10pt` 는 다음의 첫 번째 셀 템플릿에 설정되며 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 이는 사이의 간격에 영향을 줍니다 $$\langle$$셀$${}\_1$$⁠$$\rangle$$ 및 $$\langle$$셀$${}\_2$$⁠$$\rangle$$ 모든 행의
3. `\tabskip15pt` 는 다음의 두 번째 셀 템플릿에 설정되며 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 이는 사이의 간격에 영향을 줍니다 $$\langle$$셀$${}\_2$$⁠$$\rangle$$ 및 $$\langle$$셀$${}\_3$$⁠$$\rangle$$ 모든 행의
4. `\tabskip20pt` 는 다음의 세 번째이자 마지막 셀 템플릿에 설정되며 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 이는 다음 뒤에 추가되는 간격에 영향을 줍니다 $$\langle$$셀$${}\_3$$⁠$$\rangle$$, 즉 모든 행의 마지막 셀

다음으로, `\valign`

```latex
\setlength{\fboxsep}{0pt} % Use close-fitting borders
\tabskip5pt % 테이블 바깥에서 초기 \tabskip 값을 설정

% \hsize 변경을 로컬로 유지합니다(그룹 안에서)
\begingroup
% \hsize는 \valign 열 너비를 결정합니다
\setlength{\hsize}{50pt}
% \valign은 \vbox나 \hbox 안에 배치할 수 있으므로
% \fbox를 직접 사용할 수 있습니다
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

![](/files/447762caa98ca9c68e79afc2fb0797926ee46e86)

다시 말해, 다음 그래픽은 앞선 예제에서 만들어진 테이블의 더 큰 색상/주석 버전입니다:

![](/files/f559f7c647a3b284af49533d534f1ecef2d5f63f)

앞선 `\halign` 예제와 마찬가지로, 다음의 4개 인스턴스가 있습니다 `\tabskip` 명령이 있습니다. 그러나 `\valign` 테이블에서는 `\tabskip` 는 테이블 행 사이에 삽입됩니다:

1. `\tabskip5pt` 는 테이블 밖에서 사용되며 `\tabskip` 각 열의 첫 번째 셀 앞(위)에 적용되는 값입니다.
2. `\tabskip10pt` 는 다음의 첫 번째 셀 템플릿에 설정되며 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 이는 사이의 간격에 영향을 줍니다 $$\langle$$셀$${}\_1$$⁠$$\rangle$$ 및 $$\langle$$셀$${}\_2$$⁠$$\rangle$$ 모든 열의
3. `\tabskip15pt` 는 다음의 두 번째 셀 템플릿에 설정되며 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 이는 사이의 간격에 영향을 줍니다 $$\langle$$셀$${}\_2$$⁠$$\rangle$$ 및 $$\langle$$셀$${}\_3$$⁠$$\rangle$$ 모든 열의
4. `\tabskip20pt` 는 다음의 세 번째이자 마지막 셀 템플릿에 설정되며 $$\langle$$⁠`프리앰블`⁠$$\rangle$$ 이는 다음 뒤에 추가되는 간격에 영향을 줍니다 $$\langle$$셀$${}\_3$$⁠$$\rangle$$, 즉 모든 열의 마지막 셀

**요약/결론**

* 의 경우, `\halign` 테이블에서는 `\tabskip` glue는 한 행의 각 셀의 왼쪽과 오른쪽에 배치되어 테이블 열 사이의 간격을 만듭니다.
* 이 `\valign` 테이블에서는 `\tabskip` glue는 한 열의 각 셀의 위와 아래에 배치되어 테이블 행 사이의 간격을 만듭니다.

### \tabskip 및 \noalign

#### \halign 사용하기

다음 `\halign` 예제는 `\tabskip` glue를 사용하며 또한 `\noalign` 명령을 보여줍니다. 이를 사용해 다음의 행 위아래에 간격이 있는 선을 배치합니다 `\halign` 테이블입니다. 이러한 선은 다음을 사용해 조판됩니다 `\hrule` (primitive) 명령과 다음이 만들어낸 공간을 함께 사용하여 `\kern`:

```latex
\setlength{\tabskip}{5pt} % Set \tabskip outside of the table

\halign{
#&#&#&#&#\cr % The <preamble>
\noalign{\hrule\kern2pt} % Spaced rule before row 1
1&2&3&4&5\cr % Row 1
\noalign{\kern2pt\hrule\kern2pt} % Spaced rule between rows 1/2
6&7&8&9&10\cr % Row 2
\noalign{\kern2pt\hrule\kern2pt} % Spaced rule between rows 2/3
11&12&13&14&15\cr % Row 3
16&17&18&19&20\cr % Row 4---no rules between rows 3/4
\noalign{\kern2pt\hrule} % Space rule at table end
}
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

이 예제는 아래에 보이는 테이블을 생성하며, 여기에 (La)TeX 코드와 숫자 (1)\~(4)를 추가 주석으로 달아 `\noalign` 규칙과 kern을 포함한 명령들을, 대응하는 조판 결과와 함께 열거했습니다:

![](/files/680acdf2b27fbe9f46d8ab19ea78ef4d67c3722b)

다음 그래픽은 테이블 내 다양한 간격/glue를 보여주도록 라벨이 붙은 색상 버전의 테이블을 보여줍니다:

![](/files/51678b8d8373325f70eea5979d864af1c8b44057)

다음 사항에 유의하세요:

* 의 사용 `\noalign` 를 사용해 특정 행 사이에 선을 삽입하고, 다음의 수동 사용 `\kern` 값으로 선 앞뒤에 약간의 공간을 넣습니다. TeX 엔진은 다음을 삽입하지 않습니다 `\baselineskip` 조판된 선 뒤에 glue를 삽입하지 않으므로, 공간은 수동으로 다음을 사용해 삽입됩니다 `\kern` (다른 간격 명령을 사용할 수도 있습니다);
* `\baselineskip` glue는 행 3과 4 사이에 자동으로 삽입되었습니다.

#### \valign 사용하기

다음 `\valign` 예제는 이전의 `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

이 예제는 아래에 보이는 테이블을 생성하며, 여기에 (La)TeX 코드와 숫자 (1)\~(4)를 추가 주석으로 달아 `\noalign` 규칙과 kern을 포함한 명령들을, 대응하는 조판 결과와 함께 열거했습니다:

![](/files/9c3dfb960d007f9a88083439242e7d79bb760d74)

![](/files/d744444e7012e92a870fc5297be8eea3fa8a86eb)

### 텍스트 줄이 있는 \valign 테이블

다음 예제는

```latex
\setlength{\tabskip}{5pt}
\begingroup % \parindent와 \hsize의 변경을 로컬로 유지
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{}는 매우 복잡한
테이블을 조판할 수 있습니다.&여기에 약간의 추가
텍스트가 있습니다.&그리고 마지막으로 추가 줄
이 열에 있습니다.\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[이 예제를 Overleaf에서 열기](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

이 예제는 다음 출력을 생성합니다:

## 행 너비와 열 높이 설정하기

## 테이블에 대한 추가 내용 $$\langle$$⁠프리앰블⁠$$\rangle$$


---

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