卒研で使ったTeXテンプレートを晒す

## はじめに

この記事は [長野高専 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nnct) の15日目の記事です。前年度までの主催者な上にOBなのにも関わらず執筆時点で遅刻しています。 ~~本当に申し訳ない…~~

さて皆さん卒業研究は行っているでしょうか？長野高専の場合、4年生の後期から体験配属があり、5年生から本格的な研究が始まると思います。卒業研究で必須なものは何でしょうか？それは卒業論文です！これと研究発表会をこなすことで晴れて高専を卒業することが出来ます。

卒研の執筆にはLaTeXを使うことが多いと思います(一部の人はWordやTypstかもしれませんが…)。ただし、LaTeXは古い情報も含めてネット上に情報が多く、初心者には取捨選択が難しいです。そこで、今回は私が卒論で使ったLaTeXテンプレートを晒します。これをそっくりそのまま使ってもいいですし、参考にして自分の好みに合わせてカスタマイズしてもいいです。とにかく、何かしらの参考になれば幸いです。

## テンプレート全文

早速ですが、これがテンプレートの全文です。これを`main.tex`として保存して、`src`ディレクトリに`index.tex`として本文を書いています。

```tex
% クラスファイルを指定
% jlreqはW3Cで勧告されている日本語組版処理の要件を満たすクラスファイル
% jarticle, jreport, jbookなどは古い上に日本語組版処理の要件を満たしていないため使わない
\documentclass[
  % LuaLaTeXを使う
  luatex,
  % 用紙サイズをA4にする
  paper=a4paper,
  % 欧文のフォントサイズを11ptにする
  fontsize=11pt,
  % レポート形式
  report,
  % 日本語組版処理の記述と矛盾する設定がある場合に通知
  jlreq_notes,
]{jlreq}

% jlreqsetupで色々設定できるようにする
\usepackage{jlreq-complements}

% jlreqの設定
\jlreqsetup{
  % 参考文献の見出しの出力命令を設定
  thebibliography_heading={
    % 見出しを章にする
    \chapter*{\refname}
    % 目次に追加
    \addcontentsline{toc}{chapter}{\refname}
  },
}

% 画像を扱う
\usepackage{graphicx}

% pdfのハイパーリンクを設定
\usepackage[hidelinks]{hyperref}

% 相対パスでファイルを読み込む
\usepackage{import}

% 章やページの合計を扱う
\usepackage{totcount}

% 数式関連
\usepackage{amsmath,amssymb}
\usepackage{mathtools}
% 参照した数式番号のみを表示する
% \mathtoolsset{showonlyrefs=true}

% 数式のフォントを変更
% amsmathより後に読み込む必要がある
\usepackage[
  % mathtoolsと一部競合するため，警告を無視
  warnings-off={mathtools-colon,mathtools-overbracket}
]{unicode-math}
\unimathsetup{math-style=TeX,bold-style=TeX}
\setmainfont[Ligatures=TeX]{Latin Modern Roman}
\setsansfont[Ligatures=TeX]{Latin Modern Sans}
\setmonofont{Latin Modern Mono}
\setmathfont{Latin Modern Math}
% \setmathfont{XITS Math}[range={scr,bfscr}]% Latin Modern Mathにscr体がないので

% フォントを設定
% unicode-mathの後でないとフォントが変更されない
\usepackage[
  % ヒラギノ明朝(プロポーショナル)を使用
  hiragino-pron,
  % 多ウェイト化を有効にする
  deluxe,
  % jlreqで使えるようにする
  jfm_yoko=jlreq,
  jfm_tate=jlreqv,
]{luatexja-preset}


% 単位付き数値の入力を楽にする
\usepackage{siunitx}

% 数式の記述を楽にする
\usepackage{physics2}
% 括弧のサイズを自動調整する
\usephysicsmodule{ab}
% 行列の記述を楽にする
\usephysicsmodule{diagmat}
\usephysicsmodule{xmat}

% 微分記号の入力を楽にする
\usepackage{derivative}

% svgを扱う
\usepackage{svg}

% 表の罫線を扱う
\usepackage{booktabs}

% キャプションを設定
\usepackage[hang,small,bf]{caption}
\usepackage[subrefformat=parens]{subcaption}
\captionsetup[subfigure]{labelformat=simple}
\renewcommand{\thesubfigure}{(\alph{subfigure})}

% ソースコードを扱う
\usepackage{listings}
\lstset{
  % タブの展開後のサイズ
  tabsize={4},
  % 行番号表示，デフォルト: none 他のオプション: left, right
  numbers=left,
  % 書体の指定，行番号の書体指定
  basicstyle={\small},
  % 識別子の書体指定
  identifierstyle={\small},
  % 行番号の書体指定
  %numberstyle=\scriptsize,
  % 注釈の書体。
  commentstyle={\small\ttfamily},
  ndkeywordstyle={\small},
  % キーワードの書体指定。
  keywordstyle={\small\bfseries},
  stringstyle={\small\ttfamily},
  columns=[l]{fullflexible},
  xrightmargin=0\zw,
  xleftmargin=0\zw,
  numbersep=1\zw,
  %backgroundcolor={\color[gray]{.85}},
  % frameの指定．デフォルト: none 他のオプション: leftline, topline, bottomline, lines, single, shadowbox
  frame=lines,
  % 行が長くなってしまった場合の改行．デフォルト: false
  breaklines=true,
}

% 図や表や式の参照用マクロ
\newcommand{\figref}[1]{\figurename~\ref{#1}}
\newcommand{\tabref}[1]{\tablename~\ref{#1}}
\newcommand{\eqnref}[1]{式~\eqref{#1}}

% 便利マクロ
\newcommand{\F}{\symscr{F}} % フーリエ変換
\newcommand{\ccolumn}[1]{\multicolumn{1}{c}{#1}} % 中央揃えの表のセル

\regtotcounter{chapter}

\begin{document}

% 表紙
\begin{titlepage}
  \noindent
  \centering

  \vfill

  \LARGE{令和5年度 卒業論文}

  \vspace{10mm}

  \Huge{<日本語タイトル>}

  \vspace{2mm}

  \LARGE{<英語タイトル>}

  \vfill

  \Large{長野工業高等専門学校}

  \Large{電子情報工学科5年}

  \Large{<教員>研究室}

  \vspace{5mm}

  \LARGE{<名前>}

  \vfill

  \Large{指導教員: <指導教員>}

  \vspace{2mm}

  \Large{<日付>}
\end{titlepage}

% 最初のページはページ番号をローマ数字にする
\pagenumbering{roman}

% 目次を表示
\tableofcontents

\clearpage
% ページ番号を元に戻す
\pagenumbering{arabic}

% 本文
\subinputfrom{src/}{index.tex}

% 参考文献
\bibliography{cite}
\bibliographystyle{junsrt}

\end{document}
```

