我现在正使用一个脚本来构建我的 LaTeX,该脚本对我的 .Tex 文件进行预处理,生成新的文件作为输出,然后用 latexmk 进行编译。
理想情况下,synctex 文件将指向原始文件而不是生成的输出,这样我就可以轻松地在查看器和编辑器之间跳转。
假设生成的文件与原始文件逐行对应,或者我有某种方法可以找到它们之间的匹配行,那么有没有办法轻松编辑生成的 synctex 文件以指向正确的东西?
答案1
编辑同步文本输出文件:指向正确的文件。
问题中提供的信息不完整。问题将重新表述缺失的细节,然后在此背景下回答。
重新措辞的问题。
我们假设脚本要处理的源几乎是 TeX 引擎消化的文件,pdflatex 假设。设想的文件夹结构$HOME="/home/jmite"是
/home/jmite/tex/src /home/jmite/tex/work
未处理的 TeX 文件特克斯及其脚本处理的输出a+.tex假设位置如下:
/home/jmite/tex/src/a.tex /home/jmite/tex/work/a+.tex
主文件假设为
/home/jmite/tex/work/main.tex
Engine pdflatex 从连接的文件夹编译 PDF/主页/jmite/tex/工作。
问题。
同步提供同步数据主同步文本。但是,编辑器在向前搜索期间加载的文件是a+.tex并不是特克斯. 同样,反向搜索需要脚本输出a+.tex在编辑器中,而不是所需的源中特克斯。
文本编辑器应该只加载/home/jmite/tex/src/a.tex,原始模板。
问题:
能特克斯在编辑器中打开,而不是a+.tex,通过编辑同步文本文件?
简短回答。
文件名a+.tex可以编辑文件名特克斯在 synctex 文件中主同步文本。关联的数据会出错。正向和反向搜索都会将光标定位到错误的位置。
这仍然是解决这个问题最简单的方法。替换主同步文本这是 shell 脚本的输出,内容如下主同步文本逐行并更改受影响的文件名。
如何编辑主同步文本。
经过测试的解决方案是使用编辑器按钮调用 BASH 脚本进行编辑。由于项目中文件夹和文件名的特殊性,脚本构建非常耗时。基本脚本内容如下主同步文本逐行回显该行或其编辑版本tmp.synctex,同一目录。重命名文件tmp.synctex到主同步文本完成。由于 main.synctex 可能有数百万行,因此该脚本的运行时间可能很长。
如何使用编辑器按钮。
如果不点击按钮,则默认同步文本使用的操作:向前搜索加载a+.tex在编辑器中。反向搜索按预期工作。单击按钮后,正向搜索加载特克斯在编辑器中。反向搜索可能会被破坏。
结构主同步X
查看 main.synctex 的建议对于了解 synctex 的工作原理是正确的且有价值的。
假定:主文本是 pdflatex 编译的文件,main.tex 中引用了许多 TeX/LaTeX 文件。假设有一个大型项目,比如一本书,在 12 个以上的章节中使用了 BibTeX、多个索引、图表、方程式等。
TeX 引擎使用命令行开关--synctex=-1制作 main.synctex 和--synctex=1生成 main.synctex.gz。如果 pdflatex 生成 main.synctex.gz,则需要额外的解压缩步骤:gzip -d 主要.synctex.gz,这将创建更大的文本文件主同步文本。
检查主同步文本使用 Linux 终端命令较少的。会有许多行看起来像
Input:1:/home/jmite/tex/work/main.tex Input:2:/usr/local/texlive/2021/texmf-dist/tex/latex/base/book.cls Input:3:/usr/local/texlive/2021/texmf-dist/tex/latex/base/leqno.clo Input:4:/usr/local/texlive/2021/texmf-dist/tex/latex/base/bk11.clo Input:5:/usr/local/texlive/2021/texmf-dist/tex/latex/geometry/geometry.sty
在这个例子中,190 万行中有 460 行这样的行。以关键字开头的行输入引用由 main.tex 输入的文件,TeX 引擎使用它来创建 main.pdf。数据跟在某些行后面,例如:
Input:86:/home/jmite/tex/work/section1-3.tex !59 {3 [86,167:4736286,43087544:21905327,38351258,267389 (86,167:4736286,4736286:0,0,0 [86,167:0,4736286:0,0,0 (86,167:0,0:0,0,0 g86,167:0,0 )
数据的解释最好留给Laurent 的 synctex 文章在
http://www.tug.org/TUGboat/tb29-3/tb93laurens.pdf
简单解释一下:数据是编码信息,记录了 PDF 中由pdflatex使用文件第1-3节.tex。
向前搜索。
假设 section1-3.tex 未加载到编辑器中。假设 PDF 查看器显示该部分。PDF 正向搜索(鼠标双击)可能会打开包含 main.tex 的文本编辑器并加载 section1-3.tex 进行编辑,光标移动到 PDF 中显示的大致位置。这是如何实现的?PDF 页面和光标位置从 main.synctex 中的数据中提供了提示,说明哪个源文件生成了 PDF 页面。编辑器操作必须使用源文件名来加载它,然后将编辑器文本光标定位到与 PDF 相对应的大致位置。
逆向搜索。
假设 section1-3.tex 在编辑器中打开,并请求反向搜索(菜单项或鼠标单击),则 PDF 查看器应显示与编辑器文本匹配的页面。编辑器必须将文件名 section1-3.tex 和文本光标位置传递给 PDF 查看器,后者又使用 main.synctex 来确定要显示哪个页面以及要突出显示哪些内容。有关其工作原理的进一步了解可以从手册页中获取Laurent 的终端程序 synctex,与 TeXLive2021 一起分发。
正向和反向搜索的准确性受您点击的位置影响。如果该位置没有可用的 synctex 数据,则可能会出现意外情况。例如,您点击 PDF 中的某个图形,文本编辑器会加载您从未想过要编辑的文件。或者,您点击 PDF 目录,文本编辑器会意外切换到 main.tex 中看似不相关的行。