beamer

\usetheme{Madrid}, \usetheme{Warsaw}, \usetheme{Singapore}——LaTeX의 발표 슬라이드용 클래스 beamer가 현행 presentation theme으로 담고 있는 27개는 하나도 빠짐없이 도시 이름입니다. 이유는 저자가 매뉴얼에 직접 써 두었습니다. 이름 지을 아이디어가 바닥났고, 고른 도시는 자신이나 공저자가 학회·워크숍에 참석했던 곳이기 때문입니다. 이 가벼움은 beamer 전체의 성격이기도 합니다. beamer를 쓰는 일은 다른 LaTeX 문서를 쓰는 일과 거의 같고, 단 한 가지만 다릅니다. 단위가 페이지가 아니라 frame이라는 점입니다. 이 페이지는 그 한 가지에서 출발해 frame, 오버레이, 테마, 그리고 verbatim이 들어가는 순간 슬라이드가 깨지는 이유까지 차례로 살펴봅니다.

보통의 문서 클래스와 다른 점

\documentclass{beamer}를 쓰는 순간부터 페이지를 다루는 도구들이 듣지 않습니다. \newpage를 frame 안에 두어도 오류도 경고도 나지 않고 그냥 무시됩니다. 실제로 시험해 보면 \newpage를 사이에 둔 두 단락이 한 장의 슬라이드에 나란히 나옵니다. 이유는 단순합니다. beamer에서 페이지 넘김을 정하는 것은 저자가 아니라 frame의 경계이기 때문입니다. 같은 이치로 \section{...}도 본문에는 아무것도 표시하지 않습니다(목차와 내비게이션에 등록될 뿐입니다). 그리고 \begin{frame} 바깥에 쓴 글도 오류가 되지 않고 테마가 붙지 않은 맨 페이지로 출력됩니다. “왜인지 이상한 페이지가 한 장 섞인다”의 원인은 대개 이것입니다.

종이 문서와 다른 또 한 가지는 치수입니다. beamer는 용지가 아니라 화면을 조판합니다. 기본은 4:3이며 beamer.cls\beamer@paperwidth{12.80cm} / \beamer@paperheight{9.60cm}이라고 적혀 있습니다. 곧 128 mm × 96 mm입니다. 클래스 옵션으로 비율을 바꿀 수 있어서 \documentclass[aspectratio=169]{beamer}라면 160 mm × 90 mm의 16:9가 됩니다. TeX Live 2024 동봉판이 개별적으로 가진 값은 1610, 169, 149, 54, 43, 32, 141, 2013의 여덟 개입니다. 다만 흥미로운 것은 목록에 없는 값의 처리입니다. 목록에 없는 수를 넘기면 beamer는 높이를 9.60 cm에 고정한 뒤 숫자를 자릿수로 나눠 비율을 계산합니다. aspectratio=21이라고 쓰면 실제로 2:1, 곧 너비 19.2 cm의 슬라이드가 그대로 나옵니다. 본문 글자 크기는 \documentclass[11pt]{beamer}처럼 지정할 수 있고 기본값은 11pt입니다.

frame 환경 — 슬라이드 한 장과 한 페이지는 다릅니다

beamer의 주역은 frame 환경입니다. \begin{frame}부터 \end{frame}까지가 논리적인 한 화면이며, 그 안에 목록, 그림, 수식을 넣습니다. 제목은 \frametitle{...}로 붙이거나 \begin{frame}{Title}처럼 환경의 인수로 넘깁니다. 여기서 중요한 것은 하나의 frame이 반드시 한 페이지는 아니라는 점입니다. 다음 절의 오버레이를 쓰면 같은 frame에서 여러 PDF 페이지가 생성되고, 넘기면 단계 표시로 보입니다. frame은 논리적인 한 화면, PDF 페이지는 그중 한 컷입니다. beamer의 문서 자체가 앞의 것을 frame, 뒤의 것을 slide라고 구분해 부릅니다.

frame은 대괄호로 옵션을 받습니다. 특히 자주 쓰는 것은 내용이 세로로 넘칠 때의 [allowframebreaks]입니다. 이것을 붙이면 beamer가 frame을 필요한 만큼의 페이지로 나누고, 게다가 frame 제목 끝에 로마 숫자를 자동으로 붙입니다. 22개짜리 목록을 흘려 넣으면 첫 쪽 제목은 “Long I”, 둘째 쪽은 “Long II”가 됩니다. 그 밖에 세로 위치를 맞추는 [t](위), [c](가운데), [b](아래), 테마 장식을 걷어 내 그림을 화면 가득 채우는 [plain], 나중에 \againframe으로 다시 부르기 위한 [label=...], frame 번호에 세지 않게 하는 [noframenumbering]이 있습니다. 다음 절의 [fragile]도 같은 자리에 씁니다.

