今風なLaTeXに関するメモ

# はじめに
LaTeXに関しては様々な情報がいろいろなところに散逸しており、過去のバージョンに起因するバッドノウハウが未だに継承されていたりします。この記事では個人的に収集してきた今風なLaTeXの書き方をつらつらとまとめます。

# LaTeX環境
## TeX Live
様々なバッドノウハウから脱出するため、とりあえず最新のTeX Liveを使いましょう。毎年6月〜7月頃にその年のTeX Liveがリリースされるので、そのタイミングでインストールし直すとよいでしょう。2018年12月5日時点では、TeX Live 2018が最新版です。この記事も、Tex Live 2018の使用を大前提にしています。

## アップデート
LaTeXのライブラリが多数収録されたCTANには、ほぼ毎日ライブラリのアップデートが降ってきます。こちらのライブラリも、できるだけ最新にしておくことを心がけましょう。MacTeXやLinuxに自力でTeX Liveを導入した環境では、以下のコマンドでアップデートできます。ディストリビューションの公式リポジトリにあるTeX Liveを用いる際は、各ディストリビューションの通常のアップデートとして降ってきますので、それを代わりに利用してください。

```bash
$ sudo tlmgr update --self --all
```

## TeXエンジン
たいていの場合は`uplatex`を使えば良いでしょう。内部的にUnicodeを使用するため、かつては別のパッケージが必要であった特殊な文字(①など)もそのまま利用可能です[^uplatex]。uplatexでは不都合な場合だけ、platexを使うとよいでしょう。

また、最近ではLuaTeXやXeTeX界隈も盛り上がってきています。LuaLaTeXをデフォルトエンジンにしたビルドツール[llmk](https://github.com/wtsnjp/llmk)も[発表](https://speakerdeck.com/wtsnjp/llmk)、開発され、ますます使いやすくなっていますので、こちらの利用も検討してみると良いでしょう。

## コンパイル
コンパイルはlatexmkを用いて自動化します。uplatexで必要に応じて複数回コンパイルした後、dvipdfmxでPDFに変換するまでをtexファイルを保存するたびに実行してくれます。`$HOME/.latexmkrc`を設定すれば使えるようになります。詳しくは[こちらのサイト](http://konn-san.com/prog/why-not-latexmk.html)をご覧ください。TeX Liveにデフォルトで含まれているため、PATHを通しておけば使えるようになります。あとは以下のコマンドで一発です。

```bash
$ latexmk -pvc test.tex
```

簡易的には、ptex2pdfコマンドを利用するとよいでしょう。複数回のコンパイルは実行してくれないため画像番号が出力されなかったりしますが、とりあえずの確認には使えます。uplatexの場合は、以下のコマンドでコンパイル可能です。

```bash
$ ptex2pdf -u -l test.tex
```

# LaTeXの記述
## ドキュメントクラス
ドキュメントクラスには、どのエンジンでも利用することができるbxjsclsを用います[^bsjscls]。platexにおけるドキュメントクラスとの対応は、以下の通りです。用途に合わせて選びます。

|platex|bxjscls|説明|
|:-:|:-:|:-:|
|jsarticle|bxjsarticle|章がないレポートとか|
|jsarticle + slide|bxjsslide|スライド|
|jsbook|bxjsbook|背中で綴じる書籍|
|jsbook + report|bxjsreport|章のある論文やレポート|

また、どのエンジンにも対応できるよう`autodetect-engine`オプションと、必要な場合にのみdvipdfmxを利用するよう`dvipdfmx-if-dvi`オプションを有効にしておきます[^ifdvipdfmx]。

さらに、日本語文章の標準設定を利用するために`ja=standard`オプションを、用紙サイズとフォントサイズを指定するためにそれぞれ`a4paper`オプションと`12pt`オプションを利用しています。この3つのオプションは、場合に応じて変更します。

```latex
\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard,a4paper,12pt]{bxjs....}

\begin{document}
〜文章〜
\end{document}
```

なお、`jarticle`などの`s`が入らないレターサイズ用の設定を利用してはいけません。A4用紙に印刷すると、奇妙な余白が生まれます。bxjsclsが利用できない環境でも、せめて`jsarticle`などのドキュメントクラスを利用します。

## 図
イラストはPNG、写真はJPG、ベクタ画像にはPDFを直接利用します。間違ってもEPS画像を利用してはいけません[^noteps]。コンパイル速度が著しく低下しますし、変換する手間もかかります。bxjsclsを利用する場合には、`graphix`パッケージをオプションなしで読み込んでおくだけでOKです。

また、図表のセンタリングにはcenter環境を利用してはいけません。これは文章のセンタリングに用いるもので、図表のセンタリングに用いると不自然な空白が生じます。代わりに`\centering`命令を用います。以下にサンプルを記載します。

```latex
\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard,a4paper,12pt]{bxjsarticle}

\usepackage{graphicx}

\begin{document}
\begin{figure}[htb]
  \centering
  \includegraphics[scale=0.5]{test.png}
  \caption{キャプション}
  \label{fig:test}
\end{figure}
\end{document}
```

## 文字装飾
太字や斜体などには`\text◦◦`系命令を使います。`{\◦◦ ﾅﾝﾄｶ}`のスタイルは古い形式[^old]なので利用しないようにします。一例を示します。

```latex
% 古いスタイル
{\bf アレ}
% 新しいスタイル
\textbf{アレ}
```

## ソースコードの掲載
ソースコードの掲載には`minted`パッケージを、必要に応じて`listing`パッケージと組み合わせて用います。listing+jlistingという手段もありますが、日本語で書かれたコメントの扱いに難があるため、またjlistingは自力での導入が必要になるためおすすめしません。mintedはフルパッケージ版には標準で含まれています。

簡易的には`verbatim`と`itembox`等を利用することも可能ですが、自動的に改ページされなかったり、ソースコードのシンタックスハイライトを利用できなかったりするため、mintedの使用をお勧めします。手前味噌ですが、詳しくは[こちらのページ](http://qiita.com/Aruneko/items/103b8419c04ad2982c14)を参照してください。

# おわりに
こうしてまとめてみると、LaTeXも日々進化しており、昔から積み上げられてきた様々なバッドノウハウはもう必要なくなりつつあることが改めてわかってきました。

なるべく古いやり方に苦しめられず、新しく楽なやり方でLaTeXを楽しみましょう！

# 参考文献と注釈
[^uplatex]: [upTeX,upLaTeX - TeX Wiki](https://texwiki.texjp.org/?upTeX%2CupLaTeX)
[^luatex]: LuaTeXはコンパイル速度がかなり遅いとか...
[^ifdvipdfmx]: uplatexはdvipdfmxを通してPDFに変換されますが、LuaTeXやXeTeXはいきなりPDFに変換されるため、dvipdfmxは不要です。
[^bsjscls]: [BXjscls - TeX Wiki](https://texwiki.texjp.org/?BXjscls)
[^noteps]: EPS画像を埋め込む際に、画像が出現するたびにGhostscriptを起動し、画像を処理し、終了します。画像が多くなるとそのオーバーヘッドはすさまじいことになります。
[^old]: [使ってはいけない LaTeX のコマンド&#12539;パッケージ&#12539;作法 - Ichiro Maruta Homepage](http://ichiro-maruta.blogspot.jp/2013/03/latex.html)