SyncTeX(シンクテフ)は、.tex ソースの一点と、組み上がった PDF の対応する一点とを、双方向に行き来できるようにする仕組みです。エディタでカーソルを置いた段落へ PDF をスクロールし、逆に PDF のある語をクリックして原稿の該当行へ飛ぶ——長い文書の校正では手放せません。このページでは SyncTeX 全般の仕組みを説明します。各エディタごとの具体的な操作は、それぞれのページに譲ります。
SyncTeX とは
TeX は原稿全体を一括処理して PDF を作るため、出力された 1 行が原稿のどこから来たのかは、ふつう失われてしまいます。SyncTeX(Synchronize TeXnology)は、その対応関係を保存する技術です。作者は ジェローム・ローラン(Jérôme Laurens) で、いまでは TeX Live・MiKTeX の主要エンジンに標準で組み込まれています。
はたらきは二方向あります。原稿からPDFへ向かうのが 前方検索(forward search、直接同期)、PDFから原稿へ戻るのが 逆検索(inverse / reverse search、後方同期) です。どちらもエディタと PDF ビューアが協調して実現します。エディタは「原稿のこの行・桁を見たい」あるいは「PDF のこの座標は原稿のどこか」を問い合わせ、ビューアやヘルパーがその答えを返します。
前方検索と逆検索
前方検索(原稿 → PDF) は、書いている最中に「いま編集している箇所は、刷り上がるとどこか」を確かめる動きです。エディタでカーソルを置き、前方検索のキー(または「PDF を表示」のようなメニュー)を押すと、ビューアが該当ページへスクロールし、対応箇所を一瞬ハイライトします。
逆検索(PDF → 原稿) はその逆で、校正中に効きます。PDF を眺めていて直したい箇所を見つけたら、そこをクリック(多くは修飾キーを併用)するだけで、エディタが前面に出て該当行へカーソルが飛びます。長い文書のどこを直せばよいか探し回らずに済むのが要点です。
内部では、SyncTeX 付属のコマンドラインツール synctex が橋渡しをします。前方検索はサブコマンド synctex view、逆検索は synctex edit に対応し、エディタやビューアはこれらを呼ぶか、同等の処理を自前で実装しています。普段は意識しませんが、トラブル時にこの 2 つを手で叩くと切り分けに役立ちます。
`.synctex.gz` ファイルと有効化
この対応関係は、コンパイル時にエンジンが出力する **.synctex.gz ファイルに記録されます。中身は、ソースのファイル・行・桁 と、PDF のページおよびページ内の矩形(ボックス)の座標** とを対応づけた地図で、zlib で圧縮されています。PDF と同じ名前・同じ場所に並んで置かれます(main.tex なら main.synctex.gz)。前方・逆どちらの検索も、このファイルがあって初めて動きます。
生成するには、コンパイル時に **-synctex=1** を渡します(LuaTeX は長い形の --synctex=1)。手で叩くなら次のとおり。ビルドのたびに必要なので、ふつうはエディタやビルドツールの設定に入れっぱなしにします。
pdflatex -synctex=1 main.tex
xelatex -synctex=1 main.tex
lualatex --synctex=1 main.tex値はビットの意味を持ちます。**1** は圧縮した .synctex.gz、**-1** は圧縮しない素の .synctex(中身を覗いたりデバッグするときに便利)を出します。コマンドラインの代わりに、ソースの冒頭で TeX プリミティブ \synctex=1 を書いて有効化することもできます。
ビルドツールを使う場合も同じです。latexmk なら、設定ファイル .latexmkrc でコンパイル命令に -synctex=1 を含めておきます。-pvc による継続プレビューと組み合わせると、保存するたび再コンパイル&プレビュー更新となり、前方・逆検索が常に最新の .synctex.gz に対して効きます。
$pdf_mode = 1;
$pdflatex = 'pdflatex -synctex=1 -interaction=nonstopmode %O %S';
# clean up the SyncTeX file too
@generated_exts = (@generated_exts, 'synctex.gz');エンジンと、DVI 経由(pLaTeX / upLaTeX)の場合
PDF を直接吐くエンジン——pdfTeX・XeTeX・LuaTeX——は、いずれも -synctex を解釈し、自分で .synctex.gz を書きます。pdfLaTeX・XeLaTeX・LuaLaTeX も同じです。ここまでは話が単純です。
日本語で主流の pLaTeX / upLaTeX は、いったん DVI を出し、それを dvipdfmx で PDF に変換する二段構えです。この場合も -synctex=1 を **エンジン(platex / uplatex)側 に渡します。エンジンはまず DVI の座標系** で .synctex.gz を書きます。ただし DVI の座標と最終 PDF の座標は、dvipdfmx がかける余白・倍率の調整ぶんだけずれているため、変換後にこの差を吸収する必要があります。
その仕上げを担うのが synctex のサブコマンド **synctex update** で、「DVI/XDV → PDF のフィルタをかけた後に SyncTeX ファイルを更新する」ためのものです。dvipdfmx 自身に -synctex オプションがあるわけではなく、変換に使った倍率・水平/垂直オフセット(-m / -x / -y、フィルタに渡したのと同じ値)を synctex update に伝えて座標をそろえます。ptex2pdf や latexmk といった上位のツールが、この一連を自動でやってくれるのがふつうです。
エディタごとの操作
SyncTeX 自体は共通の土台で、「どのキー/クリックで前方・逆検索を起こすか」だけがエディタとビューアで異なります。代表的な組み合わせを挙げます(詳しい設定は各ページへ)。Adobe Acrobat / Reader のように SyncTeX に対応しないビューアでは逆検索が効かない点に注意してください。Skim(Mac)・SumatraPDF(Windows)・Okular(Linux)などが定番です。
| エディタ(ビューア) | 前方検索(原稿→PDF) | 逆検索(PDF→原稿) |
|---|---|---|
TeXShop / Skim | Cmd+クリック(プレビュー上) | Shift+Cmd+クリック(PDF 上) |
TeXstudio | Ctrl+クリック、または「PDF へ移動」 | Ctrl+クリック、または「ソースへ移動」 |
VS Code (LaTeX Workshop) | Ctrl/Cmd+Alt+J | ビューア依存(例: Okular は Shift+クリック) |
最後に精度の話を。SyncTeX が対応づけるのは組版の「箱」単位なので、ふつうの本文では十分正確に飛びますが、TikZ の図中・複雑なマクロの展開結果・表組みの内部などでは、対応が近くの箱に丸められ、狙いの一語からずれることがあります。これは仕組み上の限界で、不具合ではありません。