## テンプレート解説

### LaTeXエンジン

LaTeXエンジンにはLuaLaTeXを使用しています。従来、日本語が使えるLaTeXと言えば(u)pLaTeXが主で、後はせいぜいXeTeXがどうにか日本語を扱える程度でしたが、LuaLaTeX-jaパッケージの登場により、LuaLaTeXでもまともな日本語組版ができるようになりました。

また、LuaLaTeXの大きな特徴として、フォントの変更がとても簡単にできることが挙げられます。私はMacユーザーなので、フォントはきれいなヒラギノフォントを使いたいと思っています。そのため、簡単にヒラギノフォントを使えるLuaLaTeXを選択しました。

LuaLaTeXのデメリットとしては、他のLaTeXエンジンに比べてコンパイルにかなり時間がかかることが挙げられます。私の卒論程度の規模であれば変更の度にフルコンパイルしてもそこまでストレスにはなりませんが、更に大規模な文書を書く場合にはファイルの分割や部分コンパイルを検討することをお勧めします。

### ドキュメントクラス

```tex
% クラスファイルを指定
% jlreqはW3Cで勧告されている日本語組版処理の要件を満たすクラスファイル
% jarticle, jreport, jbookなどは古い上に日本語組版処理の要件を満たしていないため使わない
\documentclass[
  % LuaLaTeXを使う
  luatex,
  % 用紙サイズをA4にする
  paper=a4paper,
  % 欧文のフォントサイズを11ptにする
  fontsize=11pt,
  % レポート形式
  report,
  % 日本語組版処理の記述と矛盾する設定がある場合に通知
  jlreq_notes,
]{jlreq}
```

