LaTeXで楽に見た目の良い課題レポートに仕上げろ

この記事は[あくあたん工房 GWアドベントカレンダー2020](https://gw-advent.9wick.com/calendars/2020/86)の1日目の記事として書かれたものです。

---

# 💪 モチベーション

**課題、LaTeXで書いてるってだけで満足してませんか？**

僕でした...。

せっかくなら楽にいい感じの見た目に仕上げて提出しちゃいたい！ですよね！

# ✨ 目標

- タイトルをいい感じにする
- 問題文をいい感じにする
- ソースコードをいい感じにする
- ハイパーリンクをつけていい感じにする
- 参考文献をいい感じにする
- `latexmkrc`を書いて楽にコンパイルする

こんな感じに仕上げます。

![範囲を選択_072.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/c89dd3a3-346d-62eb-560e-183a49f61974.png)


# 🙅 書いてないこと

- LaTex環境の構築方法
- 各エディタごとの設定

環境の作り方は分かりやすい記事があると思うのでそれを読んでほしい。
エディタは好きなエディタを使ったほうが執筆作業が捗ると思う。

# 💻 僕の環境
一応、僕の環境を書いておきます。

```
OS     | Manjaro 20.0 Lysia
Kernel | x86_64 Linux 4.19.118-1-MANJARO
TeX    | TeX Live 2019
```

# ✨ タイトルをいい感じにする
学籍番号、名前は忘れると点数つかないのは当たり前です。

[\maketitle をカスタマイズした](http://xartaky.hatenablog.jp/entry/2017-10-13-customize-maketitle)を参考に。
`\usepackage{mdframed}`するのを忘れないように。

例えばこんな感じ。

![範囲を選択_071.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/3f4405aa-a3d8-716e-a9ae-1651bf6af118.png)

# ✨ 問題文をいい感じにする
課題提出では、解答だけ書けば良いのではなく、問題分もちゃんと書かないといけません。

[[LaTeX] problem --- 「問題」と「解答」の記述](http://konoyonohana.blog.fc2.com/blog-entry-311.html)を参考に。

落としてきた`problem.sty`の文字エンコードだけ`UTF-8`にエンコードし直しておきましょう。

![範囲を選択_068.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/8121003b-4d81-8ebe-4347-ca81ebd15ded.png)


# ✨ ソースコードをいい感じにする
可能な限りシンタックスハイライト付けた方が読みやすいです。

## listings + jlisting

[listingsの言語を追加する](https://e8l.hatenablog.com/entry/2015/11/29/232800)を参考に。

日本語もいい感じに表示するには`jlisting.sty`を拾ってくる必要があるので注意。

参考元から変更している点は、ソースコードを線で囲まず、上下に線を引くだけにしているところ。
`frame`で変更できる。

```latex
\lstset{
...
     frame={tb}
     % frameround=tttt
...
}
```

![範囲を選択_069.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/d6a3451b-dce4-884d-7adb-0c1e6e4421e2.png)

Solarizedの配色がとてもいい感じ。

## minted
いい感じにシンタックスハイライトしてくれる新しめのパッケージ。
listings + jlistingよりも、しっかりハイライト付けてくれる。

pipでPythonのパッケージ入れること、LaTeXのコンパイル時に`-shell-escape`オプションをつける必要があるので忘れないように。

[mintedでLaTeXドキュメントにソースコードを載せる](https://qiita.com/la_float/items/2884a4d80a54ffa89a34)を参考に。

[gpoore/minted](https://github.com/gpoore/minted)にも細かいドキュメントが置いてあったりする。

例えば、こんな感じに書く。

```latex
% ---------
% ここはプリアンブル
\renewcommand{\listingscaption}{ソースコード}
% ---------

\begin{listing}[htbp]
\caption{Hello World.c}
\label{sc:helloworld}
    
\begin{minted}[breaklines,linenos,frame=lines,framesep=2mm]{c}
#include <stdio.h>

int main(){
    // コメントもいい感じ
    printf("Hello World!\n");
    return 0;
}
\end{minted}
\end{listing}
```

するとこんな感じになる。
(色変更する方法わからんかった…。)

![範囲を選択_073.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/f33bc753-7fb4-9b38-6676-8d38eb9621e0.png)


# ✨ ハイパーリンクをつけていい感じにする
どこで参照してるか分かりやすくなっていい。
この設定をすると、デフォルトでしおり付きPDFが生成されるようにもなる。

```latex
\usepackage[dvipdfmx]{hyperref} % ハイパーリンクつき文章にする
\usepackage{pxjahyper}
\hypersetup{
    colorlinks=false,
    citebordercolor=green,
    linkbordercolor=red,
    urlbordercolor=cyan,
}
```

画像は次の`参考文献をいい感じにする`で一緒に載せています。


# ✨ 参考文献をいい感じにする
日本語と英語の混在する参考文献を書くのは結構大変（らしい）。
それに加え、IEEEのスタイルに従って書きたい。

というのを同時に出来る、電気学会/IEEE, 日英両対応bstファイルがある。
[ehki/jIEEEtran](https://github.com/ehki/jIEEEtran)にて公開されており、分かりやすい使い方も書いてある。

Webページの参照日(urldate)を書きたかったので少しいじる。

`ENTRY`に`urldate`を追加して、

```jIEEEtran.bst
%%%%%%%%%%%%%%%%%%
%% ENTRY FIELDS %%
%%%%%%%%%%%%%%%%%%

ENTRY
  { 
...
    url
    urldate
...
```

URLを表示する関数の部分に1行追加して、参照日を表示するようにする。

```jIEEEtran.bst
%% URL

FUNCTION {format.url}
{ is.use.url
    { url empty$
      { "" }
      { this.to.prev.status
        this.status.std
        cap.yes 'status.cap :=
        name.url.prefix " " *
        "\url{" * url * "}" *
        " Last visited:{" * urldate * "}" *
        punct.no 'this.status.punct :=
        punct.period 'prev.status.punct :=
        space.normal 'this.status.space :=
        space.normal 'prev.status.space :=
        quote.no 'this.status.quote :=
      }
    if$
    }
    { "" }
  if$
}
```

するとこんな感じにできる。

![範囲を選択_070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/1d3f3f4a-0e3b-de7c-d072-d26a7882609d.png)

用意したbibファイルはこんな感じ。
bibファイルは、Mendeleyなど使ってまとめて吐き出すのが良いと思う。

```reference.bib
@article{jpArticle3,
  author = {{山田 八郎} and {山田 六郎}},
  year = {2010},
  journal = {日本語の学会名},
  title = {手法1と手法2，どちらが正しいのか?},
  number = {1},
  pages = {15},
  volume = {5}
}
@article{enArticle3,
  author = {Goro Yamada and Rokuro Yamada},
  year = {2018},
  journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence},
  title = {Title2 is true?},
  month = {nov}
}
@book{jpBook1,
  author = {佐藤, 一郎},
  year = {2010},
  publisher = {日本語出版},
  address = {東京},
  title = {日本語本},
  edition = {1},
  pages = {100--200}
}
@misc{example,
  title = {Example Domain},
  url = {http://example.com/},
  urldate = {2020-04-18}
}
```

# ✨ `latexmkrc`を書いて楽にコンパイルする
これさえ書いておけば、ファイルの変更があれば自動でPDFを更新してくれる

`bibtex`を実行する際にPythonプログラムを走らせるが、これは先程の[ehki/jIEEEtran](https://github.com/ehki/jIEEEtran)のものである。
日本語と英語を併記する時によしなにしてくれる。

**Windowsユーザ向け、VSCodeユーザ向け**の使い方も書いてあるので参考元を見てぜひ使ってほしい。

```perl:latexmkrc
#!/usr/bin perl
$latex            = 'uplatex -synctex=1 -halt-on-error -shell-escape';
$latex_silent     = 'uplatex -synctex=1 -halt-on-error -interaction=batchmode -shell-escape';
$bibtex           = 'python mixej.py %B; upbibtex %O %B; python mixej.py %B';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$max_repeat       = 5;
$pdf_mode         = 3;
$pdf_previewer    = 'evince';
```

PDFプレビューアは各自、自分が使用しているものに変更してほしい。

# 🔧 テンプレート
この記事で扱ったテンプレートプロジェクトを[Github](https://github.com/Hiroya-W/latex_report_template)にあげておいたので、ぜひ活用してほしい。

使い方の一例としては、ターミナル1で`latexmk`を走らせておき、

```bash
$ latexmk -pvc
```

ターミナル2で、Vimなどのエディタを用いて`format.tex`を編集し、保存する。
保存時に自動的にコンパイルが開始され、PDFが出力される。といった感じ。


# 🎉 おわりに
課題、やる気が出なくてエディタ周りの環境ばかり整えていましたが、せっかくなので1つまとめてみました。

LaTeXを使うなら、これを機会にぜひ、いい感じのレポートに仕上げてみてください！