秀丸と SumatraPDF で SyncTeX

GSview ではフォルダ名に日本語が入っていると PDF ファイルは開けないことが判明しました(PostScript は大丈夫なのに)。仕方がないので、代わりに SumatraPDF を使おう、せっかく SumatraPDF を使うなら SyncTeX に対応させよう、という話です。

SyncTeX のために(其の壱)

platex でタイプセットする際に、SyncTeX 用のデータを生成するため、-synctex=1 もしくは -synctex=-1 をつけなければなりません。両者は、データを圧縮するか、圧縮しないかの違いだそうです。例えば、

platex -synctex=1 hoge.tex && dvipdfmx hoge.dvi

のように実行します。

SyncTeX のために(其の弐)

まずは、簡単な「Inverse Search」の設定から。「Inverse Search」とは、SumatraPDF の画面をダブルクリックした時、秀丸エディタ(TeX ソース)の該当部分(おおむね段落基準)へジャンプする機能です。

SumatraPDF の設定

上述のようにして作った(SyncTeX 用のデータのある)PDF ファイルを SumatraPDF で開いて、「設定」→「オプション(O)」と辿り、「逆順検索コマンドラインの設定」の欄に、

"C:\Program Files\Hidemaru\Hidemaru.exe" /j%l "%f"

sumatrapdf-synctex

と入力します。もちろん秀丸エディタの在り処 C:\Program Files\Hidemaru\ は適宜読み替える必要があります。

秀丸エディタの設定

同じファイルを開こうとした際の動作(排他制御)の設定をしておきます。「動作環境」→「排他制御」と辿り、「秀丸エディタで同じファイルを開く場合(S)」を「同じファイルを2つ開くことを禁止する」を選択します。

Hidemaru-Ex1

SyncTeX のために(其の参)

次に、「Forward Search」の設定です。「Forward Search」とは、秀丸エディタから SumatraPDF の画面へジャンプする機能です。SumatraPDF のマニュアルに、以下のような説明があります。

Forward search gives you the ability to go from the source .tex file to the corresponding location in the PDF. When you invoke a forward search from your editor, SumatraPDF automatically highlights the corresponding location in the PDF. The communication between the editor and SumatraPDF relies on the DDE protocol (Supported by most editors such as WinEdt and TeXnicCenter).

要するに DDE を使う、ということですね。更に調べてみると、Server、Topic が、それぞれ「SUMATRA」と「control」であること、また、ファイルを開く命令

[Open("<pdffilepath>"[,<newwindow>,<setfocus>,<forcerefresh>])]

や、フォワード・サーチの命令

[ForwardSearch(["<pdffilepath>",]"<sourcefilepath>",<line>,<column>[,<newwindow>,<setfocus>])]

についての記述が見つかりますので、後は秀丸でマクロを書くだけです。おおよその流れ以下の通りです。

  1. 開いているファイルの拡張子が .tex かどうか調べ、
  2. 拡張子が .tex なら、platex と dvipdfmx でタイプセットし、
  3. タイプセットが成功したら、SumatraPDF に DDE 通信を申し出、
  4. 通信が確立できれば(すでに SumatraPDF が起動していれば)PDF ファイルを開く。
$SumatraPDF = "C:\\texlive\\2015\\bin\\win32\\SumatraPDF.exe";

$texfile = filename2;
$ext = rightstr( $texfile, 4 );
if ($ext == ".tex") {
	$base = leftstr( $texfile, strlen( $texfile )-4 );
//	platex + dvipdfmx の場合
	runsync2 "cmd /c platex -synctex=1 " + $base + " && dvipdfmx " + $base;
//	platex + dvips + ps2pdf の場合
//	$psfile = $base + ".ps";
//	runsync2 "cmd /c platex -synctex=1 " + $base + " && dvips " + $base + " && ps2pdf " + $psfile;
	if ( result ) {
		$pdffile = $base + ".pdf";
		ddeinitiate "SUMATRA", "control";
		if ( result ) {
			ddeexecute "[ForwardSearch(" + "\"" + $pdffile + "\"" + "," + "\"" + $texfile + "\"" + "," + str(lineno) + ",0,0,1)]";
		} else {
			run $SumatraPDF + " -reuse-instance " + $pdffile;
			ddeinitiate "SUMATRA", "control";
			ddeexecute "[ForwardSearch(" + "\"" + $pdffile + "\"" + "," + "\"" + $texfile + "\"" + "," + str(lineno) + ",0,0,1)]";
		}
	} else {
			message "タイプセットに失敗しました。";
	}
} else {
	message "拡張子(" + $ext + ")が .tex ではありません。";
}
endmacro;
  • これももちろん、一行目の SumatraPDF の在り処は適宜読み替える必要があります。
  • タイプセット後に PDF を前面に出したくない場合は、ForwardSearch(16、20 行目)の最後の引数を 0 変更。
※ 秀丸マクロは Shift_JIS で作らないとエラーになります。

最終更新日:2016/05/28