데이터로 표 만들기

표의 내용이 이미 .csv 파일 같은 외부 데이터 로 존재한다면 각 셀을 손으로 다시 입력할 필요가 없습니다. LaTeX에는 CSV를 읽어 표로 바꾸는 패키지가 여러 개 있어서, 데이터가 바뀌어도 원본을 다시 고칠 필요가 없습니다. 이 페이지에서는 빠른 csvsimple, 서식 지정에 강한 pgfplotstable, 데이터베이스처럼 다루는 datatool 세 가지를 언제 쓰면 좋은지와 함께 소개합니다. 마지막으로 숫자를 소수점 기준으로 맞추는 siunitxS 열도 다룹니다(S 열의 자세한 내용은 “단위(siunitx)” 페이지에서 설명합니다).

데이터에서 표를 만드는 이유

실험 결과나 집계표는 대개 스프레드시트나 측정 장비에서 CSV(쉼표로 구분한 값) 로 나옵니다. 이것을 tabular 셀에 손으로 옮기는 일은 지루하고 오류가 나기 쉽습니다. 행이 하나 늘거나 숫자 한 자리가 바뀔 때마다 원고를 다시 고쳐야 합니다.

생각을 바꿔서 데이터는 데이터 파일에 둔 채 LaTeX에는 “읽어서 조판하라”고만 지시할 수 있습니다. 그러면 데이터를 갱신하고 다시 컴파일하는 것만으로 표도 따라 바뀝니다. 원본 CSV 하나만 있으면 본문, 슬라이드, 부록에서 같은 숫자를 여러 번 재사용할 수 있고, 옮겨 적는 실수도 없습니다. 이런 “데이터와 표현의 분리”는 논리 구조와 모양을 나누는 LaTeX의 방식과 맞닿아 있습니다.

이 페이지의 예제에서는 아래의 작은 CSV 파일을 사용합니다. 첫 줄은 product, price, weight라는 열 이름을 가진 머리글 행 이고, 나머지 줄이 데이터입니다.

data.csv
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에 넣고, 첫 줄을 머리글로 삼아 줄이 있는 표를 만들어 줍니다. 내용을 빠르게 표로 확인할 때 알맞습니다.

latex
\csvautotabular{data.csv}

이 한 줄만으로 product, price, weight를 머리글로 하는 3열 3행 표가 만들어집니다. 편리하지만 서식을 자유롭게 정하기는 어렵습니다. 열 맞춤, 줄, 사용할 열을 직접 정하고 싶다면 \csvreader를 사용합니다. 이것이 csvsimple의 핵심 명령입니다.

\csvreader\csvreader[options]{data.csv}{assignments}{body} 형태의 세 인수를 받습니다. 두 번째 인수 는 읽을 파일, 세 번째 는 열 이름을 매크로에 묶는 할당, 네 번째 는 각 행에서 출력할 내용입니다. 예를 들어 price=\price라고 쓰면 price 열의 값을 본문 안에서 \price로 사용할 수 있습니다. 표의 틀은 tabular=table head=(머리글 행) 같은 옵션으로 지정합니다.

latex
\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=commacol sep=commaCSV(쉼표 구분)로 읽음. 기본값은 공백 구분
headerheader=has colnames / header=false1행을 열 이름으로 처리 / 머리글 없음으로 처리
columnscolumns={a,b,...}출력할 열과 순서를 선택
columns/NAME/.stylecolumns/price/.style={...}특정 이름의 열에만 서식 적용
column namecolumn name=머리글그 열에 출력되는 머리글을 바꿈
fixedfixed, fixed zerofill, precision=n고정소수점, 뒤쪽 0 채움, 소수 n자리
scisci, sci zerofill과학 표기(지수 형식)로 조판
string typestring type문자열 열(숫자 서식을 적용하지 않음)
dec sep aligndec sep align열을 소수점 기준으로 맞춤(array 필요)
latex
\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를 돌리고, 본문 끝에 행 끝 표시 \\를 둡니다.

latex
\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에서 이를 해결하는 표준 방법이 siunitxS 입니다. 열 지정에서 r 같은 것 대신 S를 쓰면 그 열의 숫자가 소수점 위치를 기준으로 정렬 됩니다. \usepackage{siunitx}를 불러오면 사용할 수 있습니다.

latex
\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. 병합 문서에도 좋습니다.
  • 숫자 열을 소수점 기준으로 맞추기만 할 때: siunitxS 열. 손으로 쓴 tabular에 바로 넣을 수 있습니다.

어떤 방법을 쓰든 바탕은 같은 tabular 어휘, 즉 열 지정, &, \\, 줄입니다. 먼저 “tabular 기본”을 익힌 다음 데이터의 양과 필요한 서식에 맞춰 도구를 고르면 됩니다.