ドキュメントクラスではjlreqを使用しています。jlreqは比較的新しいクラスファイルで、W3Cで勧告されている日本語組版処理の要件を満たすクラスファイルです。従来はjsarticle, jsreport, jsbookなどが使われていましたが、これらは古い上に日本語組版要件を満たしていない箇所があり、デフォルトの設定から色々修正する必要がありました。jlreqはこれらの問題を解決してくれるので、新規のLaTeX文書を作成する際はjlreqを使うことをお勧めします。[^1]

ちなみに、jlreqはLuaLaTeX以外にも(u)pLaTeXでも使用できるので、(u)pLaTeXを使っている人もjlreqを使うことをお勧めします。

[^1]: https://qiita.com/wtsnjp/items/76557b1598445a1fc9da#%E6%96%B0%E5%B8%B8%E8%AD%98-3-%E6%96%87%E6%9B%B8%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E3%81%AF%E9%81%B8%E6%8A%9E%E8%82%A2%E3%81%8C%E3%81%82%E3%82%8B

さらに、jlreq-complementsパッケージでjlreqの設定を少し変更しています。デフォルトでは参考文献の見出しが章になっておらず、目次にも追加されないので、これを修正しています。

```tex
% jlreqsetupで色々設定できるようにする
\usepackage{jlreq-complements}

% jlreqの設定
\jlreqsetup{
  % 参考文献の見出しの出力命令を設定
  thebibliography_heading={
    % 見出しを章にする
    \chapter*{\refname}
    % 目次に追加
    \addcontentsline{toc}{chapter}{\refname}
  },
}
```

### 汎用系パッケージ

```tex
% 画像を扱う
\usepackage{graphicx}

% pdfのハイパーリンクを設定
\usepackage[hidelinks]{hyperref}

% 相対パスでファイルを読み込む
\usepackage{import}

% 章やページの合計を扱う
\usepackage{totcount}

% svgを扱う
\usepackage{svg}

% 表の罫線を扱う
\usepackage{booktabs}
```

これらは他のテンプレートでもよく見るような汎用系のパッケージです。
`graphicx`は画像を扱うためのパッケージ、`hyperref`はPDFのハイパーリンクを設定するためのパッケージ、`import`は相対パスでファイルを読み込むためのパッケージ、`totcount`は章やページの合計を扱うためのパッケージ、`svg`はSVG画像を扱うためのパッケージ、`booktabs`は表の罫線を扱うためのパッケージです。

個人的に導入して良かったと思ったパッケージは`import`と`svg`です。

`import`は相対パスでファイルをよみこむことができるようになるパッケージで、卒論のような大規模な文章を書く際に、ファイルを分割して管理するのに非常に便利でした。もともとLaTeXではファイルを分割して管理することはできるのですが、インポートが常に始めに読み込まれたファイルからの相対パスになるので、ディレクトリの階層が深くなるとパスの指定や管理が面倒になります。`import`を使うことで、インポート元のファイルからの相対パスでファイルを読み込むことができるので、ディレクトリの階層が深くなっても楽にファイルを管理できます。

`svg`はSVG画像を直接LaTeX文書に埋め込むことができるパッケージです。私はレポートや卒論で挿入する図はよくDraw.ioを使って作成するのですが、Draw.ioで作成した図をPNGに変換してLaTeX文書に挿入すると画質が落ちてしまいます。`svg`を使うことで、Draw.ioで作成したSVG画像をそのままLaTeX文書に挿入することができ、画質を保ったまま図を挿入することができます。なお、`svg`パッケージの使用にはInkscapeが必要なのと、コンパイル時に`-shell-escape`オプションをつける必要があるので注意してください。

