秀丸 + TeX + Acrobat

TeX でタイプセット後に PDF ファイルを Acrobat で開く秀丸マクロを作ってみました。

Acrobat は開いている PDF ファイルをロックしてしまうため、タイプセットの前にファイルを閉じなければなりません。この不便を解消するため、W32TeX では pdfopen/pdfclose を用意していますが、より動作が軽快になるのではないかと期待し、直接 DDE により実装してみました。

$Acrobat = "C:\\Program Files (x86)\\Adobe\\Acrobat 10.0\\Acrobat\\Acrobat.exe";
// HKEY_CLASSES_ROOT\acrobat\shell\open\ddeexec\application
$Server = "AcroViewA10";
$file = basename2;
$ext = rightstr( $file, 4 );
if ($ext == ".tex") {
	$base = leftstr( $file, strlen( $file )-4 );
	$pdf = $base + ".pdf";
	ddeinitiate $Server, "Control";
	if ( result && existfile($pdf) ) {
		ddeexecute "[DocClose(" + $pdf + ")]";
		call TYPESET;
		ddeexecute "[DocOpen(" + $pdf + ")]";
	} else {
		call TYPESET;
		run $Acrobat;
		ddeinitiate $Server, "Control";
		ddeexecute "[DocOpen(" + $pdf + ")]";
	}
} else {
 	message "拡張子(" + $ext + ")が .tex ではありません。";
}
endmacro;

TYPESET:
//	platex + dvipdfmx の場合
	runsync2 "cmd /c platex " + $base + " && dvipdfmx " + $base;
//	platex + dvips + ps2pdf の場合
//	$ps = $base + ".ps";
//	runsync2 "cmd /c platex " + $base + " && dvips " + $base + " && ps2pdf " + $ps;
	if ( result && existfile($pdf) ) {
		return;
	} else {
		endmacro;
	}

1 行目と 3 行目を環境に合わせて読み替える必要があります。3 行目のサーバー名はレジストリ・エディタ(regedit)で辿っていけば見つかりますが、PowerShell を使うと簡単です。

PS C:\Users\既定> Get-ItemProperty "Registry::HKEY_CLASSES_ROOT\acrobat\shell\open\ddeexec\application"
(default)    : AcroViewA10
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\acrobat\shell\open\ddeexec\application
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\acrobat\shell\open\ddeexec
PSChildName  : application
PSProvider   : Microsoft.PowerShell.Core\Registry

せっかく作ったマクロですが、常に先頭ページに戻ってしまいます。

私は最終確認のときにしか PDF ファイルを必要としないので、上記でも十分実用的ですが、普通の人はやはり SumatraPDF でないと不便だと思います。

SumatraPDF の場合はこちら

参考までに pdfopen/pdfclose を利用するマクロも作ってみました。

$file = basename2;
$ext = rightstr( $file, 4 );
if ($ext == ".tex") {
	$base = leftstr( $file, strlen( $file )-4 );
	$pdf = $base + ".pdf";
	runex "pdfclose " + $pdf
		, 1             //sync    0:async 1:sync
		, 0, ""         //stdin   0:none 1:auto 2:file 3:(reserve) 4:all 5:select
		, 0, ""         //stdout  0:none 1:auto 2:file 3:add file  4:new 5:insert 6:replace
		, 0, ""         //stderr  0:none 1:=out/auto 2:file 3:add file  4:new 5:insert 6:replace
		, 0, ""         //folder  0:none 1:current 2:specify 3:(reserve) 4:exe's folder
		, 2             //show    0:auto 1:show 2:hide
		, 1             //nodraw  0:draw 1:no draw
		, 0             //unicode 0:ansi 2:utf-16 6:utf-8
		;
//	platex + dvipdfmx の場合
	runsync2 "cmd /c platex " + $base + " && dvipdfmx " + $base;
//	platex + dvips + ps2pdf の場合
//	$ps = $base + ".ps";
//	runsync2 "cmd /c platex " + $base + " && dvips " + $base + " && ps2pdf " + $ps;
	if ( result && existfile($pdf) ) {
		runex "pdfopen " + $pdf
			, 1             //sync    0:async 1:sync
			, 0, ""         //stdin   0:none 1:auto 2:file 3:(reserve) 4:all 5:select
			, 0, ""         //stdout  0:none 1:auto 2:file 3:add file  4:new 5:insert 6:replace
			, 0, ""         //stderr  0:none 1:=out/auto 2:file 3:add file  4:new 5:insert 6:replace
			, 0, ""         //folder  0:none 1:current 2:specify 3:(reserve) 4:exe's folder
			, 2             //show    0:auto 1:show 2:hide
			, 1             //nodraw  0:draw 1:no draw
			, 0             //unicode 0:ansi 2:utf-16 6:utf-8
			;
	}
} else {
 	message "拡張子(" + $ext + ")が .tex ではありません。";
}
endmacro;

環境に合わせて調整する必要がないというメリットがあります(サーバー名を書いたテキストファイル pdfddeservername.txt を pdfopen.exe 等と同じフォルダに置いておくと、動作速度の低下が軽減されるそうです。)。