CotEditor で TeX を使う設定 Ver. 3.0

新・CotEditor で TeX を使う設定をさらに改良しました。

TeX を使う設定 Ver. 3.0

CotEditor は大きなファイルを扱うと動作が遅くなってしまいますので、分割ファイルに対応させることにしました。子ファイルの 1 行目に % に続けて親ファイルの名前を書いておけば、それを優先的にタイプセットする仕組みです(親ファイルが設定されていない場合は、通常通り自分自身をタイプセットします)。

%% main.tex
\chapter{子ファイル}
.....

上記のファイルの場合は自分自身ではなく、自分自身と同じフォルダに入っている main.tex をタイプセットします。

platex + dvips (Ver. 3.0)

platex で dvi ファイルを生成し、更に dvips で ps ファイルを生成する AppleScript です。

tell application "CotEditor"
	if exists front document then
		-- ex. thisfile: /Users/myname/Documents/file.tex
		--     thisdir : /Users/myname/Documents/
		set thisfile to path of front document as Unicode text
		set thisdir to (do shell script "/usr/bin/dirname \"" & thisfile & "\"")
		-- file.tex の 1 行目に親ファイルを設定
		-- 行頭に % を(1 個以上)付ける。拡張子 .tex は無くても可。
		-- ex. %% main.tex
		--     thisbase: main
		set thisbase to (do shell script "/usr/bin/head -1 \"" & thisfile & "\" | sed s/^\\%*\\ *// | sed s/\\.tex$//")
		-- 親ファイルが設定されていないか存在しない場合は、自分自身を thisbase に設定
		-- ex. thisbase: file
		tell application "Finder"
			if not (exists (thisdir & "/" & thisbase & ".tex") as POSIX file) then
				set thisbase to (do shell script "/usr/bin/basename \"" & thisfile & "\" .tex")
			end if
		end tell
		-- command with args: cd, platex, dvips
		-- platex と dvips の引数に与えるファイル名は、拡張子不要
		set cd to " cd \"" & thisdir & "\""
		set tex2dvi to "platex -synctex=1 -interaction=nonstopmode \"" & thisbase & "\""
		set dvi2ps to "dvips \"" & thisbase & "\""
		-- typeset command: concatenate above
		set typeset to cd & " && " & tex2dvi & " && " & dvi2ps & " && cd -"
		tell application "Finder"
			if (exists (thisdir & "/" & thisbase & ".tex") as POSIX file) 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

21 行目の cd コマンドの前に半角スペースを入れています。その理由はこちらに書きましたが、履歴を残さないためです。

補足説明2

28 行目以降が Terminal を起動し実際にタイプセットする命令です。割と面倒なことをしていますが、ここまでやらないと実用になりません。

platex + dvips + ps2pdf + Skim (Ver. 3.0)

上記に加え、ps2pdf で PDF を作成したのち、Skim で表示する AppleScript です。

tell application "CotEditor"
	if exists front document then
		-- 行番号を取得(Skim 用)
		set thelinerange to line range of selection of front document
		set theline to item 1 of thelinerange
		-- ex. thisfile: /Users/myname/Documents/file.tex
		--     thisdir : /Users/myname/Documents/
		--     thisbase: file
		set thisfile to path of front document as Unicode text
		set thisdir to (do shell script "/usr/bin/dirname \"" & thisfile & "\"")
		set thisbase to (do shell script "/usr/bin/basename \"" & thisfile & "\" .tex")
		-- file.tex の 1 行目に親ファイルを設定
		-- 行頭に % を(1 個以上)付ける。拡張子 .tex は無くても可。
		-- ex. %% main.tex
		--     thismain: main
		set thismain to (do shell script "/usr/bin/head -1 \"" & thisfile & "\" | sed s/^\\%*\\ *// | sed s/\\.tex$//")
		-- 親ファイルが存在しない場合は、自分自身(thisbase)を thismain に設定
		-- ex. thismain: file
		tell application "Finder"
			if not (exists (thisdir & "/" & thismain & ".tex") as POSIX file) then
				set thismain to thisbase
			end if
		end tell
		-- command with args: cd, platex, dvips, ps2pdf, skim
		set cd to " cd \"" & thisdir & "\""
		set tex2dvi to "platex -synctex=1 -interaction=nonstopmode \"" & thismain & "\""
		set dvi2ps to "dvips \"" & thismain & ".dvi\""
		set ps2pdf to "ps2pdf \"" & thismain & ".ps\""
		set skim to "/Applications/Skim.app/Contents/SharedSupport/displayline -g -r " & theline & " \"" & thismain & ".pdf\" \"" & thisbase & ".tex\""
 		-- typeset command: concatenate above
		set typeset to cd & " && " & tex2dvi & " && " & dvi2ps & " && " & ps2pdf & " && " & skim & " && cd -"
		tell application "Finder"
			if (exists (thisdir & "/" & thismain & ".tex") as POSIX file) 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