제목 정보는 article 등과 마찬가지로 프리앰블에서 선언합니다. \title{...}, \author{...}, \institute{...}, \date{...}를 쓰고, 본문에서는 \titlepage를 frame 하나에 넣으면 제목 슬라이드가 조판됩니다(\maketitle도 같은 결과입니다). 긴 발표라면 \section{...}으로 나누면 그 정보가 각 슬라이드 위쪽 내비게이션에 반영됩니다. 구분을 선언한 뒤 \tableofcontents를 frame 하나에 두면 목차 슬라이드가 되고, \tableofcontents[currentsection]이라고 하면 지금 있는 절만 강조한 형태가 됩니다. 각 절의 머리에 자동으로 넣고 싶다면 프리앰블에서 \AtBeginSection[]{...}으로 이 목차 프레임을 심어 둡니다.

오버레이 — \pause<2->의 차이

내용을 조금씩 제시하는 것이 오버레이이며, 입구는 둘입니다. \pause는 frame 중간에 두기만 하면 그 뒤가 다음 슬라이드로 넘어갑니다. 간편하지만 소스 순서대로 하나씩 쌓아 가는 형태만 만들 수 있습니다. 다른 하나는 오버레이 지정, 곧 명령 바로 뒤에 붙이는 산괄호 <...>입니다. \item<1->은 “1컷째 이후 계속”, \item<2>는 “2컷째만”, \item<2->는 “2컷째 이후”입니다. <-2,4-5,7>처럼 범위와 건너뛰는 번호를 함께 늘어놓을 수도 있습니다. 실제로 조판해 확인하면 쓴 그대로 동작합니다. \item<3>을 붙인 항목은 셋째 컷에서 나타나고, \only<2>{...}는 둘째 컷에서만 보이며, \uncover<3->{...}는 셋째 컷부터 보이기 시작합니다.

명령동작숨어 있을 때의 공간
\pause이후 내용을 다음 슬라이드로 보냄차례로 추가되므로 문제가 되지 않음
\uncover<2->{...}지정한 컷에서 나타남항상 확보되어 레이아웃이 밀리지 않음
\onslide<2->{...}지정한 컷에서 표시, 그 외에는 숨김항상 확보
\only<2>{...}지정한 컷에만 출력확보하지 않아 뒤 내용이 당겨짐
\alert<2>{...}지정한 컷에서 강조색으로 바뀜항상 보이므로 항상 확보됨
[<+->]목록 환경에 붙이면 모든 항목을 자동으로 차례로 넘김\uncover와 같은 취급

이 표에서 값어치를 하는 것은 세 번째 열입니다. \uncover\onslide는 숨어 있는 동안에도 공간을 확보하므로 항목이 나타나도 주변이 움직이지 않습니다. \only는 출력 자체를 넣고 빼기 때문에 숨겨진 만큼의 공간이 회수되어 뒤의 내용이 위아래로 밀립니다. 식의 일부를 갈아 끼우는 용도라면 바로 그것이 정답이지만, 목록을 차례로 보여 주기만 할 때는 함정이므로 \uncover[<+->]가 안전합니다. 같은 오버레이 문법은 \alert뿐 아니라 \textbf\textcolor에도 붙으므로 “이 컷에서만 굵게”도 새 문법 없이 쓸 수 있습니다.

latex
% the blunt instrument: everything after \pause moves to the next slide
\begin{frame}{Results}
  \begin{itemize}
    \item First point
    \pause
    \item Second point
  \end{itemize}
\end{frame}

% overlay specifications: say exactly which slides each piece belongs to
\begin{frame}{Results}
  \begin{itemize}
    \item<1-> Always there
    \item<2-> From slide two
    \item<3>  Slide three only
  \end{itemize}
  \only<2>{Shown on slide 2, and takes no space otherwise}
  \uncover<3->{Space is reserved from the start, ink appears on slide 3}
\end{frame}

% the same stepwise reveal, without numbering each item by hand
\begin{frame}{Results}
  \begin{itemize}[<+->]
    \item Observation
    \item Interpretation
    \item Limitation
  \end{itemize}
\end{frame}

테마 — 도시 이름, 나는 동물, 꽃, 바다 생물

