[備忘録]SkimとEmacsの連携：Backward/Forward Search

#1. はじめに
この記事はMacOSで利用できる無償のPDFビューアーSkimのインストールとSkimとEmacsの連携の設定についての手順を整理した備忘録です．YaTeXを使用することを前提としています．

## 1.1 作業環境
- macOS: 10.15.5
- Homebrew: 2.3.0

##1.2 関連記事

- YaTeXのインストールについては[こちらの記事](https://qiita.com/walking_with_models/items/52a0d0c00aec88903e4b)．
- macOSへのTeX-Emacs環境の構築については[こちらの記事](https://qiita.com/walking_with_models/items/52a0d0c00aec88903e4b)．



#2. Skimのインストール
##2.1. 手順

**Step 1:** ターミナルを起動し，以下を実行する．

```terminal
$ brew cask install skim
```

##3. Backward Searchの設定

backward searchとは，`latexmk`を使ってコンパイルした`.tex`ファイルから出力したPDFファイルをPDFビューアーのSkimで開いた状態（かつ，当該`.tex`ファイルをEmacsで開いた状態）で，Skim上で「`Shift`+`command`+クリック」すると対応する`.tex`ファイルを表示してくれる機能です．

このたにはいくつかの準備が必要です．以下，Live TeX 2020を前提として整理します．参考資料は以下のサイトです．

- [Skim/Wiki/TeX_and_PDF_Synchronization](https://sourceforge.net/p/skim-app/wiki/TeX_and_PDF_Synchronization/)

##3.1 やること

1. `latexmk`（正確には，`latex`）のオプション`-synctex=1`を指定する．
2. Skimの「環境設定...」の「同期」タグの内容を適切に設定する．
3. 初期化ファイル`init.el`を適切に設定する．

##3.2 手順
上記の**3.1 やること**をもう少し具体的に整理したのが以下の手順です．

**Step 1:** Emacsで初期化ファイル`init.el`を開き，`latexmk`（`latex`）のオプションに`-synctex=1`を追加する．
**Step 2:** 同じ初期化ファイル`init.el`に以下を加筆する．

```emacs-lisp:~/.emacs.d/init.el
;; Starts the Emacs server
(server-start)
```

**Step 3:** Skimを開き，[環境設定...]->[同期]と進み，「PDF-TeX 同期サポート：」の「初期値：」から「カスタム」を選択し，「コマンド：」が`emacsclient`，「引数：」が`--no-wait +%line "%file"`となっていることを確認する．


####コメント
- **Step 1**について，YaTeXインストールの記事で整理したように，私の場合はわざわざ`latexmk`の初期化ファイル`~/.latexmkrc`を用意せず，`init.el`のYaTeXの設定で書くようにしています．オプション`-synctex=1`をつけることで，`.tex`ファイルをタイプセット（コンパイル）したときに`hoge.synctex.gz`という圧縮ファイルが吐き出されます．SyncTeXについては[TeX Wikiのページ](https://texwiki.texjp.org/?SyncTeX)が参考になります．
- **Step 2**について，[Skim/Wiki/TeX_and_PDF_Synchronization](https://sourceforge.net/p/skim-app/wiki/TeX_and_PDF_Synchronization/)にあるauto-raiseの部分は必要ないみたいです（[Emacs Stack Changeのこちらの投稿](https://emacs.stackexchange.com/questions/52806/skim-search-backward-generates-shell-buffer-in-emacs); [taipapa氏のブログ記事](https://taipapamotohus.com/post/synchronization/)）．
- **Step 3**については，カスタムを選んだ際のデフォルトの内容で問題ないようです．以前[こちらの記事](https://qiita.com/walking_with_models/items/7d618aed1c045e507ea20)に書いたように，Homebrew（`brew cask`）でインストールしたEmacs (26.3)の本体は`/Application/Emacs.app/`下にあるものの，`/usr/local/bin`にシンボリックリンクが作成され，ターミナルで単に`emacs`や`emacsclient`と入力しただけで実行できるようになっているためです．

##3.3 挙動
実際にSkim上で「`Shift`+`command`+クリック」してみると，Emacsで開いた`.tex`ファイルの該当ページに飛んでくれます．Beamerのファイルで実行した場合，該当するページのフレーム`\frame{...}`の`}`にカーソルが来るように飛んでくれるようです．



#4. Forward Searchの設定

forward searchとは，エディタ（Emacs）で編集中の`.tex`上で何らかの操作をすると，`-synctex=1`オプションを使ってタイプセット（コンパイル）して出力されたPDFファイル上の対応する位置に飛んでくれる機能です．ここで，「何らかの操作」とは，YaTeXの場合，Emacs上で`C-c C-g`することを意味します．

ここでの設定は以下を参考にしました．設定は簡単です．

- [YaTeX @ TeX Wiki](https://texwiki.texjp.org/?YaTeX)

なお，ここではPDFビューアとしてSkimを利用することを想定して書きます．それ以外のビューアの場合，上記サイトのコードを参考にすれば良いかと思います．

##4.1 手順
**Step 1:** Emacsで初期化ファイル`init.el`を開き，YaTeXセクションの`:config`に以下を加筆する．

```emacs-lisp:~/.emacs.d/init.el
  (setq YaTeX-dvi2-command-ext-alist
  	'(("Skim" . ".pdf")))
  (setq dvi2-command "open -a Skim")
  (setq tex-pdfview-command "open -a Skim")
```
**Step 2:** 変更を保存し（`C-x C-s`），Emacsを閉じる（`C-x C-c`）．

####コメント
- ここで，`dvi2-command`と`tex-pdfview-command`はキーバインドでPDFファイルを開くための設定なので，`YaTeX-div2-command-ext-alist`がforward searchに重要と予測して，初期化ファイル`init.el`に`YaTeX-div2-command-ext-alist`の行だけコメントアウトして，`C-c C-g`でforward searchが機能するかを検証しました．結果，forward searchが行われました！ということで，そもそもこのコードは必要ないかもしれない？ちなみに，MELPAからインストールしたYaTeXのバージョンは`yatex-20200208.931`です．

##4.2 挙動
Beamerでforward searchを行ってみたところ，`.tex`ファイルの位置とは多少ずれる位置ではありますが，Skim上に赤いポイントと該当部分が選択された状態になります．






#A. 付録
##A.1 出力結果
###A.1.1 Skimのインストール

```
==> Downloading https://downloads.sourceforge.net/skim-app/Skim/Skim-1.5.9/Skim-1.5.9.dmg
==> Downloading from https://jaist.dl.sourceforge.net/project/skim-app/Skim/Skim-1.5.9/Skim-1.5.9.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'skim'.
==> Installing Cask skim
==> Moving App 'Skim.app' to '/Applications/Skim.app'.
==> Linking Binary 'displayline' to '/usr/local/bin/displayline'.
==> Linking Binary 'skimnotes' to '/usr/local/bin/skimnotes'.
==> Linking Binary 'skimpdf' to '/usr/local/bin/skimpdf'.
🍺  skim was successfully installed!
```
一部を抜粋しています．