試験・学位論文

試験問題を作る先生が LaTeX に行き着く理由は、たいてい一つです——問題用紙と解答をべつべつに管理していると、必ずどこかで食い違う。設問を一つ直したのに解答を直し忘れる、配点を変えたのに合計を直し忘れる。exam クラスはこれを構造で解決します。解答は設問のすぐ隣に書いておき、\printanswers の一行があるかないかで、同じソースから 問題用紙解答の二つの PDF が出る。実測すると、解答入りが 2 ページ、白紙版が 3 ページ——同じファイルから、別の文書が出ています。このページはその exam クラスと、もう一つの構造化文書である 学位論文reportbookmemoir の違い、\frontmatter が効かないクラス、そして「大学のテンプレートとは戦わない」という一番大事な助言)を扱います。

exam クラスの骨組み——\questionparts・配点

exam クラスの構造は 3 段の入れ子です——questions 環境のなかに \question、その下に parts 環境の \part、さらに subparts 環境の \subpart。配点は \question[10] のように角括弧で与え、クラスオプション addpoints を付けると 合計を自動で計算 します。設問数・総配点・総ページ数は \numquestions\numpoints\numpages で本文から参照できるので、「全 4 問 30 点満点、全 3 ページ」といった案内文を手で書き換える必要がなくなります。選択問題は 4 つの環境が用意されていて、縦に並べる choices、一行に並べる oneparchoices、そしてチェックボックス付きの checkboxesoneparcheckboxes。正解の選択肢は \choice ではなく \CorrectChoice で書き、これが後述の解答表示に効いてきます。

配点をどこに刷るかは細かく選べます。既定は設問番号の直後ですが、\pointsinmargin\pointsinrightmargin で余白に追い出せますし、\pointsdroppedatright なら「減点した点」を右端に書き込む欄になります。「points」という語を「点」に差し替えるのも \pointname の再定義一行です。ヘッダとフッタは \pagestyle{headandfoot} を選んだうえで \header{左}{中}{右}\footer{左}{中}{右} の 3 分割で書き、1 ページ目だけ違う体裁にしたいときは \firstpageheader\runningheader を使い分けます。「ページ 2 / 全 3 ページ」を刷るのがこのクラスの標準装備である——それだけで、途中の 1 枚が抜けた答案を見分けられます。

latex
\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(方眼)が用意されています。実際に 6 問すべてを solutionorlines[2.5in] で書いた文書を両方の設定でコンパイルすると、\printanswers 版は 2 ページ、\noprintanswers 版は 3 ページになりました。解答文字列は前者に 6 回現れ、後者には 1 回も現れません。1 ページ増えているのは、隠された解答のぶんだけ生徒が書く場所が確保されたからです。

latex
% 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 か所)。後者なら本体を一切書き換えずに済むので、latexmkMakefile から \PassOptionsToClass 経由で二種類の PDF を吐かせるビルドが組めます。さらに cancelspace というオプションもあり、これは「解答も出さず、解答欄も空けない」——つまり solutionor… 環境の角括弧引数を丸ごと無視した、問題文だけの一覧を作ります。過去問を配るときの下敷きに便利です。なお cancelspace は解答表示中には何の効果もありません。

命令・環境printanswers のときnoprintanswers のとき
solution解答を刷る何も刷らない
solutionorlines解答を刷る指定した高さぶんの罫線
solutionorbox解答を刷る指定した高さの空の枠
solutionorgrid解答を刷る指定した高さの方眼
\fillwithlines切り替えに関係なく罫線を刷る同左
cancelspace効果なし角括弧引数を無視し、余白を空けない

採点表を刷る——\gradetable\pointsonpage

\gradetable[v][questions] の一行で、表紙に 設問番号・配点・得点欄の並んだ採点表が出ます。第 1 引数は向き(v が縦、h が横)、第 2 引数は軸で、questions なら設問ごと、pages ならページごとの表になります。ページ軸の表は、複数人で分担採点するときに効きます——「3 ページ目は誰それが見る」という運用にそのまま対応するからです。集計まわりの命令も揃っていて、\pointsofquestion{3} は 3 問目の配点、\pointsonpage{2} は 2 ページ目の配点合計を返します。これらは addpoints オプションと組み合わせて使い、配点を書き換えると表も合計も同時に追随する——手で足し算をしないという一点が、この機能の値打ちです。加点問題は \bonuspoints と対応する bonus 用の表があります。