### 数式関連パッケージ

```tex
% 数式関連
\usepackage{amsmath,amssymb}
\usepackage{mathtools}
% 参照した数式番号のみを表示する
% \mathtoolsset{showonlyrefs=true}

% 単位付き数値の入力を楽にする
\usepackage{siunitx}

% 数式の記述を楽にする
\usepackage{physics2}
% 括弧のサイズを自動調整する
\usephysicsmodule{ab}
% 行列の記述を楽にする
\usephysicsmodule{diagmat}
\usephysicsmodule{xmat}

% 微分記号の入力を楽にする
\usepackage{derivative}
```

これらは数式関連のパッケージです。これらも他のテンプレートでよく見られるパッケージですが、特徴的なのは`physics`ではなく`physics2`パッケージを使用している点です。

`physics`パッケージは数式の記述を楽にするパッケージで長いこと使われてきたパッケージですが、随分更新がされていなかったり、`siunitx`とコマンドが競合していたり、出力結果が少しおかしかったりなどの問題がありました。[^2]

`physics2`は`physics`の後継版で、これらの問題を解決してくれるパッケージです。`physics2`は事前にいくつかの設定が必要だったり、微分記号の入力を楽にするコマンドがなかったりなど、`physics`とは使い方が異なる部分があるので、使う際はドキュメントをよく読んで使うことをお勧めします。

[^2]: https://qiita.com/Yarakashi_Kikohshi/items/131e2324f401c3effb84

### フォント関連

```tex
% 数式のフォントを変更
% amsmathより後に読み込む必要がある
\usepackage[
  % mathtoolsと一部競合するため，警告を無視
  warnings-off={mathtools-colon,mathtools-overbracket}
]{unicode-math}
\unimathsetup{math-style=TeX,bold-style=TeX}
\setmainfont[Ligatures=TeX]{Latin Modern Roman}
\setsansfont[Ligatures=TeX]{Latin Modern Sans}
\setmonofont{Latin Modern Mono}
\setmathfont{Latin Modern Math}
% \setmathfont{XITS Math}[range={scr,bfscr}]% Latin Modern Mathにscr体がないので

% フォントを設定
% unicode-mathの後でないとフォントが変更されない
\usepackage[
  % ヒラギノ明朝(プロポーショナル)を使用
  hiragino-pron,
  % 多ウェイト化を有効にする
  deluxe,
  % jlreqで使えるようにする
  jfm_yoko=jlreq,
  jfm_tate=jlreqv,
]{luatexja-preset}
```

フォント関連の設定です。数式のフォント設定には`unicode-math`を使用しています。`unicode-math`は数式のフォントをunicodeベースに変更するパッケージです。試験的に導入したのですが、色々なパッケージと競合したり、数式中で書体を変える際のコマンドが異なったりなど少し慣れが必要な部分がありました。[^3]

その他のフォント設定には`luatexja-preset`を使用しています。`luatexja-preset`はLuaLaTeXで日本語フォントの設定を楽に行えるパッケージです。私はヒラギノフォントを使いたかったので、`hiragino-pron`を指定しています。

[^3]: https://qiita.com/zr_tex8r/items/648b024e55126f3ba077

### キャプション関連

```tex
% キャプションを設定
\usepackage[hang,small,bf]{caption}
\usepackage[subrefformat=parens]{subcaption}
\captionsetup[subfigure]{labelformat=simple}
\renewcommand{\thesubfigure}{(\alph{subfigure})}
```

ここはキャプション関連の設定です。複数の図を並べて表示する際にサブキャプションを使いたかったため、`subcaption`パッケージを使用しています。 ~~正直どこかからのコピペなので詳細はよく分かっていません~~

使うときには以下のようにして使います。

```tex
\begin{figure}[!htbp]
  \centering
  \subcaptionbox{振幅型CGH}[0.45\linewidth]{\includegraphics[width=\linewidth]{./cgh_amp.png}}
  \subcaptionbox{位相型CGH}[0.45\linewidth]{\includegraphics[width=\linewidth]{./cgh_phase.png}}
  \caption{2種類のCGH}
  \label{fig:cgh}
\end{figure}
```

