시험 문제를 만드는 교사가 LaTeX에 다다르는 이유는 대개 하나입니다. 문제지와 해답지를 따로 관리하면 언젠가 반드시 어긋난다는 것입니다. 문항을 고치고 해답 고치는 것을 잊고, 배점을 바꾸고 합계 고치는 것을 잊습니다. exam 클래스는 이를 구조로 해결합니다. 해답을 문항 바로 옆에 써 두고, \printanswers 한 줄이 있느냐 없느냐로 같은 소스에서 문제지와 해답지 두 가지 PDF가 나옵니다. 실제로 재어 보면 해답이 든 쪽이 2쪽, 빈 시험지가 3쪽입니다. 같은 파일에서 서로 다른 문서가 나오는 것입니다. 이 페이지는 그 exam 클래스와, 또 하나의 구조화된 문서인 학위논문을 다룹니다. report·book·memoir의 차이, \frontmatter가 정의되어 있지 않은 클래스, 그리고 가장 중요한 조언——대학의 템플릿과 싸우지 말 것——까지입니다.
exam 클래스의 뼈대 — \question, parts, 배점
exam 클래스의 구조는 세 단계의 중첩입니다. questions 환경 안에 \question, 그 아래 parts 환경의 \part, 다시 그 아래 subparts 환경의 \subpart입니다. 배점은 \question[10]처럼 대괄호로 주고, 클래스 옵션 addpoints를 붙이면 합계를 자동으로 계산합니다. 문항 수·총 배점·총 쪽수는 본문에서 \numquestions, \numpoints, \numpages로 참조할 수 있어 “총 4문항 30점 만점, 전 3쪽” 같은 안내문을 손으로 고칠 일이 없어집니다. 선택형 문제에는 네 가지 환경이 준비되어 있습니다. 세로로 늘어놓는 choices, 한 줄로 늘어놓는 oneparchoices, 그리고 체크박스가 붙는 checkboxes·oneparcheckboxes입니다. 정답 보기는 \choice가 아니라 \CorrectChoice로 쓰며, 이것이 뒤에서 설명할 해답 표시를 작동시킵니다.
배점을 어디에 인쇄할지는 세밀하게 고를 수 있습니다. 기본은 문항 번호 바로 뒤이지만, \pointsinmargin·\pointsinrightmargin으로 여백으로 밀어낼 수 있고, \pointsdroppedatright를 쓰면 오른쪽 여백이 “감점한 점수”를 적는 칸이 됩니다. “points”라는 낱말을 다른 말로 바꾸는 것도 \pointname을 한 줄 재정의하면 끝입니다. 머리말과 꼬리말은 \pagestyle{headandfoot}를 고른 뒤 \header{왼쪽}{가운데}{오른쪽}, \footer{왼쪽}{가운데}{오른쪽}의 세 토막으로 쓰고, 첫 쪽만 다르게 하려면 \firstpageheader·\runningheader를 나눠 씁니다. “2쪽 / 전 3쪽”을 인쇄하는 것이 이 클래스의 기본 장비이며, 그것만으로도 한 장이 빠진 답안지를 가려낼 수 있습니다.
\documentclass[addpoints,12pt]{exam}
\pagestyle{headandfoot}
\header{Calculus I --- Midterm}{}{Page \thepage\ of \numpages}
\begin{document}
\begin{center}\gradetable[v][questions]\end{center}
\begin{questions}
\question[10] Differentiate $f(x)=x^3$.
\question[5] Pick the correct answer.
\begin{oneparchoices}
\choice wrong \CorrectChoice right \choice wrong
\end{oneparchoices}
\question Answer both parts.
\begin{parts}
\part[3] State the definition.
\part[7] Prove the claim.
\end{parts}
\end{questions}
\end{document}\printanswers가 바꾸는 것 — 같은 소스에서 문제지와 해답지
\printanswers는 “해답을 보일지 말지”의 스위치이지만, 흥미로운 쪽은 해답을 감췄을 때 그 자리에 무엇이 놓이는가입니다. solution 환경은 인쇄하거나 인쇄하지 않을 뿐이지만, 대신 solutionorlines[2.5in]이라고 쓰면 해답 표시 때는 해답이, 감출 때는 2.5인치 분량의 괘선이 들어갑니다. 같은 발상으로 solutionorbox(테두리), solutionordottedlines(점선), solutionorgrid(모눈)가 마련되어 있습니다. 여섯 문항 모두를 solutionorlines[2.5in]으로 감싼 문서를 두 설정으로 각각 컴파일하면 \printanswers 판은 2쪽, \noprintanswers 판은 3쪽이 됩니다. 해답 문자열은 전자에 6번 나타나고 후자에는 한 번도 나타나지 않습니다. 한 쪽 늘어난 것은 감춰진 해답 대신 학생이 쓸 자리가 확보되었기 때문입니다.
% One source, two documents.
% \printanswers -> the key (measured: 2 pages, 6 solutions printed)
% \noprintanswers -> the paper (measured: 3 pages, 0 solutions printed)
\documentclass[addpoints,12pt]{exam}
\printanswers % comment this line out to get the blank paper
\begin{document}
\begin{questions}
\question[10] State the definition and prove the claim.
\begin{solutionorlines}[2.5in]
$f'(x)=3x^2$ by the power rule.
\end{solutionorlines}
\end{questions}
\end{document}운용상으로는 전환 수단이 둘이라는 점을 알아 두면 편합니다. 소스에 \printanswers를 쓰는 방법과 클래스 옵션 [answers]를 넘기는 방법인데, 출력은 동일합니다(같은 문서로 확인해 보면 둘 다 2쪽, 해답 6곳). 옵션 쪽은 본문을 전혀 고치지 않아도 되므로, latexmk나 Makefile에서 \PassOptionsToClass를 거쳐 두 종류의 PDF를 뽑는 빌드를 짤 수 있습니다. 또 cancelspace라는 옵션도 있는데, 해답도 내지 않고 해답란도 비우지 않습니다. 즉 solutionor… 환경의 대괄호 인수를 통째로 무시하고 문제만 늘어놓은 목록을 만듭니다. 기출문제를 연습지로 나눠 줄 때 안성맞춤입니다. 다만 cancelspace는 해답을 인쇄하는 동안에는 아무런 효과가 없습니다.
| 명령 · 환경 | printanswers일 때 | noprintanswers일 때 |
|---|---|---|
solution | 해답을 인쇄 | 아무것도 인쇄하지 않음 |
solutionorlines | 해답을 인쇄 | 지정한 높이만큼의 괘선 |
solutionorbox | 해답을 인쇄 | 지정한 높이의 빈 테두리 |
solutionorgrid | 해답을 인쇄 | 지정한 높이의 모눈 |
\fillwithlines | 전환과 무관하게 괘선을 인쇄 | 왼쪽과 같음 |
cancelspace | 효과 없음 | 대괄호 인수를 무시해 여백을 두지 않음 |
채점표 인쇄 — \gradetable과 \pointsonpage
\gradetable[v][questions] 한 줄로 표지에 문항 번호·배점·득점란이 늘어선 채점표가 나옵니다. 첫 인수는 방향(v는 세로, h는 가로), 둘째는 축으로 questions면 문항별, pages면 쪽별 표가 됩니다. 쪽 축의 표는 여러 사람이 나눠 채점할 때 진가를 발휘합니다. “3쪽은 아무개가 본다”는 운용에 그대로 대응하기 때문입니다. 집계용 명령도 갖춰져 있어 \pointsofquestion{3}은 3번 문항의 배점을, \pointsonpage{2}는 2쪽의 배점 합계를 돌려줍니다. addpoints 옵션과 함께 쓰면 배점을 고치는 순간 표와 합계가 동시에 따라옵니다. 손으로 덧셈하지 않는다는 그 한 가지가 이 기능의 값어치입니다. 가산점 문항에는 \bonuspoints와 별도의 보너스 표가 있습니다.
그런데 이 exam 클래스가 얼마나 진지하게 만들어졌는지는 매뉴얼의 두께로 알 수 있습니다. TeX Live 2024에 들어 있는 examdoc.pdf는 135쪽입니다. 시험을 조판한다는 한 가지 목적을 위한 클래스에 135쪽짜리 사용 설명서가 붙어 있는 것입니다. 쓴 사람은 웰즐리 대학 수학과의 Philip Hirschhorn으로, Model Categories and Their Localizations로 알려진 위상수학자입니다. 매뉴얼의 저작권 표시에는 개정 연도가 1994, 1997, 2000, 2004, 2008, 2011, 2015, 2017, 2021, 2023으로 늘어서 있습니다. 한 수학자가 자기 수업을 위해 30년 가까이 손질해 온 클래스라는 뜻입니다. TeX Live 2024 동봉판은 v2.704, 2023년 7월 9일자입니다.
학위논문 템플릿 — 대학이 주는 것과 싸우지 않기
결론부터 말하면 대학이 배포하는 클래스나 템플릿이 있다면 그것을 쓰고, 개조는 되도록 삼가세요. 이유는 조판이 아니라 심사에 있습니다. 여백, 행간, 표지 문구, 그림·표 번호 양식은 많은 기관에서 제출 요건으로 명문화되어 있고, 거기서 벗어난 논문은 내용과 무관하게 반려됩니다. 그리고 제출은 대개 마감 당일입니다. TeX Live 2024만 보아도 이름에 thesis나 diss가 들어가고 .cls를 제공하는 디렉터리가 64개 있습니다. mitthesis, ucbthesis, uiucthesis, thuthesis, njuthesis, ut-thesis, york-thesis 등입니다. CTAN에 올라오지 않는 지역 템플릿은 훨씬 더 많고, 그 대부분은 “선배에게서 물려받은 .cls”라는 형태로 유통됩니다.
그렇다면 그 템플릿은 속으로 무엇일까요. 거의 모든 경우 book이나 report 위에 정해진 표지와 여백 규정을 씌운 클래스입니다. 그래서 \chapter도 \tableofcontents도 평범하게 동작하고, 뒤집어 말하면 템플릿이 망가진 것처럼 보일 때 원인은 대개 토대 쪽에 있습니다. 지정이 없어 스스로 고른다면, 장 구성이 있는 논문은 report나 book이고, 체재를 더 세밀하게 제어하고 싶다면 memoir(TeX Live 2024에서는 v3.8.2, 2024년 1월 26일자이며 스스로 “configurable book, report, article document class”라고 밝힙니다)나 KOMA-Script의 scrbook·scrreprt입니다. 다음 절에서 실제로 무엇이 정의되어 있는지로 그 차이를 봅니다.
report와 book의 차이 — 양면인가 단면인가, 장은 오른쪽에서 시작하는가
차이는 기본 옵션에 적혀 있습니다. book.cls는 \ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright}이고, report.cls는 같은 줄이 oneside와 openany입니다. 즉 book은 양면 조판이고 장이 반드시 홀수 쪽(오른쪽 면)에서 시작하며, 그 때문에 빈 쪽이 끼어들기도 합니다. report는 단면 조판이라 장이 다음 쪽부터 그대로 시작합니다. 제본해서 제출하는 논문이라면 book의 동작이 맞고, PDF로 제출하고 양면 인쇄를 전제하지 않는다면 report가 더 자연스럽습니다. article은 애초에 \chapter가 없습니다. \chapter가 필요한가 아닌가가 클래스 선택의 첫 갈림길입니다.
| 클래스 | 기본 면 구성 | 장의 시작 | frontmatter |
|---|---|---|---|
article | oneside | \chapter가 존재하지 않음 | 정의되지 않음 |
report | oneside | openany(다음 쪽부터) | 정의되지 않음 |
book | twoside | openright(홀수 쪽) | 정의됨 |
memoir | book과 동일(설정 변경 가능) | openright(변경 가능) | 정의됨 |
scrbook | twoside | openright | 정의됨 |
scrreprt | oneside | openany | 정의되지 않음 |
\frontmatter가 ! Undefined control sequence가 되는 이유와 세 명령이 실제로 하는 일
\frontmatter·\mainmatter·\backmatter는 book 계열 클래스에만 정의되어 있습니다. \documentclass{report}에서 \frontmatter라고 쓰면 ! Undefined control sequence.가 나오고 l.3 \frontmatter가 지목됩니다. 실제로 클래스 파일을 검색해 보면 frontmatter라는 문자열은 book.cls, memoir.cls, scrbook.cls에는 있고 article.cls, report.cls, scrreprt.cls에는 없습니다. “대학 템플릿에서 \frontmatter가 안 먹는다”는 문의의 대부분이 이것이며, 원인은 그 템플릿의 토대가 report 계열이었다는 것뿐입니다. 장 번호 관련 동작이 필요 없다면 \pagenumbering{roman}과 \pagenumbering{arabic}을 손으로 써도 같은 효과를 얻습니다. 세 명령의 내용이 거의 그것뿐이기 때문입니다.
그러면 내용은 정확히 무엇인가. book.cls의 정의는 이렇습니다. \frontmatter는 \cleardoublepage를 하고 \@mainmatterfalse로 만든 뒤 \pagenumbering{roman}을 합니다. \mainmatter는 \cleardoublepage를 하고 \@mainmattertrue로 만든 뒤 \pagenumbering{arabic}을 합니다. 그리고 \backmatter는 쪽을 넘기고 \@mainmatterfalse로 만들 뿐, 쪽 번호에는 전혀 손대지 않습니다. 이 부분이 흔히 오해되는 곳으로, “뒷부분에서 쪽 번호가 바뀐다”고 적힌 설명은 틀렸습니다. \@mainmatter가 거짓일 때 실제로 달라지는 것은 \@chapter의 동작입니다. 장 번호를 올리지 않고, 제목에 번호를 인쇄하지 않으며, 목차에는 \numberline 없는 항목을 더합니다. 곧 앞부분과 뒷부분에서는 장이 번호 없이 나오지만 목차에는 실립니다. 감사의 글도 참고문헌도 번호는 붙지 않지만 목차에서 찾아갈 수 있다는 논문의 관행이, 이 스위치 하나로 구현되어 있습니다.
% Measured page labels from this exact file (book, 12pt):
% front matter -> i, ii, iii, iv (roman, chapters unnumbered but in the ToC)
% main matter -> 1, 2, 3, 4 (arabic, "Chapter 1", "Chapter 2")
% back matter -> 5 (still arabic; chapter unnumbered)
\documentclass[12pt]{book} % or your university's class
\begin{document}
\frontmatter
\chapter{Acknowledgements}
Thanks.
\tableofcontents
\mainmatter
\include{chapters/intro}
\include{chapters/method}
\backmatter
\chapter{Bibliography}
Refs.
\end{document}실무 — 장을 파일로 나누고, 마감 전날 무너뜨리지 않기
긴 논문에서 가장 먼저 할 일은 장마다 파일을 나누고 \include로 모으는 것입니다. \include는 각 파일의 앞뒤에서 쪽을 넘기므로 장 구분과 잘 맞고, 나아가 \includeonly{chapters/method}라고 쓰면 다른 장을 조판하지 않고 한 장만 컴파일하면서도 쪽 번호와 상호 참조를 그대로 유지합니다. 300쪽짜리 논문에서 7장만 고치고 싶을 때, 이것이 있고 없고에 따라 기다리는 시간이 자릿수로 달라집니다. 프로젝트 분할과 대규모 문서 다루기는 각각 전용 페이지가 있으니 related를 따라가세요. 마감 직전에 효험이 있는 습관이 하나 더 있습니다. 제출용 브랜치를 만들고 나서 체재를 건드릴 것. 여백을 1 mm 줄이고 싶어지는 것은 거의 예외 없이 제출 전날 밤입니다.
- 초록은
abstract환경에 씁니다. 다만 book 계열 클래스에서는\chapter*{Abstract}를 쓰라고 지정한 템플릿도 많으니 배포된 서식 안내부터 확인하세요. - 번호 없이도 목차에 실려야 하는 장은
\chapter*{...}뒤에\addcontentsline{toc}{chapter}{...}를 씁니다.\frontmatter안이라면 그냥\chapter로도 같은 결과가 됩니다. \include로 불러오는 파일에는\documentclass도\begin{document}도 쓰지 않습니다. 쓰면! LaTeX Error: Can be used only in preamble.가 납니다.- 제출 전에 반드시 클린 빌드를 한 번 통과시키세요.
.aux가 남아 있으면 이미 지운 상호 참조가 살아남은 채로 컴파일이 성공해 버립니다. - 대학 클래스를 고쳤다면 무엇을 고쳤는지 주석으로 남기세요. 석 달 뒤의 자신도, 후배도 그것을 읽게 됩니다.
끝으로 이 두 문서가 공유하는 구도를 하나. 시험도 논문도 내용과 체재를 서로 다른 사람이 관리하는 문서입니다. 시험에서는 출제자와 채점자, 논문에서는 집필자와 심사 기관입니다. LaTeX이 이 영역에서 강한 것은 조판이 아름다워서가 아니라 그 분리를 소스의 구조로 그대로 표현할 수 있기 때문입니다. \printanswers 한 줄이 문제지와 해답지를 가르고, \frontmatter 한 줄이 번호가 붙는 장과 붙지 않는 장을 가릅니다. 분기를 스위치 하나로 접어 넣을 수 있는가가 마감 전날 밤에 드러납니다.