단 조판은 체재 취향이 아니라 읽기를 돕는 장치입니다. 10pt article의 한 줄은 폭이 345pt, 영문으로 약 78자가 되는데, 타이포그래퍼 Robert Bringhurst는 편안하게 읽히는 행 길이를 45~75자로 보고 66자를 이상적이라고 말합니다. 이 페이지를 2단으로 쪼개면 모든 줄이 바로 그 범위로 돌아옵니다. 학술지도 논문집도 신문도 단으로 짜는 이유가 여기에 있고, LaTeX에는 이를 위한 성격이 사뭇 다른 두 도구가 있습니다. 클래스 옵션 twocolumn과 multicol 패키지의 multicols 환경입니다. 겉보기에는 서로 바꿔 써도 될 것 같지만 그렇지 않습니다. 이 페이지에서는 실제로 발목을 잡는 차이, 곧 단을 몇 개까지 만들 수 있는지, 마지막 페이지가 균형을 맞추는지, 그리고 그림이 말없이 사라지는 두 가지 서로 다른 이유를 차례로 짚습니다.
twocolumn과 multicol 중 무엇을 쓸까
문서 전체가 2단이고 그림표가 들어간다면 twocolumn, 일부만 단으로 짜고 싶거나 3단 이상이 필요하거나 마지막 페이지를 고르게 맞춰야 한다면 multicol입니다. 갈림길은 플로트(그림표)에 있습니다. twocolumn은 LaTeX의 플로트 기구를 그대로 남겨 두므로 figure는 여전히 단 안에서 떠다니고 figure*는 페이지 전체를 가로지릅니다. 반면 multicol은 출력 루틴을 통째로 갈아 끼운 구현이라, 단 높이를 맞추는 능력을 얻는 대신 단 안의 플로트를 완전히 포기했습니다. 이 페이지의 거의 모든 이야기가 이 한 번의 거래에서 갈라져 나옵니다.
| 형태 | 단 수 | 효과 |
|---|---|---|
twocolumn | 2 | 클래스 옵션. 본문 전체가 2단이 되고 마지막 페이지는 맞춰지지 않습니다 |
\twocolumn[⟨text⟩] | 2 | 본문에서 사용합니다. 쪽을 넘긴 뒤 ⟨text⟩를 단 위에 전폭으로 조판합니다 |
\onecolumn | 1 | 본문에서 사용합니다. 쪽을 넘기고 1단으로 되돌립니다 |
multicols | 2~10 | 환경. 페이지 중간에서 시작하고 끝나며 마지막 단들의 높이를 맞춥니다 |
multicols* | 2~10 | 같지만 마지막 단들을 왼쪽부터 채우고 높이는 맞추지 않습니다 |
문서 전체를 2단으로 —— twocolumn 옵션
클래스 옵션에 twocolumn을 더하기만 하면 됩니다. \documentclass[twocolumn]{article}이라고 쓰면 본문 전체가 2단이 됩니다(기본값은 onecolumn). 많은 학회 클래스가 내부적으로 이 옵션을 전제로 설계되어 있습니다. 문서 중간에 모드를 바꾸려면 본문에서 \twocolumn과 \onecolumn을 호출하는데, 걸림돌이 둘 있습니다. 두 명령 모두 새 페이지를 시작하므로 단 수는 페이지 중간에서 바뀌지 않습니다. 그리고 \twocolumn이 만드는 것은 언제나 정확히 2단입니다. 세 번째 단이 필요해지는 순간 이 도구로는 닿지 않습니다.
\documentclass[twocolumn]{article}이 \twocolumn에는 선택 인수가 있는데, 논문의 얼굴을 만드는 것은 대개 이쪽입니다. \twocolumn[⟨전폭으로 조판할 내용⟩]이라고 쓰면 그 내용만 2단 본문 위에 1단(판면 전폭)으로 놓입니다. 제목과 저자, 소속, 초록을 페이지 폭 가득 펼치고 그 아래로 본문을 2단으로 흘려보내는—학회 논문에서 익숙한 그 체재가 이 한 줄에서 나옵니다.
\documentclass[twocolumn]{article}
\begin{document}
\twocolumn[%
\begin{center}
{\LARGE A Study of Narrow Measures}\\[4pt]
A. Author \quad Institute of Typography
\end{center}
\vspace{1em}
]
The body starts here and is set in two columns.
\end{document}단과 단 사이의 간격은 길이 \columnsep, 그 안에 긋는 세로선의 두께는 \columnseprule입니다. 표준 클래스의 기본값은 \columnsep이 10pt, \columnseprule이 0pt(선 없음)입니다. 숫자를 넣으면 첫머리의 이야기가 구체적이 됩니다. 10pt article은 \textwidth가 345pt이므로 한 단의 폭은 (345 − 10) ÷ 2 = 167.5pt, 영문으로 약 38자입니다. Bringhurst가 다단 조판에 권하는 40~50자의 바로 아래—즉 \columnsep에 1pt를 더할 때마다 여유가 없는 행 길이에서 그만큼 깎아 내는 셈입니다. 대개 더 나은 거래는 세로선입니다. 선이 시각적으로 단을 갈라 주므로 간격 자체는 좁게 두어도 됩니다.
\setlength{\columnsep}{20pt} % wider gap between the columns
\setlength{\columnseprule}{0.4pt} % thin vertical rule inside the gap그림을 단을 가로질러 전폭으로 —— figure*와 table*
별표 붙은 환경을 씁니다. \begin{figure*}와 \begin{table*}는 두 단을 가로질러 페이지 폭 전체로 퍼지는 플로트를 만듭니다. 그 안의 폭 지정에서 하나만 기억하면 사고가 크게 줄어듭니다. \columnwidth는 한 단의 폭이고, \textwidth는 두 단과 단간을 합친 판면 전체의 폭입니다. 한 단에 넣을 그림은 width=\columnwidth, 단을 가로지르는 그림은 width=\textwidth가 기준입니다. 반대로 쓰면 판면을 넘치거나 이상하게 작게 조판됩니다.
\documentclass[twocolumn]{article}
\usepackage{graphicx}
\begin{document}
% one column wide: an ordinary float
\begin{figure}
\centering
\includegraphics[width=\columnwidth]{plot}
\caption{Fits inside a single column.}
\end{figure}
% spans both columns: starred float, default placement is [tp]
\begin{figure*}[t]
\centering
\includegraphics[width=\textwidth]{wide-plot}
\caption{Spans the full text width.}
\end{figure*}
\end{document}“figure*가 내가 쓴 자리에 나오지 않는다”, “세 페이지 뒤로 날아갔다”는 하소연은 기본값을 알고 나면 납득이 갑니다. LaTeX 커널 소스는 두 단을 가로지르는 플로트의 기본 배치 지정이 모두 tp라고 분명히 적어 두었습니다. 즉 \begin{figure*}는 말없이 [tp]—페이지 위쪽 또는 플로트 전용 페이지—로 다뤄지며 htbp가 아닙니다. 게다가 LaTeX2e 참조 매뉴얼이 지적하듯 2단 출력의 전폭 플로트에는 b(페이지 아래쪽)를 쓸 수 없습니다. 다음 페이지 위쪽이 이미 차 있으면 플로트는 계속 뒤로 밀립니다. 꼭 페이지 아래에 두어야 한다면 stfloats나 dblfloatfix를 불러오면 b가 동작합니다.
이 대기열에는 오래 살아남은 재미있는 결함이 하나 있었습니다. 2015년 릴리스 이전까지 LaTeX은 보류된 플로트를 두 개의 별도 대기 목록—단일 단용과 단 가로지르기용—으로 관리했습니다. 줄이 둘이면 새치기가 생깁니다. 한 단짜리 그림 3이 먼저 쓰인 전폭 그림 2를 추월해 앞서 인쇄되는 사고입니다. 수정은 먼저 fixltx2e 패키지로 배포되어 두 목록을 하나로 합쳤습니다. 2015년에 fixltx2e의 모든 수정이 커널 본체에 흡수되었으므로 현행 TeX 환경이라면 더 불러올 것이 없습니다. 그림 순서가 뒤바뀐다는 옛 글을 만나면 먼저 날짜부터 확인해 보십시오.
3단 이상, 그리고 높이가 맞는 단 —— multicol 패키지
\usepackage{multicol}을 불러오고, 단으로 짤 범위를 multicols 환경으로 감싼 뒤 인수로 단 수를 넘깁니다. 이것만으로 2단부터 10단까지(열 개 상한은 버전 1.5부터) 쓸 수 있고, 환경은 페이지 중간에서 시작해 중간에서 끝나며, 끝나는 지점에서 각 단의 높이를 스스로 맞춥니다. multicols는 중첩할 수도 있습니다. 쪽 나눔을 강제하지 않으므로, 1단 본문 한가운데에 용어집이나 색인만 3단으로 끼워 넣는 일이 아주 자연스럽습니다.
\usepackage{multicol}
% ... later, in the body
\begin{multicols}{3}
This text is broken into three balanced columns.
\end{multicols}multicol은 색인 때문에 생겨났습니다. 1989년, Frank Mittelbach는 doc 패키지의 매크로를 쓰다가 문서 파일의 색인과 참고문헌을 같은 페이지에 얹고 싶어 했습니다. 표준 2단 조판으로는 불가능합니다. \twocolumn은 반드시 새 페이지를 시작하고, 마지막 페이지는 오른쪽 단이 절반 빈 채로 끝나기 때문입니다. 그는 패키지 문서에 첫 판을 만드는 데 주말 하나를 통째로 썼다는 것과, 출발점이 『The TeXbook』 417쪽의 알고리즘이었다는 것을 적어 두었습니다(그 문장은 초판 문서에 쓴 것이며 이후 수백 시간이 더 들어갔다는 말도 덧붙어 있습니다). 곧 단 높이 맞추기는 보기 좋으라고 만든 기능이 아니라 지면을 아끼기 위한 기능이었던 셈입니다.
multicols는 단 수 뒤에 선택 인수를 둘 받습니다. 첫 번째 [⟨전면 텍스트⟩]는 단 바로 위에 전폭으로 조판되는 제목이나 도입문입니다. 두 번째 [⟨길이⟩]는 그 페이지에서 단 조판을 시작하기 위해 페이지 아래에 남아 있어야 할 최소 여백으로, 기본값 \premulticols(50pt)를 이번 한 번만 덮어씁니다. 남은 공간이 그보다 적으면 환경은 새 페이지에서 시작합니다. 전면 텍스트가 긴데 이 인수를 빠뜨리면, 패키지가 Error saving partial page 오류와 이어지는 Some text may be lost! 메시지로 멈출 수 있습니다. 처방은 \premulticols를 키우라는 것입니다.
\begin{multicols}{3}
[\section{Glossary}
This heading and this sentence run the full text width.]
[6cm]
Everything after the optional arguments is split into three columns.
\end{multicols}twocolumn 문서의 마지막 페이지는 왜 맞춰지지 않을까
LaTeX이 다음 단의 존재를 알기도 전에 앞 단을 완성해 버리기 때문입니다. 2단 모드의 출력 루틴 \@outputdblcol은 단마다 한 번씩 호출됩니다. 왼쪽 단이 차면 그 내용은 \@leftcolumn이라는 상자에 담기고 조판이 다시 이어집니다. 오른쪽 단이 차야 비로소 페이지가 조립되어 출력됩니다. 즉 LaTeX이 “남은 본문을 손에 들고 어떻게 둘로 나눌지 정하는” 순간은 한 번도 오지 않습니다. 그래서 \end{document} 시점에 남아 있던 분량은 그대로 왼쪽 단으로 흘러 들어가 멈추고, 오른쪽 단은 짧은 채로 끝납니다. 결함이 아니라 순차적인 페이지 조립이 낳을 수밖에 없는 결과입니다.
multicol은 이 순서를 뒤집습니다. 비밀은 전부 여기에 있습니다. 패키지 문서는 작업을 두 단계로 설명합니다. 먼저 환경의 내용을 모으고, 끝에 이르렀을 때 균형을 맞춘다는 것입니다. 모으는 일이 앞서기 때문에, 만들어진 상자를 \vsplit으로 잘라 높이를 바꿔 가며 시험할 수 있고, 그래서 단 높이를 맞출 수 있습니다. 버전 1.5에서는 품질 검사가 더해졌습니다. 각 후보를 TeX의 badness 척도(0이 최적, 10000이 무한히 나쁨)로 재어, 카운터 columnbadness(기본 10000)보다 나쁜 해는 버립니다. 짝이 되는 카운터 finalcolumnbadness(기본 9999)는 내용이 적은 마지막 단을 억지로 늘여 보기 흉하게 만드느니 짧은 채로 두는 편이 낫다고 판단합니다.
\raggedcolumns— 단의 아래 끝을 맞추지 않습니다. 기본값은 맞추는\flushcolumns입니다- 카운터
unbalance— 맨 오른쪽 단을 뺀 나머지를 지정한 줄 수만큼 늘입니다. 환경마다 초기화됩니다 - 카운터
minrows(기본 1) — 첫 단에 넣을 최소 줄 수. 한 줄짜리 단을 피하고 싶을 때 씁니다 - 카운터
columnbadness(기본 10000) — badness가 이 값을 넘는 해는 버립니다 - 카운터
finalcolumnbadness(기본 9999) — 이 값을 넘으면 짧은 마지막 단을 늘이지 않고 짧은 채로 둡니다 \maxbalancingoverflow(기본 12pt) — 맞춘 결과가 이보다 더 넘치면 균형 맞추기를 포기하고 보통 페이지를 만듭니다
실무의 선택지는 셋입니다. twocolumn을 계속 쓰면서 마지막 페이지만 맞추고 싶다면, 출력 루틴에 패치를 대는 balance 패키지나 flushend 패키지가 있습니다. 다만 TeX FAQ는 둘 다 플로트가 있으면 혼란에 빠지기 쉽다고 경고하며, 그럴 때는 그림표 위치를 손으로 조정해야 할 수 있다고 말합니다. 더 든든한 길은 문서의 끝부분만 multicols 환경으로 감싸거나, 오른쪽 단이 짧게 끝나는 것을 받아들이는 것입니다. 대부분의 학회 스타일이 후자를 허용합니다.
단이 끊기는 자리를 직접 정하기 —— \columnbreak와 세로선
\columnbreak은 놓아 둔 바로 그 자리에서 현재 단을 끝내고 나머지를 다음 단으로 보냅니다(버전 1.5u에서 추가). 1.9부터는 \pagebreak과 같은 형태의 선택 인수를 받아 \columnbreak[0](약한 선호)부터 \columnbreak[4](강제)까지 지정할 수 있습니다. 같은 1.9에서 단을 끊고 짧은 채로 두는 \newcolumn도 더해졌습니다. 여기서 \pagebreak을 쓰면 안 되는 이유도 분명합니다. multicols 안에서 \pagebreak은 수집 단계 자체를 끝내 버리므로 그 페이지의 단이 한꺼번에 닫힙니다.
\setlength{\columnsep}{1.5em} % gap between columns
\setlength{\columnseprule}{0.4pt} % show a rule in the gap
\renewcommand{\columnseprulecolor}{\color{gray}}
\begin{multicols}{2}
Text of the left column.
\columnbreak % push the rest into the next column
Text of the right column.
\end{multicols}단간과 세로선은 twocolumn과 같은 \columnsep, \columnseprule로 제어하고, multicol은 여기에 \columnseprulecolor를 더합니다(기본값은 \normalcolor, 즉 본문색). 이 값들은 환경에 들어가기 전에 설정하십시오. 그리고 패키지가 말없이 바꾸는 설정이 하나 더 있습니다. 줄 나눔의 허용도입니다. LaTeX의 평소 \tolerance는 200, 곧 \fussy의 값인데, 38자짜리 행 길이에는 지나치게 엄격합니다. 그래서 환경 안에서 multicol은 \multicoltolerance(기본 9999)로 바꿉니다. “아무래도 좋다”는 뜻의 10000 바로 한 걸음 앞, 좁은 단을 위한 현실적인 절충입니다. 그래도 양쪽 정렬의 공백이 눈에 띈다면 환경 안에서 \raggedright를 쓰거나 해당 언어의 하이픈 규칙을 손보는 것이 정석입니다.
multicols 안에서 그림이 사라지는 이유
multicols 안에는 일반 플로트가 구현되어 있지 않아, 넣은 것이 버려지기 때문입니다. figure나 table 환경, 또는 \marginpar를 그 안에 쓰면 로그에 Floats and marginpars not allowed inside 'multicols' environment! 경고가 남습니다. 패키지 문서는 결과를 솔직하게 적어 두었습니다. 그런 플로트는 사라진다는 것입니다. 이유도 밝혀져 있습니다. 플로트를 구현하려면 LaTeX의 출력 루틴을 통째로 다시 써야 하는데, 그것은 첫 판에 들인 주말의 범위를 한참 넘어서는 일이었습니다. 오류가 아니라 경고이므로 문서는 그대로 컴파일됩니다. 그림이 보이지 않는데 로그에 달리 이상한 곳이 없다면, 이 줄부터 찾아보십시오.
| 구문 | twocolumn 에서는 | multicols 안에서는 |
|---|---|---|
figure / table | 단 안에서 정상적으로 떠다닙니다 | 불가. 경고만 나오고 그림표는 사라집니다 |
figure* / table* | 페이지 전폭. 기본은 [tp]이고 b는 쓸 수 없습니다 | 사용 가능. t b p가 모두 듣지만, 쓴 페이지에는 절대 나오지 않습니다 |
\marginpar | 사용 가능 | 불가. 같은 경고와 함께 사라집니다 |
\columnbreak | 없습니다. 쪽 나눔으로 대신합니다 | 그 자리에서 단을 끊습니다(1.5u 이후) |
\pagebreak | 그 페이지를 닫습니다 | 수집 단계를 끝내므로 그 페이지의 단이 한꺼번에 닫힙니다 |
\columnseprule | 단간의 세로선. 기본 0pt | 같습니다. 색은 \columnseprulecolor로 바꿉니다 |
별표 붙은 플로트는 multicols 안에서도 쓸 수 있지만, twocolumn에서와는 동작이 다릅니다. 문서에 따르면 multicols 안의 figure*는 “1단 페이지에 놓인 보통 플로트”에 가깝게 다뤄집니다. t, b, p를 모두 지정할 수 있고, 참조하는 값도 \dbltopfraction이 아니라 \topfraction입니다. 다만 절대적인 제약이 하나 있습니다. 쓰인 페이지에는 결코 나타나지 않는다는 것입니다. 가장 빨라야 다음 페이지의 위쪽이므로 h를 지정해도 의미가 없습니다. twocolumn에서는 b를 못 쓰는데 multicols에서는 쓸 수 있다는 역전이 여기서 나옵니다.
그렇다면 단 안에 작은 그림을 넣고 싶을 때는 어떻게 할까요. 답은 플로트로 만들지 않는 것입니다. center 환경 안에 \includegraphics를 곧바로 두면 쓴 자리에 그대로 조판됩니다(환경 안에서는 \linewidth가 단의 폭이므로 width=\linewidth가 자연스럽습니다). 번호가 붙은 캡션이 필요하다면 caption 패키지의 \captionof{figure}{…}로 번호와 상호 참조를 그대로 유지한 채 달 수 있습니다. 본문을 감싸 흐르게 하려면 wrapfig라는 길도 있습니다. 다만 문서 전반에 걸쳐 단 안의 플로트가 필요하다는 것이 드러나는 순간, 그것은 multicol이 아니라 twocolumn을 골라야 한다는 신호입니다.
\usepackage{multicol}
\usepackage{graphicx}
\usepackage{caption} % provides \captionof
% ... in the body
\begin{multicols}{2}
Text before the picture.
\begin{center}
\includegraphics[width=\linewidth]{plot}
\captionof{figure}{Not a float, so it stays where it is written.}
\end{center}
Text after the picture.
\end{multicols}