我知道还有另一个标题几乎相同的帖子“如何使用 Okular 和 Kile 设置反向搜索”,但它不能解决我的问题(至少我是这样认为的)。
我使用的是 Kile(在 Ubuntu 10.4 上,带有 gnome),默认设置中 Okular 被定义为两个选项(viewDVI 和 forwardDVI)的查看器。我已将 LaTeX 表单默认更改为现代,并且正向搜索有效,反向搜索无效。
参照以下说明http://www.latex-community.org/forum/:
前往:设置 -> 配置 Kile -> 工具 -> 构建并选择 ViewDVI
在常规选项卡上填写以下值:
命令:
xdvi
选项:
-editor 'kile %f --line %l' '%target'
这样,反向搜索就可以与 xdvi 配合使用,但正向搜索仍会打开 okular。当我尝试使用相同的方法将 xdvi 设置为 forwardDVI 的查看器时,编译结果如下:
[forwardDVI] 已完成,退出代码为 1
我正在寻找它的含义,我发现这是一个捕获一般错误,这对我没什么帮助……
提到的线程:我已经执行了第一步和第二步,我没有使用脚本,因为我不确定我是否知道如何去做,并且在任何情况下,使用 Okular 进行正向搜索时我都不会遇到问题,但在进行反向搜索时会遇到问题。
提前感谢任何提示
附言
我试图查看 Okular 帮助,但无法连接到它。当我按 F1 访问Okular 手册,出现该消息 Could not Launch the KDE Help Center: Could not find the service khelpcenter
。当我尝试查看凯尔手册。这可能与反向搜索问题有关吗?这可能是因为我在 Gnome 上使用 Kile 而发生的吗?
谢谢
答案1
嗯,你实际上描述了两个问题:
1) 使用 okular 和 kile 进行正向和反向搜索。正如您所描述的,正向搜索有效,反向搜索对您不起作用。不幸的是,您没有描述什么不起作用。特别是,在 xdvi 中,反向搜索由 触发Ctrl+Click
,而在 Okular 中,反向搜索由 Shift+Click 触发!除此之外,在 Ubuntu maverick 上,Okular 和 Kile 中的正向和反向搜索已经完全设置好了。
2)xdvi
用于正向搜索(反向搜索也适用于你)虽然 Kile 有一个“ForwardDVI”构建类,但它并不直接适合 xdvi,因为它将变量设置%target
为类似
'file:/home/reinhold/remove-dash.dvi#src:64 ./remove-dash.tex'
这正是 okular 所需的确切形式。但是,xdvi 不知道如何处理此目标,因此失败。xdvi
需要改为调用
xdvi -sourceposition "linenumber filename.tex" filename.dvi
不幸的是,kile 没有为命令提供任何格式字符串来指示行号。唯一的解决方案是告诉 kile 不要直接调用 xdvi,而是通过一个辅助脚本来调用 xdvi,该脚本采用上面提到的“dvifile#src:line texfile”字符串,提取行号,然后使用这些提取的值调用 xdvi。一个这样的脚本是 kile2xdvi,可以在以下位置找到http://ubuntuforums.org/archive/index.php/t-1134500.html
这是该脚本的副本。只需将其保存~/bin/kile2xdvi
并将该文件设置为可执行文件即可。然后您可以配置 kile 以使用它在 xdvi 中进行正向搜索:
- 菜单项“设置-配置Kile...”,列表中的“工具-构建”条目。
- 选择“ForwardDVI”,创建一个名为 xdvi 的新配置(对话框顶部附近的“新建...”按钮)
- 将命令设置为
~/bin/kile2xdvi
并将选项设置为'%target'
- 确保目标扩展名设置为
dvi
- 按“确定”。
就是这样,正向 dvi 搜索现在将使用 xdvi 并跳转到正确的输出。
如果仍然出现错误,请查看“输出”选项卡(右下角,“日志和消息”旁边),因为您将在那里获得更详细的错误消息。
脚本如下kile2xdvi
:
#!/usr/bin/perl
# kile2xdvi. (c) Juerg Wullschleger, 2009
if($ARGV[0] =~ m/file:(\S*)#src:(\S*) (\S*)/){
$dviFile = $1;
$line = $2;
$sourceFile = $3;
$sourcePos = '-sourceposition "'.$line.' '.$sourceFile.'"';
}else{
if((!$ARGV[0]) || ($ARGV[0] == "--help") || ($ARGV[0] == "-h")){
print 'usage: kile2xdvi <dvifile> or kile2xdvi "file:<dvifile>#src:<line> <sourcefile>"'."\n";
exit;
}
$dviFile = $ARGV[0];
$sourcePos = '';
}
if (!(-e $dviFile)){
print "$dviFile: No such file.\n";
exit;
}
open(DVITYPE, "dvitype $dviFile|");
$firstline = <DVITYPE>;
$minH = 300*15; $maxH = -300*3;
$minV = 300*20; $maxV = -300*3;
$dpi = 0;
#find min/max of all "hh" and "vv" in $dviFile
while (<DVITYPE>) {
if(m/h:=(\S*)=(\S*), hh:=(\S*)/){
if($3 < $minH){ $minH = $3; }
if($3 > $maxH){ $maxH = $3; }
}elsif(m/v:=(\S*)=(\S*), vv:=(\S*)/){
if($3 < $minV){ $minV = $3; }
if($3 > $maxV){ $maxV = $3; }
}elsif(m/Resolution = (\S*) pixels per inch/){
$dpi = $1;
}
}
$offsetx = -int(100*$minH/$dpi - 10)/100; $paperx = int(100*($maxH - $minH)/$dpi + 20)/100;
$offsety = -int(100*$minV/$dpi - 10)/100; $papery = int(100*($maxV - $minV)/$dpi + 20)/100;
$bb = "-xoffset ".$offsetx."in -yoffset ".$offsety."in -paper +".$paperx."x".$papery."in";
$options = '-watchfile 0.5 -postscript 1 -expertmode 0 -mousemode 0 -s 6 -editor "kile --line %l %f" -nofork';
print "Executing: xdvi $options $bb $sourcePos $dviFile\n";
`xdvi $options $bb $sourcePos $dviFile\n`;
open
您或许可以删除所有的分辨率和偏移处理(和之间的所有行$bb=...
,因此该脚本实际上比它需要的更复杂。