我有一个更大的文档用作scrbook
基础。由于文档很长,我依靠 SyncTeX 进行直接和反向搜索。但是,文档中有很多部分我无法跳转到。
我编写了该命令的微型版本synctex
,发现问题在于synctex
库似乎找不到某些标签的文件名:
./sy main.pdf 3 144 72
[tag:1] /Users/paag/Documents/Projects/NetIDE/netide/Documents/Work-packages/WP2/Deliverables/D2.1/./main.tex line 193
./sy main.pdf 17 144 72
[tag:74] (null) line 1
./sy main.pdf 18 144 72
[tag:74] (null) line 1
./sy main.pdf 19 144 72
[tag:74] (null) line 202
当文件名不为空时,我可以使用 MacOSX 上的 Skim 和 Linux 上的 Evince 从 PDF 跳转到源文件。但是,当文件名为空时,则不能。
如上所述,测试程序不能更愚蠢了:-)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "synctex_parser.h"
#define SYNCTEX_SCANNER_PARSE 1 // set to 0 to call synctex_scanner_parse() explicitly
int main(int argc, char **argv)
{
synctex_scanner_t scanner;
char cwd_buffer[1024],*cwd, *pdf_file;
int page,xoffs,yoffs;
if (argc == 5) {
pdf_file = argv[1];
page = atoi(argv[2]);
xoffs = atoi(argv[3]);
yoffs = atoi(argv[4]);
} else {
printf("usage %s <pdf_file> <page> <xoffs> <yoffs>\n\n",argv[0]);
return -1;
}
/* TODO: extract base directory from pdf file name */
cwd = getcwd(cwd_buffer,1023);
scanner = synctex_scanner_new_with_output_file(pdf_file, cwd, SYNCTEX_SCANNER_PARSE);
if (scanner != NULL) {
if (synctex_edit_query(scanner,page,xoffs,yoffs)> 0) {
synctex_node_t node;
while((node = synctex_next_result(scanner))!=NULL) {
int tag = synctex_node_tag(node);
int line = synctex_node_line(node);
const char *fname = synctex_scanner_get_name(scanner, tag);
printf ("[tag:%d] %s line %d\n", tag, fname, line);
}
} else {
printf("synctex_edit_query failed!\n");
}
} else {
printf("new synctex scanner not created!\n");
}
synctex_scanner_free(scanner);
}