SyncTeX 是一种机制,可让您在 .tex 源中的点与完成的 PDF 中的匹配点之间双向跳转。将光标放在某个段落上,查看者就会滚动到该段落;单击 PDF 中的一个单词,编辑器会跳转到该源代码行。当您校对长文档时,这是必不可少的。本页解释了 SyncTeX 的一般工作原理;每个编辑者的步骤位于每个编辑者自己的页面上。
SyncTeX 是什么
因为 TeX 会立即处理整个手稿以生成 PDF,所以输出行与其来源位置之间的链接通常会丢失。 SyncTeX(同步 TeXnology)是保留该对应关系的技术。它由 Jérôme Laurens 创建,现在内置于 TeX Live 和 MiKTeX 附带的主要引擎中。
它在两个方向上发挥作用。从源到PDF就是正向搜索(也叫直接同步);从 PDF 回到源是反向搜索(或反向/向后搜索)。两者都是编辑器和 PDF 查看器之间的合作:编辑器询问“显示此行和列的输出”或“此 PDF 坐标映射到哪个源位置”,查看器或助手会回答。
正向和反向搜索
正向搜索(来源 → PDF) 回答您在写作时提出的问题:“我正在编辑的位置最终会出现在页面上的哪个位置?”将光标放在编辑器中,按向前搜索键(或“转到 PDF”等菜单项),查看器滚动到右侧页面并短暂突出显示匹配位置。
逆向搜索(PDF→来源)是相反的,在校对时闪闪发光。阅读 PDF 后,您发现有什么需要修复的地方吗?单击该位置(通常使用修饰键),您的编辑器就会出现在前面,并且光标位于匹配的行上。关键是你永远不需要在很长的资源中寻找要编辑的地方。
在幕后,命令行工具 synctex(随 SyncTeX 一起提供)进行代理。正向搜索对应子命令synctex view,逆向搜索对应synctex edit;编辑者和观众要么调用它们,要么自己实现等效的东西。您通常看不到它们,但手动运行这两个是隔离问题的便捷方法。
.synctex.gz 文件,并将其打开
该对应关系记录在引擎在编译时写入的 .synctex.gz 文件中。里面是一个 zlib 压缩的地图,它将源文件、行和列与 PDF 页面及其上矩形(一个框)的坐标配对。它位于 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 给出 gzip 压缩后的 .synctex.gz; -1 给出一个简单的、未压缩的 .synctex (当你想查看内部或调试时很方便)。您还可以使用 TeX 原语 \synctex=1 从源顶部打开它,而不是命令行。
构建工具也不例外。使用 latexmk,将 -synctex=1 放入 .latexmkrc 中的编译命令中。与连续预览 (-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)。引擎首先将 .synctex.gz 写入 DVI 坐标。但 DVI 坐标和 Final-PDF 坐标因偏移量和 dvipdfmx 应用的放大倍数而不同,因此转换后必须协调间隙。
最后的修饰是 synctex 子命令 synctex update,其作用是“在应用 dvi/xdv → pdf 过滤器后更新 SyncTeX 文件”。 dvipdfmx本身没有-synctex选项;相反,您将用于转换的放大倍数和水平/垂直偏移交给 synctex update(-m / -x / -y,传递给过滤器的相同值),以便坐标对齐。实际上,ptex2pdf 或 latexmk 等更高级别的工具会为您运行整个链。
每个编辑器如何触发它
SyncTeX本身就是共同基础;编辑者和查看者之间只有触发正向和反向搜索的按键或单击有所不同。以下是一些代表性组合(请参阅每页了解完整设置)。请注意,不支持 SyncTeX 的查看器(例如 Adobe Acrobat / Reader)无法进行反向搜索;常见的选择有 Skim (macOS)、SumatraPDF (Windows) 和 Okular (Linux)。
| Editor(观众) | 转发(来源→PDF) | 逆(PDF→源) |
|---|---|---|
TeXShop / Skim | 在预览中按住 Cmd 单击 | 按住 Shift-Cmd 键并单击 PDF |
TeXstudio | 按住 Ctrl 键单击,或“转到 PDF” | 按住 Ctrl 键单击,或“跳转到源” |
VS Code (LaTeX Workshop) | Ctrl/Cmd+Alt+J | Viewer 特定的(例如,在 Okular 中按住 Shift 键并单击) |
关于精度的最后一句话。 SyncTeX 映射在排版“框”的粒度上,因此在普通正文中,跳转足够准确 - 但在 TikZ 图片、复杂宏的扩展或表格的内部结构中,匹配可以四舍五入到附近的框,并偏离目标一两个单词。这是该方法的限制,而不是错误。
使用 SyncTeX 进行校对循环
SyncTeX 不仅仅是一个设定;这是一种校对习惯。在 PDF 提交之前的最后一遍,单击 PDF 中的可疑单词返回源,编辑稿件,保存并重建,然后使用正向搜索返回到更正的位置。如果此 SyncTeX 校对循环失败,请按顺序检查:.synctex.gz 是否位于 PDF 旁边,构建是否使用 -synctex=1,以及查看器是否可以运行调用编辑器的命令。
.synctex.gz文件既不是提交也不是记录来源;这是一个可再生的工作地图。通常在 Git 中忽略它,并且每当 PDF 或源路径被重命名时就怀疑它是陈旧的。单字偏移可能是框级映射的限制,但跳转到完全不同的文件通常意味着过时的输出或错误的主文件。