[備忘録]use-packageを使ったYaTeXのインストール

# 1. はじめに
こちらの記事はYaTeXとその周辺のパッケージをインストールする作業の備忘録です．てぃー氏の記事「[私的YaTeX事始め](http://mtino1594.hatenablog.com/entry/2019/04/07/200000)」を参考にしています．

## 1.1 環境
本稿執筆時の作業環境は以下の通りです．

- macOS: Catalina 10.15.4
- Emacs:
    - Emacs 26.3 (emacsmacport) <- `brew cask`を使ってインストール（[こちらの記事](https://qiita.com/walking_with_models/items/7d618aed1c045e507ea2)を参照）
    - パッケージuse-package <- [こちらの記事](https://qiita.com/walking_with_models/items/66bedf2316859ae3657e)を参照

##1.2 関連記事

- macOSへのTeX-Emacs環境の構築全体の流れについては[こちらの記事](https://qiita.com/walking_with_models/items/52a0d0c00aec88903e4b)．


# 2. YaTeXのインストール

細かい設定は後でできるので，まずは`use-package`を使ってYaTeXパッケージを[MELPA](https://melpa.org)からインストールしてみます（2020年5月28日時点で，[MELTA Stable](https://stable.melpa.org)にはYaTeXは存在しない）．


## 2.1 手順
**Step 1:** Emacsで初期化ファイル`init.el`を開き，下の方（`package.el`や`use-package.el`関連より後）に以下を追加する．

```emacs-lisp:~/.emacs.d/init.el
(use-package yatex
  :ensure t)
```
**Step 2:** 変更を保存し（`C-x C-s`），Emacsを閉じ（`C-x C-c`），改めてEmacsを起動する．

`:ensure t`により，（パッケージがインストールされていない場合に）自動でパッケージがインストールされます．**Step 2**でEmacsを再起動する際にインストールが実行されます．少しだけ時間が掛かる．インストール後にEmacsの`*Compile-Log*`バッファを見ると，`Warning (bytecomp):`が大量にある．全くわからないので，そっと閉じます...

## 2.2 結果
MELPAからインストールされたパッケージなので，`~/.emacs.d/elpa/`にYaTeXのディレクトリが追加されました．

```terminal:~/.emacs.d/elpa/
$ ls -l
drwxr-xr-x  38 hoge  staff  1216  5 28 22:30 yatex-20200208.931
```

# 3. YaTeXの設定

ここではYaTeXの設定を整理します．編集の手順は**2.1 手順**と同じなので省略し，ここでは初期化ファイル`init.el`に加える内容に着目します．

## 3.1 設定
まずは次のように初期化ファイル`init.el`に設定を加えました．

```emacs-lisp:~/.emacs.d/init.el
(use-package yatex
  :ensure t
  :init
  (setq YaTeX-inhibit-prefix-letter t)
  :mode (("\\.tex\\'" . yatex-mode)
         ("\\.sty\\'" . yatex-mode)
         ("\\.ltx\\'" . yatex-mode))
  :config
  (setq YaTeX-kanji-code 4) ; 1 -> SJIS, 2 -> JIS, 3 -> EUC, 4 -> UTF8
  (setq YaTeX-use-AMS-LaTeX t)
  (setq tex-command "latexmk -pdfdvi -f -e '$latex=q/platex -synctex=1 %O %S/; $dvipdf=q/dvipdfmx %O -o %D %S/; $bibtex=q/pbibtex %O %B/; $makeindex=q/mendex %O -o %D %S/;'"))
```

####コメント（`latexmk`以外）
- `(setq YaTeX-inhibit-prefix-letter t)`により，YaTeXのキーバインドが`C-c 英字`から`C-c C-英字`へ変化します．これは`yatex.el`を読み込む前に必要なため，`:init`の部分に記述しています．
- `:mode`の部分は`.tex`，`.sty`，`.ltx`のファイル形式を開いた場合にYaTeXモードに切り替える（遅延ロードする）指示です．
    - この点は@kai2nenobu氏の記事「[use-packageで可読性の高いinit.elを書く](https://qiita.com/kai2nenobu/items/5dfae3767514584f5220)」が詳しいです．
- `(setq YaTeX-kanji-code 4)`は文字エンコーディングにUTF8を指定しています．
- `(setq YaTeX-use-AMS-LaTeX t)`はAMS-LaTeXを使うため．
- `:defer t`は含めていません．これは`use-package`のGitHubページの[`README.md`](https://github.com/jwiegley/use-package/blob/d2640fec376a8458a669e7526e63e5870d875118/README.md)に次の記述があったためです．

>If you aren't using :commands, :bind, :bind*, :bind-keymap, :bind-keymap*, :mode, :interpreter, or :hook (all of which imply :defer; see the docstring for use-package for a brief description of each), you can still defer loading with the :defer keyword:

####コメント（`latexmk`に関する内容）
- `-e`オプションで特定の初期化コード（`.latexmkrc`に記述するコード）を実行することができ，ざわざわ初期化ファイル`.latexmkrc`を用意しなくて済みます．具体的には，`-e '$hoge=q/.../'`のような形で使います（詳細は[マニュアル](http://ftp.jaist.ac.jp/pub/CTAN/support/latexmk/latexmk.pdf)を参照）．`q/ ... /`は引用で，外側の`'...'`という引用の中での引用を示すために，この記法を使うようです．
- ここでは，pLaTeX+dvipdfmx+pBibTeXの（古い？）組み合わせを前提としています．TeXの新しい処理系やBiber+BibLaTeXといった方法については今後勉強する必要があります．
- `-pdfdvi`は`dvipdfmx`でPDFファイルを出力する際に必要になります．
- `-pdfdvi`は（DVIファイルから）PDFファイルを出力するために必要です．
- `-synctex=1`: https://texwiki.texjp.org/?SyncTeX
- `(setq tex-command ...)`なので，`C-c C-t j`で`latexmk`を使った一連のコンパイルを行います．
- `-f`はエラーが出ても強制的に最後までコンパイルするための指示．BibTeXで未入力項目が多い場合にエラーが出てPDFが出力されないことがある．なお，一度bibファイルを作成できれば，その後のコンパイルでエラーは出ない．


#4. YaTeX周辺：RefTeXの設定

RefTeXは文献引用や相互参照をする際に役立つツールです．TeX Liveにはデフォルトで同梱されている機能です．例えば，Emacsにおいて`C-c [`とすれば，BibTeXファイル（`.bib`）から文献のキーワード検索し，該当するものを`RET`で挿入することができます（`latexmk`を適切に設定すれば，参考文献リストがタイプセット時に自動的で作成されます）．

##4.1 設定
`(use-package yatex ...)`の後ろに以下を追加します．

```emacs-lisp:~/.emacs.d/init.el
(use-package reftex
  :ensure nil
  :hook (yatex-mode . reftex-mode)
  :bind (:map reftex-mode-map
          ("C-c )" . nil)
          ("C-c (" . reftex-reference))
  :defer t)
```

- てぃー氏の[ブログ記事](http://mtino1594.hatenablog.com/entry/2019/04/07/200000)によれば，Cleverefというパッケージが存在するようです．これを実装するかは今後の検討課題とします．


#5. YaTeX周辺：company(-math)パッケージのインストール



##5.1 手順：companyパッケージ
**Step 1:** Emacsで初期化ファイル`init.el`を開き，上記RefTeXの設定の後に以下を追加する．

```emacs-lisp:~/.emacs.d/init.el
(use-package company
  :ensure t
  :hook (after-init . global-company-mode))
```
**Step 2:** 変更を記録し（`C-x C-s`），Emacsを閉じる（`C-x C-c`）．再度，Emacsを起動する．

####コメント
- **Step 2**でEmacsを再起動した段階でパッケージ`company`が（まだインストールされていない場合に）インストールされます．以下はその際のコンパイルのログとパッケージの情報です．
- 使い方：Emacsで入力していると自動で補完候補が表示されたら，`M-n`（リストの下へ移動），`M-p`（リストの上へ移動）で候補を選択し，`RET`．

```emacs-lisp:*Compile-Log*
Compiling file /Users/hoge/.emacs.d/elpa/company-20200525.101/company-yasnippet.el at Mon Jun  1 13:19:52 2020

Compiling file /Users/hoge/.emacs.d/elpa/company-20200525.101/company.el at Mon Jun  1 13:19:52 2020
Warning (bytecomp): the function ‘eglot--snippet-expansion-fn’ is not known to be defined.
Warning (bytecomp): the function ‘yas-minor-mode’ is not known to be defined.
```


```emacs-lisp:パッケージ情報（一部）
company is an installed package.

     Status: Installed in ‘company-20200525.101/’ (unsigned). Delete
    Version: 20200525.101
    Summary: Modular text completion framework
   Requires: emacs-24.3
   Homepage: http://company-mode.github.io/
   Keywords: abbrev convenience matching 
Other versions: 20200525.101 (melpa), 0.9.12 (melpa-stable), 0.9.12 (gnu).
```

##5.2 手順：company-mathパッケージ
**Step 1:** Emacsで初期化ファイル`init.el`を開き，YaTeX及びcompanyの設定より後に以下を追加する．

```emacs-lisp:~/.emacs.d/init.el
(use-package company-math
  :ensure t
  :demand t
  :after (company yatex)
  :config
  (push 'company-math-symbols-latex company-backends)
  (push 'company-latex-commands company-backends))
```
**Step 2:** 変更を記録し（`C-x C-s`），Emacsを閉じる（`C-x C-c`）．再度，Emacsを起動する．

####コメント
- `:after`でcompanyとYaTeXパッケージがロードされてからcompany-mathをロードすることを指定しています．
- 数学記号の補完でYaTeXのイメージ補完を使う場合，`(push 'company-math-symbols-latex company-backends)`を削除する必要があります（[てぃー氏のブログ記事](http://mtino1594.hatenablog.com/entry/2019/04/07/200000#company-math-による補完)）．
- リポジトリとしてはGNU，MELPA，MELPA stableの3つがありますが，最新のMELPAからインストールが行われました．最新だからなのか，それともGNUやMELPA stableよりもMELPAが優先されるかの判断はわからない（MELPA stableよりMELPAが優先されることは分かっている）．

```emacs-lisp:*Compile-Log*
Leaving directory ‘/Users/hoge/.emacs.d/elpa/math-symbol-lists-20200131.2333’

Compiling file /Users/hoge/.emacs.d/elpa/math-symbol-lists-20200131.2333/math-symbol-lists.el at Mon Jun  1 23:50:55 2020
Entering directory ‘/Users/hoge/.emacs.d/elpa/math-symbol-lists-20200131.2333/’

Compiling file /Users/hoge/.emacs.d/elpa/math-symbol-lists-20200131.2333/msl-build.el at Mon Jun  1 23:50:55 2020

Compiling no file at Mon Jun  1 23:50:56 2020
Leaving directory ‘/Users/hoge/.emacs.d/elpa/company-math-20200131.2337’

Compiling file /Users/hoge/.emacs.d/elpa/company-math-20200131.2337/company-math.el at Mon Jun  1 23:50:56 2020
Entering directory ‘/Users/hoge/.emacs.d/elpa/company-math-20200131.2337/’

Compiling no file at Mon Jun  1 23:50:56 2020
Warning (bytecomp): attempt to let-bind nonvariable ‘(lucr (msl--LUCR-filter-LaTeX-aliases lucr))’
Warning (bytecomp): assignment to free variable ‘company-math--unicode-prefix-regexp’
Warning (bytecomp): reference to free variable ‘company-math--unicode-prefix-regexp’ [2 times]
```

```emacs-lisp:パッケージ情報（一部）
company is an installed package.

     Status: Installed in ‘company-20200525.101/’ (unsigned).
    Version: 20200525.101
    Summary: Modular text completion framework
   Requires: emacs-24.3
Required by: company-math-20200131.2337
   Homepage: http://company-mode.github.io/
   Keywords: abbrev convenience matching 
Other versions: 20200525.101 (melpa), 0.9.12 (melpa-stable), 0.9.12 (gnu).
```