![背景](https://linux22.com/image/239675/%E8%83%8C%E6%99%AF.png)
我为 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.tex
是kpsewhich
$ 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 中使用似乎效果很好,同时使用上面的环境变量技巧。