테마는 다섯 종류가 있고, 이름만 보면 어느 종류인지 알 수 있게 되어 있습니다. 첫머리에서 언급한 도시 이름(Madrid, Warsaw, Berlin, Singapore 등)은 presentation theme, 곧 전체를 한꺼번에 정하는 것입니다. 색 테마의 명명은 한층 철저해서 매뉴얼이 직접 정답을 밝혀 둡니다. 나는 동물(albatross, beetle, crane)은 모든 색을 스스로 지정하는 “완전한” 색 테마, (lily, orchid, rose)은 block 같은 내부 요소의 색만 바꾸는 내부 색 테마, 바다 생물(whale, dolphin, seahorse)은 머리말·꼬리말·사이드바의 배색을 다루는 외부 색 테마입니다. 즉 \usecolortheme{whale}이라고 쓴 시점에 이미 그것이 테두리 주변만 건드리는 지정임을 이름이 알려 주는 셈입니다.

명령정하는 것
\usetheme레이아웃, 내비게이션, 배색을 한꺼번에\usetheme{Madrid}(도시 이름)
\usecolortheme배색만 교체\usecolortheme{seahorse}(바다 생물=외부)
\usefonttheme제목과 본문의 서체\usefonttheme{serif}, \usefonttheme{professionalfonts}
\useinnertheme내부 요소의 체재(목록 기호, block 모양)\useinnertheme{rounded}
\useoutertheme테두리 체재(머리말, 꼬리말, 사이드바)\useoutertheme{infolines}

실무에서는 먼저 \usetheme{...}을 하나 고르고, 마음에 들지 않는 부분만 아래 네 명령으로 덮어쓰는 것이 빠릅니다. 목적에서 고르세요. 내비게이션 바가 거슬리면 MadridBoadilla, 반대로 현재 위치를 보여 주고 싶으면 FrankfurtWarsaw입니다. 더 현대적인 모양을 원한다면 metropolis(\usetheme{metropolis})가 정석입니다. beamer 본체에 딸린 것은 아니지만 TeX Live에 별도 패키지로 들어 있습니다. 한 가지 경고: 테마를 이리저리 바꿔 보는 일은 오후 한나절을 확실하게 잡아먹습니다. 청중이 보는 것은 배색이 아니라 내용이니, 일찌감치 하나로 정하고 글쓰기로 돌아가세요.

block과 columns — 테두리로 감싸기, 좌우로 나누기

내용을 테두리 상자로 감싸 강조하려면 block 환경을 씁니다. \begin{block}{Title}…\end{block}이면 테마 배색에 맞는 제목 달린 상자가 됩니다. 경고 느낌의 alertblock, 예시용 exampleblock도 쓰는 법이 같고, 정리와 정의에는 theorem, definition 환경을 그대로 쓸 수 있습니다(beamer가 amsthm을 자동으로 읽어 들입니다). 슬라이드를 좌우로 나누려면 columns 환경 안에 \column{width}를 늘어놓습니다. 그림과 설명을 나란히 놓을 때의 정석입니다.

latex
\begin{frame}{Comparison}
  \begin{columns}
    \column{0.5\textwidth}
      \begin{block}{Before}
        The old estimate.
      \end{block}
    \column{0.5\textwidth}
      \begin{alertblock}{After}
        The corrected one.
      \end{alertblock}
  \end{columns}
\end{frame}

verbatim을 넣으면 깨지는 이유와 [fragile]

verbatim 환경이나 listingslstlisting(소스 코드 표시)을 frame 안에 넣으면 \begin{frame}[fragile]이라고 쓰지 않는 한 컴파일이 멈춥니다. 성가신 것은 멈추는 방식입니다. TeX Live 2024에서 시험해 보면 beamer는 행 번호가 아니라 파일 전체를 가리키며 이렇게 말합니다. Runaway argument?에 이어 ! File ended while scanning use of \@xverbatim., 그리고 I suspect you have forgotten a }, causing me to read past where you wanted me to stop., 마지막으로 ! Emergency stop.입니다. 쓴 적도 없는 \@xverbatim이라는 내부 명령 이름이 나오고, 닫는 괄호를 빠뜨렸다고 단정합니다. 그러나 괄호는 어디도 어긋나지 않았습니다. 이 조언을 따라 중괄호를 다시 세면 원인이 없는 곳을 하염없이 뒤지게 됩니다.

진짜 원인은 괄호가 아니라 읽어 들이는 순서입니다. beamer는 frame의 내용을 한 번에 통째로 인수로 읽어 들인 뒤, 오버레이 컷 수만큼 다시 조판합니다. 그런데 verbatim은 “읽어 들일 때 문자의 취급을 바꾸는” 방식이라, 이미 삼켜진 내용에 대해서는 이미 늦습니다. 오류가 Runaway argument?(인수가 폭주했다)로 시작하는 것이 그 때문이며, 바로 인수로 읽히는 도중에 사고가 납니다. [fragile]을 붙이면 beamer는 다른 길로 갑니다. 사용자 안내서의 표현을 빌리면 frame의 내용은 일단 외부 파일에 써낸 뒤 다시 읽어 들여집니다. 실제로 컴파일해 보면 작업 디렉터리에 확장자가 .vrb인 파일이 하나 늘어난 것을 확인할 수 있습니다. 내용은 frame의 본문 그대로입니다.

