背景

背景

我为 vim 和 mupdf 编写的前向搜索脚本在安装 TL 2011 后不再起作用,调查原因后发现,synctex 现在对文件名非常挑剔,至少对于 来说是这样。它不仅需要完整路径,还要求在路径末尾synctex view有一个冗余。/./

复制。设scratch.tex

 \documentclass{article}
 \begin{document}
 Hello world
 \end{document}

现在,从命令行查看以下结果:

kck@kck-desktop ~/tmp $ pdflatex -synctex=1 scratch.tex &>/dev/null
kck@kck-desktop ~/tmp $ synctex view -i 3:1:scratch.tex -o scratch.pdf
This is SyncTeX command line utility, version 1.2
SyncTeX Warning: No tag for scratch.tex
kck@kck-desktop ~/tmp $ synctex view -i 3:1:/home/kck/tmp/scratch.tex -o scratch.pdf
This is SyncTeX command line utility, version 1.2
SyncTeX Warning: No tag for /home/kck/tmp/scratch.tex
kck@kck-desktop ~/tmp $ synctex view -i 3:1:/home/kck/tmp/./scratch.tex -o scratch.pdf
This is SyncTeX command line utility, version 1.2
SyncTeX result begin
Output:scratch.pdf
Page:1
x:171.128296
y:134.764618
h:133.768356
v:134.764618
W:343.711060
H:6.918498
before:
offset:0
middle:
after:
SyncTeX result end

对 synctex 使用这种语法是非常违反直觉的,并且我犹豫是否要修复我的脚本以使用这类文件名,因为担心 synctex 的语法会再次被改变。

在 TeXlive 2010 中,我并不存在这个问题。这种改变是故意的吗?它会持续下去吗?

答案1

从相对路径到绝对路径的切换是有意而为之并且会保留下来,因为这是切换--output-directory工作的必要条件。

嵌入的模糊性/./可能可以修复,但应该与 Jérôme Laurens(synctex 开发人员)一起解决。联系他的最简单方法是向 TeX Live 邮件列表发送电子邮件。请参阅Tug 的 texlive 主页了解更多信息。

答案2

我知道这个问题已经很老了,但是我想我会添加我的解决方案,因为这个结果是在我寻找问题原因时出现的。

背景

看起来,.synctex.gz文件中存储的路径名是由库决定的kpathsea。例如,我从不同的文件中包括我的论文的每一章,所以我的背景信息写在文件中background.tex。在修复之前,该文件的路径名存储为/home/user/thesis/./background.tex,这是因为工作目录是,而/home/user/thesis相对路径background.texkpsewhich

$ kpsewhich background.tex
./background.tex

将路径放在一起,很容易看出为什么 synctex 文件会存储/home/user/thesis/./background.tex为文件名。不过这也暗示了解决方案……

解决方案

解决方案是输出kpathsea正确格式的路径,具体方法是kpsewhich 不是返回任何相对路径。这是通过设置环境变量 ( TEXINPUTS) 来实现的,该变量告诉kpathsea库当前目录实际上是库路径的一部分。(请注意,结尾的冒号是必需的。没有它,默认的 TeXLive 路径将被遗忘,并且无法找到任何标准包。冒号kpathsea还指示将默认列表附加到环境变量中给出的路径。)

$ TEXINPUTS="$PWD:" xelatex -synctex=1 thesis
....
$ synctex view -i 3:1:/home/user/thesis/background.tex -o thesis.pdf
This is SyncTeX command line utility, version 1.2
SyncTeX result begin
Output:thesis.pdf
Page:11
x:128.365967
y:312.158264
h:108.000008
v:315.374176
W:413.999969
H:11.763868
before:
offset:0
middle:
after:
SyncTeX result end

我最喜欢的执行方法是设置latexmk为每次执行时自动设置环境变量。我已经习惯了简化 LaTeX 所需的多次传递,所以为什么不让它也能为我们解决 SyncTeX 错误 ;-P。这可以通过编辑全局 ( ) 或本地 ( ) 配置文件latexmk来完成。只需添加行~/.latexmkrc$PWD/.latexmkrc

$ENV{TEXINPUTS} = "$ENV{PWD}:";

到文件,你会发现 SyncTeX 现在实际上可以按预期工作(例如在 gedit 和 Evince 之间)。

答案3

这种繁琐的另一个问题是符号链接目录。如果我的文档位于

/home/user/long-dir-name

和一个符号链接/home/user/foo -> /home/user/long-dir-name,那么如果我的编辑器使用~/foo/doc.tex,SyncTeX 将会感到困惑,因为它使用了~/long-dir-name/doc.tex

这需要让你的编辑器像 kpathsea 那样对文件名进行处理,因为 SyncTeX 无法弄清楚你的编辑器会怎么想。在 Emacs 中,(file-truename buffer-file-name)在你的 elisp 中使用似乎效果很好,同时使用上面的环境变量技巧。

相关内容