ところで、この exam クラスがどれだけ真面目に作られているかは、マニュアルの厚みで分かります。TeX Live 2024 に入っている examdoc.pdf135 ページ。試験を組むという一つの目的のためのクラスに、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 だけを見ても、thesisdiss を名前に含み .cls を提供するディレクトリが 64 個 あります——mitthesisucbthesisuiucthesisthuthesisnjuthesisut-thesisyork-thesis……。ここに載らないローカルなテンプレートはさらに大量にあり、その多くは「先輩から引き継いだ .cls」という形で流通しています。

では、そのテンプレートは中身として何なのか。ほとんどの場合、bookreport の上に表紙と余白の規定を被せただけのクラスです。だから \chapter\tableofcontents も普通に動きますし、逆に言えば、テンプレートが壊れているように見えるときの原因はたいてい土台の側にあります。指定が無い場合に自分で選ぶなら、章立てのある論文は reportbook、より細かく体裁を制御したいなら memoir(TeX Live 2024 では v3.8.2、2024 年 1 月 26 日付。自ら「configurable book, report, article document class」を名乗ります)か KOMA-Script の scrbookscrreprt です。次の節でその違いを、実際に何が定義されているかで見ます。

reportbook の違い——両面か片面か、章は右から始まるか

違いは既定オプションに書いてあります。book.cls\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright}report.cls は同じ行が onesideopenany になっています。つまり book は両面組みで、章が必ず奇数ページ(右ページ)から始まり、そのために白ページが挿入されることがあります。report は片面組みで、章は次のページからそのまま始まります。製本して提出する論文なら book の挙動が正しく、PDF で提出して両面印刷を前提としないなら report のほうが素直です。article はそもそも \chapter を持ちません——\chapter が使えるかどうかが、クラス選びの最初の分岐点です。

クラス既定の面付け章の開始frontmatter
articleoneside\chapter が存在しない未定義
reportonesideopenany(次のページから)未定義
booktwosideopenright(奇数ページ)定義済み
memoirbook 相当(設定で変更可)openright(変更可)定義済み
scrbooktwosideopenright定義済み
scrreprtonesideopenany未定義

\frontmatter! Undefined control sequence になる理由と、三つが実際にやること

\frontmatter\mainmatter\backmatterbook 系のクラスにしか定義されていません\documentclass{report}\frontmatter と書くと ! Undefined control sequence. が出て l.3 \frontmatter が指されます。実際、クラスファイルを検索すると frontmatter の文字列は book.clsmemoir.clsscrbook.cls にはあり、article.clsreport.clsscrreprt.cls にはありません。「大学のテンプレートで \frontmatter が効かない」という相談の大半はこれで、原因はテンプレートの土台が report 系だったというだけのことです。章立てが要らないなら \pagenumbering{roman}\pagenumbering{arabic} を手で書けば同じ効果が得られます——それがまさに、この三つの命令の中身だからです。

では中身は正確に何か。book.cls の定義はこうです。\frontmatter\cleardoublepage して \@mainmatterfalse にし \pagenumbering{roman}\mainmatter\cleardoublepage して \@mainmattertrue にし \pagenumbering{arabic}。そして \backmatter は改ページして \@mainmatterfalse にするだけで、ページ番号には一切触りません。ここは誤解されがちなところで、「後付けでページ番号が変わる」と書いてある解説は間違いです。\@mainmatter が偽のとき何が変わるかというと \@chapter の挙動で、章番号を進めず、見出しに番号を刷らず、目次には \numberline なしの項目を追加します——つまり 前付けと後付けでは章が番号なしで出るが、目次には載る。謝辞も参考文献も番号は付かないが目次からは辿れる、という論文の作法が、この一つのスイッチで実現されています。

latex
% 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} と書けば 他の章を組版せずに 1 章だけコンパイルできて、しかもページ番号と相互参照は保たれます。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. になる
  • 提出前に必ずクリーンビルドを 1 回通す。 .aux が残っていると、消したはずの相互参照が生き残って通ってしまう
  • 大学のクラスを改造したときは、改造点をコメントで残す。3 か月後の自分も、後輩も、それを読むことになる

最後に、この二つの文書に共通する構図を一つ。試験も論文も、内容と体裁がべつの人間に管理されている文書です。試験では出題者と採点者、論文では執筆者と審査機関。LaTeX がこの領域で強いのは組版が美しいからではなく、その分離をソースの構造としてそのまま表現できるからです。\printanswers の一行が問題用紙と解答を分け、\frontmatter の一行が番号の付く章と付かない章を分ける。分岐をスイッチ一つに畳み込めるかどうかが、締切の前日に効いてきます。