我想从 latex 编辑器中的源获取 pdf 位置,然后在编译 latex pdf 时生成 synctex 文件,然后使用从 rust 调用的 synctex 源来查询 pdf 位置信息,如下所示:
pub fn get_pdf_pos(params: &GetPdfPosParams) -> Vec<PdfPosResp> {
let proj_dir = get_proj_base_dir(¶ms.project_id);
let pdf_file_name = format!("{}{}",get_filename_without_ext(¶ms.main_file),".pdf");
let file_path = join_paths(&[
&proj_dir,
&pdf_file_name.to_string(),
]);
unsafe {
let c_file_path = CString::new(file_path.clone());
if let Err(e) = c_file_path {
error!("parse out path error,{},{}", e, file_path.clone());
return Vec::new();
}
let c_build_path = CString::new(proj_dir.clone());
if let Err(e) = c_build_path {
error!("parse build path error,{},{}", e, proj_dir.clone());
return Vec::new();
}
let scanner = synctex_scanner_new_with_output_file(
c_file_path.unwrap().as_ptr(),
c_build_path.unwrap().as_ptr(),
1,
);
let tex_file_path = join_paths(&[proj_dir, params.path.clone(), params.file.clone()]);
let demo_tex = CString::new(tex_file_path.clone());
let mut position_list: Vec<PdfPosResp> = Vec::new();
let node_number = synctex_display_query(
scanner,
demo_tex.unwrap().as_ptr(),
params.line as c_int,
params.column as c_int,
0,
);
if node_number > 0 {
for _i in 0..node_number {
let node: synctex_node_p = synctex_scanner_next_result(scanner);
let page = synctex_node_page(node);
let h = synctex_node_visible_h(node);
let v = synctex_node_visible_v(node);
let height = synctex_node_visible_height(node);
let width = synctex_node_visible_width(node);
let single_pos = PdfPosResp::from((page, h, v, height, width));
position_list.push(single_pos);
}
}
return position_list;
}
}
这个函数运行正常,但只有一个问题,无论如何更改参数,h 和 v 总是返回 0。我尝试阅读 synctex 源代码,但仍然没有弄清楚为什么会发生这种情况。我应该怎么做才能解决这个问题?