CotEditor で SyncTeX

CotEditor で TeX 文書を作成し、platex + dvips + ps2pdf でタイプセット、Skim でプレビュー、という環境で、SyncTeX を実現する AppleScript を作ってみました。

CotEditor の設定

platex + dvips + ps2pdf 用 AppleScript

以下の内容を例えば「タイプセット.@t.applescript」という名前で ~/Library/Application\ Scripts/com.coteditor.CotEditor に保存しておけば、「command + t」でタイプセットから PDF の表示までを一気に実行してくれます。

tell application "CotEditor"
	if exists front document then
		set thelinerange to line range of selection of front document
		set theline to item 1 of thelinerange
		set thisfile to path of front document as Unicode text
		set thisdir to (do shell script "/usr/bin/dirname \"" & thisfile & "\"")
		set thisbase to thisdir & "/" & (do shell script "/usr/bin/basename \"" & thisfile & "\" .tex")
		-- file name: tex, ps, pdf
		set thistex to thisbase & ".tex"
		set thisps to thisbase & ".ps"
		set thispdf to thisbase & ".pdf"
		-- command with args: cd, platex, dvips, ps2pdf, skim
		set cd to " cd \"" & thisdir & "\""
		set tex2dvi to "platex -synctex=1 -interaction=nonstopmode \"" & thisbase & "\""
		set dvi2ps to "dvips \"" & thisbase & "\""
		set ps2pdf to "/Applications/Ghostscript.app/bin/ps2pdf \"" & thisps & "\""
		set skim to "/Applications/Skim.app/Contents/SharedSupport/displayline -g -r " & theline & " \"" & thispdf & "\""
 		-- typeset command: concatenate above
		set typeset to cd & " && " & tex2dvi & " && " & dvi2ps & " && " & ps2pdf & " && " & skim

		tell application "System Events"
			if exists file thistex then
				tell application "Terminal"
					launch
					if not (exists window 1) then
						reopen
						do script typeset in window 1
					else
						set targetWindow to window 0
						repeat with currentWindow in reverse of (get every windows)
							if currentWindow is not busy then
								set targetWindow to currentWindow
							end if
						end repeat
						if (targetWindow is window 0) then
							do script typeset
						else
							do script typeset in targetWindow
						end if
					end if
				end tell
			else
				display alert "TeX ファイルではないようです。"
			end if
		end tell
		activate
	end if
end tell

補足1

Skim を前面に出したくないので、オプションスイッチに「-g」を付けています(17 行目)。

補足2

エラーが発生した場合も止まって欲しくないので、「-interaction=nonstopmode」を付けています(14 行目)。エラー行にジャンプしたい場合は、これを外しておく必要があります。その場合は、Terminal を前面に出す方が便利かもしれません。

補足3

ファイル名等(thisdir、thisbase、thisps、thispdf)を引用符で括る記述は、「quoted form of thisbase」の方が美しいと思いますが、上記では文字数を減らすため「"\"" & thisbase "\""」等としています。

補足4

タイプセットのたびにシェルの履歴に下記のようなゴミが溜まってしまいます。

cd '/Users/muskmelon/Documents' && platex -synctex=1 -interaction=nonstopmode '/Users/muskmelon/Documents/test' && dvips '/Users/muskmelon/Documents/test' && /Applications/Ghostscript.app/bin/ps2pdf '/Users/muskmelon/Documents/test.ps' && /Applications/Skim.app/Contents/SharedSupport/displayline -g -r 675 '/Users/muskmelon/Documents/test.pdf'

これを抑止するため、上記の AppleScript の 13 行目で

		set cd to " cd \"" & thisdir & "\""

のように、cd の前に半角スペースを入れてあります。従って、~/.bash_profile 等に

export HISTCONTROL=ignorespace

と設定しておけば履歴に残らなくなります。

Skim の設定

参考にさせていただいたサイト(ありがとうございました。)

「同期する」を以下のように設定

  • ファイルの変更をチェック → チェックを外す
  • 初期値:カスタム
  • コマンド:/Applications/CotEditor.app/Contents/SharedSupport/bin/cot
  • 引数:-l %line "%file"

使い方

PDF の画面を「shift + command + クリック」すると、CotEditor の該当箇所にジャンプできます。

最終更新日: 2018年6月10日