platex + dvipdfmx + Skim (Ver. 3.0)

dvips + ps2pdf ではなく dvipdfmx で PDF ファイルを生成し、Skim で表示する AppleScript です。

tell application "CotEditor"
	if exists front document then
		-- 行番号を取得(Skim 用)
		set thelinerange to line range of selection of front document
		set theline to item 1 of thelinerange
		-- ex. thisfile: /Users/myname/Documents/file.tex
		--     thisdir : /Users/myname/Documents/
		--     thisbase: file
		set thisfile to path of front document as Unicode text
		set thisdir to (do shell script "/usr/bin/dirname \"" & thisfile & "\"")
		set thisbase to (do shell script "/usr/bin/basename \"" & thisfile & "\" .tex")
		-- file.tex の 1 行目に親ファイルを設定
		-- 行頭に % を(1 個以上)付ける。拡張子 .tex は無くても可。
		-- ex. %% main.tex
		--     thismain: main
		set thismain to (do shell script "/usr/bin/head -1 \"" & thisfile & "\" | sed s/^\\%*\\ *// | sed s/\\.tex$//")
		-- 親ファイルが存在しない場合は、自分自身(thisbase)を thismain に設定
		-- ex. thismain: file
		tell application "Finder"
			if not (exists (thisdir & "/" & thismain & ".tex") as POSIX file) then
				set thismain to thisbase
			end if
		end tell
		-- command with args: cd, platex, dvipdfmx, skim
		set cd to " cd \"" & thisdir & "\""
		set tex2dvi to "platex -synctex=1 -interaction=nonstopmode \"" & thismain & "\""
		set dvi2pdf to "dvipdfmx \"" & thismain & "\""
		set skim to "/Applications/Skim.app/Contents/SharedSupport/displayline -g -r " & theline & " \"" & thismain & ".pdf\" \"" & thisbase & ".tex\""
 		-- typeset command: concatenate above
		set typeset to cd & " && " & tex2dvi & " && " & dvi2pdf & " && " & skim & " && cd -"
		tell application "Finder"
			if (exists (thisdir & "/" & thismain & ".tex") as POSIX file) 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

PS ファイルを gv で開く (Ver. 3.0)

tell application "CotEditor"
	if exists front document then
		-- ex. thisfile: /Users/myname/Documents/file.tex
		--     thisdir : /Users/myname/Documents/
		set thisfile to path of front document as Unicode text
		set thisdir to (do shell script "/usr/bin/dirname \"" & thisfile & "\"")
		-- file.tex の 1 行目に親ファイルを設定
		-- 行頭に % を(1 個以上)付ける。拡張子 .tex は無くても可。
		-- ex. %% main.tex
		--     thisbase: main
		set thisbase to (do shell script "/usr/bin/head -1 \"" & thisfile & "\" | sed s/^\\%*\\ *// | sed s/\\.tex$//")
		-- 親ファイルが設定されていないか存在しない場合は、自分自身を thisbase に設定
		-- ex. thisbase: file
		tell application "Finder"
			if not (exists (thisdir & "/" & thisbase & ".tex") as POSIX file) then
				set thisbase to (do shell script "/usr/bin/basename \"" & thisfile & "\" .tex")
			end if
		end tell
		-- file name: ps
		set thisps to thisdir & "/" & thisbase & ".ps"
		-- command with args: gv
		set gv to " /Applications/Ghostscript.app/gv \"" & thisps & "\""
	end if
end tell
tell application "Finder"
	if (exists thisps as POSIX file) then
		tell application "Terminal"
			launch
			if not (exists window 1) then
				reopen
				do script gv 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 gv
				else
					do script gv in targetWindow
				end if
			end if
		end tell
	else
		display alert "PostScript ファイルが存在しないようです。"
	end if
end tell

補足説明1

利用される場合は、gv の在り処(22 行目)を適宜読み替えてください。