### ソースコード関連

```tex
% ソースコードを扱う
\usepackage{listings}
\lstset{
  % タブの展開後のサイズ
  tabsize={4},
  % 行番号表示，デフォルト: none 他のオプション: left, right
  numbers=left,
  % 書体の指定，行番号の書体指定
  basicstyle={\small},
  % 識別子の書体指定
  identifierstyle={\small},
  % 行番号の書体指定
  %numberstyle=\scriptsize,
  % 注釈の書体。
  commentstyle={\small\ttfamily},
  ndkeywordstyle={\small},
  % キーワードの書体指定。
  keywordstyle={\small\bfseries},
  stringstyle={\small\ttfamily},
  columns=[l]{fullflexible},
  xrightmargin=0\zw,
  xleftmargin=0\zw,
  numbersep=1\zw,
  %backgroundcolor={\color[gray]{.85}},
  % frameの指定．デフォルト: none 他のオプション: leftline, topline, bottomline, lines, single, shadowbox
  frame=lines,
  % 行が長くなってしまった場合の改行．デフォルト: false
  breaklines=true,
}
```

ソースコードをきれいに見せるための設定です。(u)pLaTeXだと`jlistings`パッケージを使用しますが、LuaLaTeXなら日本語がそのまま使えるので`listings`パッケージを使用しています。書体の設定はほぼ秘伝のタレと化しているのであんまりよく分かっていません。

### マクロなど

```tex
% 図や表や式の参照用マクロ
\newcommand{\figref}[1]{\figurename~\ref{#1}}
\newcommand{\tabref}[1]{\tablename~\ref{#1}}
\newcommand{\eqnref}[1]{式~\eqref{#1}}

% 便利マクロ
\newcommand{\F}{\symscr{F}} % フーリエ変換
\newcommand{\ccolumn}[1]{\multicolumn{1}{c}{#1}} % 中央揃えの表のセル

\regtotcounter{chapter}
```

図などの参照マクロや長くて書きづらいコマンドを短縮するためのマクロを定義しています。ちょっとしたこだわりとして、参照マクロでは名前と番号の間に`~`を入れています。これは改行しない空白を表していて、図番号や表番号と名前が分かれてしまうのを防いでいます。

`regtotcounter`は`totcount`パッケージのコマンドで章やページの合計を扱うためのカウンターを登録するコマンドです。今回は本文中に章の合計を表示したかったため、章のカウンターを登録しています。

### 文章

```tex
\begin{document}

% 表紙
\begin{titlepage}
  \noindent
  \centering

  \vfill

  \LARGE{令和5年度 卒業論文}

  \vspace{10mm}

  \Huge{<日本語タイトル>}

  \vspace{2mm}

  \LARGE{<英語タイトル>}

  \vfill

  \Large{長野工業高等専門学校}

  \Large{電子情報工学科5年}

  \Large{<教員>研究室}

  \vspace{5mm}

  \LARGE{<名前>}

  \vfill

  \Large{指導教員: <指導教員>}

  \vspace{2mm}

  \Large{<日付>}
\end{titlepage}

% 最初のページはページ番号をローマ数字にする
\pagenumbering{roman}

% 目次を表示
\tableofcontents

\clearpage
% ページ番号を元に戻す
\pagenumbering{arabic}

% 本文
\subinputfrom{src/}{index.tex}

% 参考文献
\bibliography{cite}
\bibliographystyle{junsrt}

\end{document}
```

最後に文章部分です。ここは他のテンプレートとあまり変わらず、表紙、目次、本文、参考文献の順になっています。本文は`src`ディレクトリに`index.tex`として分割しています。

## おわりに

以上、私が卒論で使ったLaTeXテンプレートです。研究室によってはテンプレートが厳格に決まっている場合もあると思いますが、テンプレートがない場合にはぜひこのテンプレートを参考にしてみてください。5年生は今が卒論の真っ最中だと思いますが、頑張ってください！