표의 내용이 이미 .csv 파일 같은 외부 데이터 로 존재한다면 각 셀을 손으로 다시 입력할 필요가 없습니다. LaTeX에는 CSV를 읽어 표로 바꾸는 패키지가 여러 개 있어서, 데이터가 바뀌어도 원본을 다시 고칠 필요가 없습니다. 이 페이지에서는 빠른 csvsimple, 서식 지정에 강한 pgfplotstable, 데이터베이스처럼 다루는 datatool 세 가지를 언제 쓰면 좋은지와 함께 소개합니다. 마지막으로 숫자를 소수점 기준으로 맞추는 siunitx의 S 열도 다룹니다(S 열의 자세한 내용은 “단위(siunitx)” 페이지에서 설명합니다).
데이터에서 표를 만드는 이유
실험 결과나 집계표는 대개 스프레드시트나 측정 장비에서 CSV(쉼표로 구분한 값) 로 나옵니다. 이것을 tabular 셀에 손으로 옮기는 일은 지루하고 오류가 나기 쉽습니다. 행이 하나 늘거나 숫자 한 자리가 바뀔 때마다 원고를 다시 고쳐야 합니다.
생각을 바꿔서 데이터는 데이터 파일에 둔 채 LaTeX에는 “읽어서 조판하라”고만 지시할 수 있습니다. 그러면 데이터를 갱신하고 다시 컴파일하는 것만으로 표도 따라 바뀝니다. 원본 CSV 하나만 있으면 본문, 슬라이드, 부록에서 같은 숫자를 여러 번 재사용할 수 있고, 옮겨 적는 실수도 없습니다. 이런 “데이터와 표현의 분리”는 논리 구조와 모양을 나누는 LaTeX의 방식과 맞닿아 있습니다.
이 페이지의 예제에서는 아래의 작은 CSV 파일을 사용합니다. 첫 줄은 product, price, weight라는 열 이름을 가진 머리글 행 이고, 나머지 줄이 데이터입니다.
product,price,weight
Apple,380,182.5
Orange,120,95.0
Melon,1280,1450.2빠르게 읽기 — csvsimple
csvsimple은 CSV를 읽어 표나 반복 처리를 만드는 가벼운 패키지입니다. \usepackage{csvsimple}로 불러옵니다(현재 버전은 내부에서 LaTeX3 구현인 csvsimple-l3를 선택합니다). 가장 빠른 시작점은 \csvautotabular{data.csv} 입니다. 파일 이름만 넘기면 CSV 전체를 자동으로 tabular에 넣고, 첫 줄을 머리글로 삼아 줄이 있는 표를 만들어 줍니다. 내용을 빠르게 표로 확인할 때 알맞습니다.
\csvautotabular{data.csv}이 한 줄만으로 product, price, weight를 머리글로 하는 3열 3행 표가 만들어집니다. 편리하지만 서식을 자유롭게 정하기는 어렵습니다. 열 맞춤, 줄, 사용할 열을 직접 정하고 싶다면 \csvreader를 사용합니다. 이것이 csvsimple의 핵심 명령입니다.
\csvreader는 \csvreader[options]{data.csv}{assignments}{body} 형태의 세 인수를 받습니다. 두 번째 인수 는 읽을 파일, 세 번째 는 열 이름을 매크로에 묶는 할당, 네 번째 는 각 행에서 출력할 내용입니다. 예를 들어 price=\price라고 쓰면 price 열의 값을 본문 안에서 \price로 사용할 수 있습니다. 표의 틀은 tabular=나 table head=(머리글 행) 같은 옵션으로 지정합니다.
\csvreader[
tabular = l r r,
table head = \hline Product & Price & Weight \\ \hline,
late after line = \\]
{data.csv}
{product=\product, price=\price, weight=\weight}
{\product & \price & \weight}여기서는 tabular = l r r로 “왼쪽, 오른쪽, 오른쪽” 세 열을 선언하고, table head로 머리글 행과 위쪽 선을 놓으며, 본문 {\product & \price & \weight}가 각 데이터 행을 셀로 펼칩니다. late after line = \\는 csvsimple에 각 줄 뒤에 행 끝 표시 \\를 붙이라 는 지정입니다. 행 사이에만 줄바꿈을 넣고 마지막 행 뒤에는 불필요한 줄바꿈을 남기지 않는 관용구입니다. 머리글 이름에 공백이나 기호가 들어 있다면 세 번째 인수에서 번호로 열을 가리킬 수도 있습니다. \csvcoli, \csvcolii, \csvcoliii, … 는 각각 첫 번째, 두 번째, 세 번째 열의 내용을 뜻합니다.
기본적으로 첫 줄은 머리글 로 처리되어 데이터에 포함되지 않습니다. 머리글 행이 없는 CSV를 읽을 때는 별표 형태인 \csvreader*를 쓰면 첫 줄도 데이터 행으로 읽습니다. csvsimple에는 조건으로 행을 고르는 filter, 정의해 둔 할당을 재사용하는 \csvstyle / \csvnames 같은 기능도 있어, 표뿐 아니라 일반적인 행 단위 처리에도 사용할 수 있습니다.
읽고 서식 지정하기 — pgfplotstable
숫자의 보이는 방식 까지 세밀하게 만들고 싶다면 pgfplotstable이 가장 강력한 선택입니다. pgfplots의 일부이며 \usepackage{pgfplotstable}로 불러옵니다. 핵심 명령은 \pgfplotstabletypeset[options]{data.csv} 하나입니다. 이 명령이 CSV를 읽고, 지정한 자릿수와 숫자 형식으로 다듬은 뒤, 내부에서 tabular를 만들어 출력합니다. CSV를 읽을 때는 col sep=comma로 구분자를 알려 줍니다.
동작은 모두 키=값 옵션 으로 제어합니다. 중요한 옵션은 다음과 같습니다.
| 옵션 | 기능 | |
|---|---|---|
col sep=comma | col sep=comma | CSV(쉼표 구분)로 읽음. 기본값은 공백 구분 |
header | header=has colnames / header=false | 1행을 열 이름으로 처리 / 머리글 없음으로 처리 |
columns | columns={a,b,...} | 출력할 열과 순서를 선택 |
columns/NAME/.style | columns/price/.style={...} | 특정 이름의 열에만 서식 적용 |
column name | column name=머리글 | 그 열에 출력되는 머리글을 바꿈 |
fixed | fixed, fixed zerofill, precision=n | 고정소수점, 뒤쪽 0 채움, 소수 n자리 |
sci | sci, sci zerofill | 과학 표기(지수 형식)로 조판 |
string type | string type | 문자열 열(숫자 서식을 적용하지 않음) |
dec sep align | dec sep align | 열을 소수점 기준으로 맞춤(array 필요) |
\pgfplotstabletypeset[
col sep = comma,
header = has colnames,
columns = {product, price, weight},
columns/product/.style = {string type, column name = Product},
columns/price/.style = {column name = Price, fixed, precision = 0},
columns/weight/.style = {column name = Weight (g), fixed, fixed zerofill,
precision = 1, dec sep align},
]{data.csv}이 예에서는 product 열을 string type(텍스트)으로, price 열을 정수(precision=0)로, weight 열을 소수 한 자리와 뒤쪽 0 채움으로 조판하고 dec sep align으로 소수점을 맞춥니다. 머리글은 각각 column name으로 바꾸었습니다. 같은 데이터라도 precision만 바꾸면 자릿수가 달라집니다. CSV와 분리해 숫자의 모양을 제어할 수 있는 점이 pgfplotstable의 강점입니다.
pgfplotstable은 읽어 온 열에서 계산 열 도 만들 수 있습니다. create on use로 “사용할 때 계산하는 열”을 정의하거나, columns/.../.style 안에서 postproc cell content로 값을 후처리할 수 있어서, 스프레드시트에 가까운 작업을 LaTeX 안에서 끝낼 수 있습니다. 줄은 every head row/.style 또는 booktabs 연동(\toprule / \midrule / \bottomrule을 자동으로 넣는 설정)으로 다듬습니다. 이만큼 만들 수 있는 대신 문법은 무겁습니다. 따라서 정교한 숫자 표에는 pgfplotstable, 단순한 CSV → 표에는 csvsimple 이라는 구분이 좋은 기준입니다.
데이터베이스처럼 다루기 — datatool
세 번째 패키지인 datatool은 CSV를 데이터베이스 로 읽고, 각 행을 반복 처리하는 작업(메일 병합 같은 작업)에 강합니다. \usepackage{datatool}로 불러온 뒤 \DTLloaddb{name}{data.csv}로 CSV를 이름 붙은 데이터베이스에 넣습니다. 기본적으로 첫 줄은 머리글이고, 그 열 이름이 각 값의 키 가 됩니다. 머리글이 없는 CSV는 \DTLloaddb[noheader]{...}{...}로 읽으면 열이 Column1, Column2, … 로 자동 명명됩니다.
읽어 온 뒤에는 \DTLforeach{name}{assignments}{body} 로 각 행을 차례로 처리합니다. 할당은 \DTLforeach{db}{\Product=product,\Price=price}{…}처럼 “매크로 = 열 이름”으로 쓰며, 본문 안에서 \Product와 \Price가 그 행의 값으로 펼쳐집니다. 표로 만들 때는 tabular 안에서 \DTLforeach를 돌리고, 본문 끝에 행 끝 표시 \\를 둡니다.
\DTLloaddb{goods}{data.csv}
\begin{tabular}{l r}
\hline
Product & Price \\
\hline
\DTLforeach{goods}{\Product=product, \Price=price}{%
\Product & \Price \\}
\hline
\end{tabular}여기서는 CSV를 goods라는 이름으로 읽고, tabular 안에서 \DTLforeach가 각 행마다 “상품명 & 가격”을 출력합니다. datatool의 진짜 강점은 단순한 표 조판보다 데이터 조작 에 있습니다. 매크로로 숫자의 합계와 평균을 구하고, 정렬하고, 조건에 따라 행을 제외할 수 있으며, 참고문헌 목록이나 병합 문서 생성에도 쓰입니다. 반대로 CSV를 표로만 바꾸면 된다면 csvsimple이 더 간결합니다.
숫자를 소수점 기준으로 맞추기 — siunitx의 S 열
데이터가 CSV에서 왔든 아니든, 숫자가 나열된 열에는 공통 문제가 있습니다. 자릿수가 맞지 않으면 읽기 어렵다 는 점입니다. 손으로 쓴 tabular에서 이를 해결하는 표준 방법이 siunitx의 S 열 입니다. 열 지정에서 r 같은 것 대신 S를 쓰면 그 열의 숫자가 소수점 위치를 기준으로 정렬 됩니다. \usepackage{siunitx}를 불러오면 사용할 수 있습니다.
\begin{tabular}{l S[table-format=4.1]}
\toprule
{Product} & {Weight / \unit{\gram}} \\
\midrule
Apple & 182.5 \\
Orange & 95.0 \\
Melon & 1450.2 \\
\bottomrule
\end{tabular}이 예에서는 두 번째 열을 S[table-format=4.1], 즉 “정수 4자리, 소수 1자리”로 조판하여 182.5, 95.0, 1450.2를 소수점에 맞춥니다. 핵심은 두 가지 입니다. 첫째, table-format=integer.decimal은 그 열에서 가장 큰 값에 맞춰 지정해야 합니다. 둘째, 열 머리글 같은 텍스트는 중괄호 {…}로 감싸 보호 해야 합니다({Weight / \unit{\gram}}). 보호하지 않으면 siunitx가 머리글을 숫자로 읽으려 하고 정렬이 깨집니다.
S 열의 더 자세한 사용법, 즉 table-format 지정, 텍스트 보호, \multicolumn 안에서 쓸 수 있는 매크로 형태 \tablenum, 지수가 붙은 값 처리 등은 “단위(siunitx)” 페이지에서 다룹니다. 본문 속 물리량은 \qty, 표 안의 숫자는 S 열처럼 역할을 나누면 문서 전체의 숫자 표기가 일관됩니다.
무엇을 사용할까
목적에 따라 골라 쓰는 것이 가장 좋습니다. 대략적인 기준은 다음과 같습니다.
- 단순한 CSV → 표:
csvsimple. 즉석 표는\csvautotabular, 맞춤과 줄 제어는\csvreader. - 자릿수나 숫자 형식을 정교하게 만들거나 계산 열이 필요할 때:
pgfplotstable. 가장 강력하지만 문법은 더 무겁습니다. - 합계, 정렬, 조건 처리 같은 데이터 조작 이 주목적일 때:
datatool. 병합 문서에도 좋습니다. - 숫자 열을 소수점 기준으로 맞추기만 할 때:
siunitx의S열. 손으로 쓴tabular에 바로 넣을 수 있습니다.
어떤 방법을 쓰든 바탕은 같은 tabular 어휘, 즉 열 지정, &, \\, 줄입니다. 먼저 “tabular 기본”을 익힌 다음 데이터의 양과 필요한 서식에 맞춰 도구를 고르면 됩니다.