2015年4月2日木曜日

EmacsとSkimの連携 Part.2

まえがき

以前こういった記事がありました。
Ochiailab Tips: Emacs と Skim の連携
Skim という PDF ビューアは使ったことなかったのと、導入コストに比べて作業効率の向上は微々たるものなんじゃないかと思ってずっとやっていなかったのですが、先日該当記事を書いてくれた著者のデモを見て、「これこそ風だ」と思ったので導入を決意しました。
ただ、該当記事に Xtexshop というのが出てくるのですが、僕の Mac にはそんなもの入っておらず何それという感じなので少しだけ違う方法を取ることにしました。
latexmk というコマンドを使います。

latexmk について

LaTeX のコンパイル方法にはいくつかありますが、恐らく一番メジャーなのが platex して dvipdfmx するというやり方だと思います。
ただ、BibTeX なんかも使うと 5 回くらいコマンド打つことになるのでめんどくさくなりがちです。 LaTeX あるあるです。
過去にはこんな記事もあります。
もしくはこういう便利スクリプトを用意してくれている人もいます。
fjyuu/platexpdf
実はこんなことしなくても、最近の LaTeX のパッケージには platexbibtexdvipdfmx など一連のコンパイル作業を自動で行ってくれるコマンドが用意されています。
それが latexmk です。
latexmk にどういう処理を行わせるかというのは ~/.latexmkrc で設定できます。
僕のは参考サイト丸パクリですがこのようになっています。
$latex            = 'platex -synctex=1 -halt-on-error';
$latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode         = 3; # generates pdf via dvipdfmx
$clean_ext        = 'bbl rel %R-blx.bib %R.synctex.gz';

# Prevent latexmk from removing PDF after typeset.
# This enables Skim to chase the update in PDF automatically.
$pvc_view_file_via_temporary = 0;

# Use Skim as a previewer
$pdf_previewer    = "open -ga /Applications/Skim.app";
詳しくは以下の参考サイトを。
latexmk で楽々 TeX タイプセットの薦め(& biblatex+biber で先進的な参考文献処理) - konn-san.com
重要なのは -synctex=1 というオプションで SyncTeX によって Skim と連携できるようになることです。 $pdf_mode を 3 にすることで、
  1. platex
  2. bibtex
  3. platex
  4. platex 1
  5. dvipdfmx
という作業を latexmk <tex ファイル名> というコマンドだけでやってくれます。

Skim の設定

Skim をダウンロードしたら環境設定の「同期する」の「PDF-TeX 同期サポート」の「初期値」を Emacs にします。。。
が、僕の環境(Yosemite & Homebrew 版 Emacs)だとうまくいかなかったので「初期値」を「カスタム」としてコマンドを "/usr/local/bin/emacsclient" にします。
これは Homebrew 版の Emacs の場合なので他の版の Emacs を使っている場合は適宜修正してください。
あと「ファイルの変更をチェック」もチェックしておけばファイルの変更を監視してくれます。

Emacs の設定

latexmk を Emacs で使えるようにして、カーソルのある行が PDF 上のどこに該当するかを表示する設定です。
(server-force-delete)
(server-start); start emacs in server mode so that skim can talk to it

(add-hook 'LaTeX-mode-hook (function (lambda ()
  ;; Use Skim as viewer, enable source <-> PDF sync
  ;; make latexmk available via C-c C-c
  ;; Note: SyncTeX is setup via ~/.latexmkrc
  (add-to-list 'TeX-command-list
               '("latexmk" "latexmk %s" TeX-run-TeX nil t
                 :help "Run latexmk on file"))
  ;; Open PDF via Skim.app
  (add-to-list 'TeX-command-list
               '("Skim" "open -a Skim.app '%s.pdf'" TeX-run-command t nil))
  ;; Open PDF via Skim.app in the background.
  (add-to-list 'TeX-command-list
               '("SkimBG" "open -g -a Skim.app '%s.pdf'" TeX-run-command t nil))

)))

(setq japanese-TeX-command-default "latexmk")
(setq TeX-command-default "latexmk")

;; use Skim as default pdf viewer
;; Skim's displayline is used for forward search (from .tex to .pdf)
;; option -b highlights the current line; option -g opens Skim in the background 
(setq TeX-view-program-list
     '(("Skim" "displayline -b -g %n %o %b"))) ;; displayline must be available.
(setq TeX-view-program-selection '((output-pdf "Skim")))
こちらの記事と若干被る設定もあるので適宜修正してください。
Ochiailab Tips: AUCTex + RefTex で快適論文作成
あと displayline というコマンドがある場所にパスを通す必要がありますが、通さなくても代わりに /Applications/Skim.app/Contents/SharedSupport/displayline と書き換えると大丈夫です。

使い方

Emacs 側

  • C-c C-c latexmk
latexmk を実行して、
  • C-c C-c Skim
で Skim で PDF ファイルを開きます。 一度 Skim.app を開いたままにしておけば
  • C-c C-v
でカーソルのある行が PDF 上に表示されます。これはバックグランドで Skim が動くのでいちいち Skim にフォーカスが移ることがなく Emacs で作業を続行できます。 ただし、なぜか latexmk し直してから C-c C-v やると "No matching viewer found." と言われてしまいます。 その時のために
  • C-c C-c SkimBG
という Skim をバックグラウンドでコマンドを開くコマンドを付けてあります。

Skim 側

PDF を「Cmd+Shift+クリック」で Emacs 上の該当場所に飛べます。
これで LaTeX でも WYSIWYG ライクな編集が可能になりますよ! 使え。

その他参考サイト

latex - Emacs + Synctex + Skim: How to correctly set up syncronization? - Stack Overflow

Footnotes:

1 検証が不十分なので 4 がちゃんと行われているかは定かではないけど、イニシャルコンパイルでちゃんと参照できている pdf が生成されていたので行われているはず。


3 件のコメント :