이 “외부 파일 경유”라는 구조가 또 하나의 규칙을 낳습니다. 사용자 안내서가 명시한 대로, [fragile]을 붙인 frame에서는 \end{frame}을 줄머리에 단독으로 두어야 합니다(앞의 공백은 허용). beamer가 “줄머리의 \end{frame}”이라는 문자열로 써내기의 끝을 찾기 때문이며, \end{verbatim} \end{frame}처럼 한 줄에 묶으면 이번에는 다른 내부 명령 이름으로 똑같이 넘어집니다. ! File ended while scanning use of \next.입니다. 한 가지 더, verbatim 안에서는 \alert<2>{...} 같은 오버레이 명령이 듣지 않습니다. 문자를 그대로 내보내는 것이 verbatim의 본업이기 때문입니다. 코드의 일부를 강조하고 싶다면 beamer가 직접 마련한 semiverbatim 환경을 쓰세요. verbatim과 거의 같지만 \, {, }만 명령으로 살아남으므로 \alert<2>{...}를 끼워 넣을 수 있습니다.

latex
\begin{frame}[fragile]{An algorithm}   % [fragile] -> body goes via a .vrb file
\begin{verbatim}
int main(void) { return 0; }
\end{verbatim}
\end{frame}                            % must be alone on its own line

% to highlight part of a listing, use semiverbatim rather than verbatim
\begin{frame}[fragile]{Highlighted}
\begin{semiverbatim}
for (int i = 2; i < 100; i++)
  \alert<2>{if (is_prime[i])}
\end{semiverbatim}
\end{frame}

컴파일되는 최소 beamer 문서

다음은 테마, 제목 슬라이드, 단계 표시 목록을 갖춘 최소 구성입니다. 프리앰블에서 테마와 제목 정보를 선언하고, 본문에서는 첫 frame에 \titlepage, 다음 frame에 [<+->]가 붙은 목록을 둡니다. frame은 둘이지만 오버레이 덕분에 PDF는 4쪽으로 펼쳐집니다. 일본어 슬라이드로 만들려면 LuaLaTeX에서 luatexja를 읽어 들이는 등 엔진에 맞는 일본어 지원을 프리앰블에 더하세요.

latex
\documentclass[aspectratio=169,11pt]{beamer}
\usetheme{Madrid}
\usecolortheme{seahorse}

\title{My Talk}
\author{Ada Lovelace}
\institute{Analytical Engine Lab}
\date{\today}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}{Overview}
  \begin{itemize}[<+->]
    \item Background
    \item Method
    \item Results
  \end{itemize}
\end{frame}

\end{document}

발표 자료로 쓸 때의 순서

beamer는 논문을 잘게 자르는 도구가 아닙니다. 먼저 발표 흐름을 “문제・방법・결과・결론” 정도로 나누고, 각 frame에는 주장을 딱 하나만 둡니다. 본문 원고에서 긴 단락을 붙여 넣지 말고 그림・식・짧은 목록으로 압축한 다음, 단계 표시가 정말 효과를 내는 자리에만 \pause<2->를 더하세요. 오버레이는 설명의 순서를 제어하는 도구이지 장식이 아닙니다.

  • 화면비를 먼저 정한다 — 투영 환경을 안다면 무엇을 설계하기 전에 aspectratio=16943을 못 박아 둡니다. 나중에 바꾸면 배치해 둔 그림이 전부 어긋납니다.
  • 한 장의 밀도 — 목록은 3~5개까지. 넘칠 때는 [allowframebreaks]로 도망치기보다 frame을 나누는 편이 대체로 더 읽기 좋습니다.
  • 코드와 로그verbatim, lstlisting, minted가 든 frame에는 반드시 [fragile]을 붙이고 \end{frame}을 단독 줄에 둡니다.
  • 그림을 크게 보여 줄 frame[plain]을 붙이면 테마의 테두리 장식이 걷혀 화면을 가득 쓸 수 있습니다.
  • 배포용 PDF — 발표용과 배포용은 서로 다른 문서입니다. handout 모드로 오버레이를 접는 법과 발표자 노트 작성법은 “핸드아웃 및 배포 자료” 페이지에서 다룹니다.