Emacsで快適な研究環境を整えよう3~YaTeX + RefTeX 編~

- Emacsで快適な研究環境を整えようシリーズ
    1. [導入編](https://qiita.com/Maizu/items/44b0498597937480ca0a)
    2. [パッケージ&日本語入力編](https://qiita.com/Maizu/items/fee34328f559c7dc59d8)
    3. **YaTeX + RefTeX 編** (今ここ)

## 追記
2019/8/24 YaTexの設定に関するミスを修正しました。

## はじめに
こんにちは。今回は第3弾です。

今回はついに私のイチオシパッケージYaTeXとRefTeXの設定をしていきます。
YaTeXとRefTeXはTeXファイルの編集をサポートするパッケージで次のようなことができます。

- ショートカットキーからのTeXファイルのタイプセット/PDF化
- プレビューの起動
- TeXコマンドの補完
- 数式モードでの記号やギリシャ文字の補完
- 参照の挿入
- 1つの文書を複数ファイルに分割して作成した際の各ファイルへのジャンプ　など

個人的に特に便利だと感じている機能は参照の挿入です。
文書中のlabelがついたものを一覧で表示し、その中から挿入したいものを選択することで参照が挿入できます。
BibTeXの参照も挿入することができ、bibファイルに登録されているものの一覧から挿入することができます。
この際にタイトルや著者名などから検索することができるので、読んだものをどんどん一つのbibファイルに貯めていき必要なものを必要な時に取り出すといった使い方ができ非常に便利です。

## YaTeXのインストール
それではpackage.elを使ってYaTeXをインストールしていきます。
Emacsを起動して`M-x package-list-packages`でパッケージ一覧からyatexを探してインストールしてください。
インストールができたら設定ファイル(~/.emacs.d/init.el or ~/.emacs)を開いて次の設定を追記してください。

```emacs-lisp:init.el
;;; yatex
(require 'yatex)                ;; パッケージ読み込み
(add-to-list 'auto-mode-alist '("\\.tex\\'" . yatex-mode)) ;;auto-mode-alistへの追加
(setq tex-command "platex")       ;; 自分の環境に合わせて""内を変えてください
(setq bibtex-command "pbibtex")    ;; 自分の環境に合わせて""内を変えてください
;;reftex-mode
(add-hook 'yatex-mode-hook
          #'(lambda ()
              (reftex-mode 1)
              (define-key reftex-mode-map
                (concat YaTeX-prefix ">") 'YaTeX-comment-region)
              (define-key reftex-mode-map
                (concat YaTeX-prefix "<") 'YaTeX-uncomment-region)))

```

auto-mode-alistは拡張子とメジャーモードを対応づけるリストです。
この設定を行うことで特定の拡張子のファイルを開いたときに、対応するメジャーモードで開いてくれます。
tex-command, bibtex-commandはそれぞれタイプセットを行うときに使用するコマンドを指定する変数です。""内を自分が使っているコマンドに変更しましょう。
add-hookはhookを追加する関数です。hookとは特定の場面で呼び出される関数を納めた変数です。
多くのメジャーモードはメジャーモードを切り替えたときに呼び出されるhookを持っています。
そのモードでのみ有効にしたい設定を記述しておくことで、モードを切り替えたとき自動的に設定が適用されるので非常に便利です。
ここではRefTeXモードをオンにして選択範囲をコメント化・非コメント化するコマンドのキーバインドを設定しています。
add-hookには関数を渡すということを覚えておいてください。
ここでは無名関数を渡しています。

## YaTeXの基本操作
インストールと設定ができたらEmacsを再起動してさっそく使ってみましょう！
適当なTeXファイルを開いてください。
下のメジャーモード名の部分に"やてふ"と表示されていればOKです。
表示されない場合はインストールや設定がうまくいってない可能性があります。
再度確認しましょう。
ここではよく使うキーバインドを紹介します。

### タイプセットなどに関するキーバインド
| キー    | 動作                           |
|:-------:|:-------------------------------|
| C-c t j | TeXのタイプセット              |
| C-c t d | TeXのタイプセットしてpdfを作成 |
| C-c t b | BibTeXのタイプセット           |
| C-c t p | プレビュー                     |
| C-c '   | エラー行へのジャンプ           |

YaTeXを使うことでEmacsからタイプセットやPDF化、プレビューの起動などを行うことができます。わざわざターミナルを開く必要もなく、PDF化にはタイプセット+PDF化といった2ステップが必要でしたがYaTeXでは一括で実行することが可能です。またそのままプレビューが起動できるのでタイプセット〜確認が非常にスムーズで便利です。
タイプセット時にエラーが発生してもエラー行へジャンプすることができるので修正も楽チンです。

### 補完に関するキーバインド
| キー      | 補完の種類      | 例                              |
|:---------:|:----------------|:--------------------------------|
| C-c b SPC | begin-end型補完 | \begin{document}-\end{document} |
| C-c s     | section型補完   | \section{}                      |
| C-c l     | large型補完     | {\large }                       |
| C-c m     | maketitle型補完 | \maketitle                      |
| C-c e     | end補完         | \end{document}                  |

YaTeXを使えばLaTeXコマンドも補完によって記述することができます。
補完のためのキーはコマンドの形に合わせて分けられています。表の例を参考にしてキーを選びましょう。
また範囲選択をした状態で補完を行うと選択範囲に補完を適用することが可能です。
(例:選択範囲を囲うようにbegin-endが挿入される, 選択範囲が引数になる など)
補完を使わずにbegin-end型の環境を書き始めてしまった場合はend補完を使うことで対応するendを挿入することができます。

補完を使うと少ないタイプ数で記述できるだけでなく、
引数が必要なコマンドに関しては必要に応じて聞いてくれるので、
書き方を忘れてしまっても正しく記述することができます。

また上述の補完ではキーを押した後に挿入するコマンドを選ぶことになりますが、
begin-end型の中でも主要なものは直接補完できるキーが用意されています。
以下に直接補完できるものをまとめます。
覚えることで少し早く記述することができるので参考にしてください。
(以下のコマンドも上述の方法で補完することができます)

| キー      | 補完の種類      |
|:---------:|:----------------|
| C-c b d   | document環境    |
| C-c b E   | equation環境    |
| C-c b c   | center環境      |
| C-c b i   | itemize環境     |
| C-c b e   | enumerate環境   |
| C-c b D   | desctiption環境 |
| C-c b l   | flushleft環境   |
| C-c b m   | minipage環境    |
| C-c b t   | tabbing環境     |
| C-c b T   | tabular環境     |
| C-c b C-t | table環境       |
| C-c b p   | picture環境     |
| C-c b q   | quote環境       |
| C-c b Q   | quotation環境   |
| C-c b r   | flushright環境  |
| C-c b v   | verbatim環境    |
| C-c b V   | verse環境       |

### 数式モードで有効なキーバインド
| キー   | 補完の種類               | 例                          |
|:------:|:-------------------------|:----------------------------|
| : キー | ギリシャ文字イメージ補完 | `:a`\alpha, `:b`\beta　など |
| ; キー | 数式記号イメージ補完     | `;s`\sum, `;6`\partial など |
数式記号やギリシャ文字を補完する機能もあります。
これは数式モード内でのみ有効で、`;`もしくは`:`を押した後に`a`や`b`といったキーを入力します。
偏微分の記号$\partial$が6で出てくるのが面白いですね笑
全て書くのは大変なので気になる方は各キー(; or :)を押した後に、
TABを押すことで補完の対応表を見ることができるので確認してみてください。


### ドキュメント階層に関するキーバインド
大規模なドキュメントを作る際は複数のファイルに分割して管理することがあると思います。
そういったファイルを編集するときには以下のコマンドが便利です。

| キー  | 動作                                                       |
|:-----:|:-----------------------------------------------------------|
| C-c d | ドキュメントの階層一覧表示, 選んだドキュメントへのジャンプ |
| C-c g | カーソル部の指すファイルにジャンプ                         |
| C-c ^ | メインファイルにジャンプ                                   |

上記のコマンドを使うにはメインファイルなどを示す目印をつける必要があります。
メインファイルの末尾に次の記述を入れてください。

```latex
% Local Variables:
% mode: yatex
% tex-main-file: t
% End:
```

メインファイルへの記述が終わったら参照されるサブファイルにも上記のような記述をします。
ただしサブファイルにはtex-main-fileの項目をtではなく

```latex
% tex-main-file: "<ファイル名>"
```
と記述してください。他の項目は同じで大丈夫です。


## RefTeXの使い方
次にRefTeXの使い方を紹介します。
RefTeXは参照周りの便利機能を提供してくれます。

| キー  | 動作                                                   |
|:-----:|:-------------------------------------------------------|
| C-c = | アウトラインの表示,選んだセクションへのジャンプ        |
| C-c [ | bibファイルのciteを挿入                                |
| C-c ( | ラベルをつける                                         |
| C-c ) | refの挿入                                              |
| C-c & | 対応するラベルを参照                                   |

この中でも個人的に便利だと思うのがciteの挿入とrefの挿入です。

citeやrefで参照しようとしてもどんなキーワードにしたか忘れてしまったりとか、
わかりやすいキーワードをつけるのがめんどくさいという経験はありませんか？
そんなときにRefTeXを使った参照が便利です。
citeの挿入ではbibファイルのなかからタイトルや著者名などの論文情報で検索してその中から挿入したいものを選んで挿入することができます。
そのため参照のためのキーワードを覚えてなくても論文のタイトルの一部や著者名がわかっていれば簡単に挿入することができ、bibファイルに登録されている大量の文献の中から目的のキーワードを探すといった手間がかかりません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/263391/05ff2d4a-84bc-1c84-ff48-c22fa606b8de.gif" width=70%>

この機能を使うには検索先のbibファイルを設定しておく必要があります。
Emacsの設定ファイルに以下の記述をしましょう。

```emacs-lisp:init.el
(setq reftex-default-bibliography '("/path/to/bibtex/file/"))
```
`/path/to/bibtex/file/`の部分を参照したいbibファイルへのパスに書き換えてください。
この設定をすることで指定したbibファイルが検索対象となります。

refの挿入ではドキュメント中に存在するあらゆるラベルの一覧から選んで挿入することができます。
ラベルの数が多くなってしまっても図,式などのカテゴリに分けて一覧表示することができるので簡単に参照することが可能です。
さらに上で述べたメインファイル・サブファイルの設定がしてあれば他ファイルのラベルを参照することができるため、わざわざ参照先のファイルを開いてキーワードを調べる必要がありません。
この機能を使えばテキトーにキーワードを作っておいても簡単に参照することができます。

## おわりに
Emacsで快適な研究環境を整えようシリーズを書き始めたのは今回のためといっても過言ではありません。
LaTeX書くならYaTeX超便利です。おすすめです。
使い方を覚えるだけで効率的に文書作成が行えます。
卒論を書くときにはかなり役立ってくれました。
上の本文からどれだけそれが伝わっているかはわかりませんが、ぜひ騙されたと思って使ってみてください。

## 参考文献
- [YaTeX](https://www.yatex.org/)
- [YaTeX - TeX Wiki](https://texwiki.texjp.org/?YaTeX)
- [野鳥 (YaTeX) - 物理のかぎしっぽ](http://hooktail.org/computer/index.php?%CC%EE%C4%BB%A1%CAYaTeX%A1%CB)
- [TeX環境構築:Emacs+YaTeX+RefTeX - 計算物理屋の研究備忘録](http://keisanbutsuriya.hateblo.jp/entry/2015/03/13/175219)