使用Rust调用XeLaTeX指定输出目录失效,如何解决?
解决Rust调用XeLaTeX时输出目录不生效的问题
问题原因
你的Rust代码中将-output-directory=/path/to/output作为单个参数传递,虽然终端直接执行时可行,但部分命令行工具通过程序调用时,对带等号的参数解析可能存在差异;此外,Rust程序默认工作目录可能与终端不同,会导致XeLaTeX无法读取依赖文件或正常写入输出内容。
解决方案
1. 拆分参数传递
将-output-directory选项和目标路径拆分为两个独立参数传递,这是更稳定的命令行参数传递方式:
use std::process::Command; fn main() { let output = Command::new("xelatex") .arg("/Users/John/source/dolphin/XiaoqiangResume/JiangxiaoqiangResume-en.tex") .arg("-output-directory") .arg("/Users/John/source/reddwarf/backend/cv-render/output/") .output() .expect("failed to execute process"); // 打印编译日志排查问题 println!("编译输出:{}", String::from_utf8_lossy(&output.stdout)); println!("错误信息:{}", String::from_utf8_lossy(&output.stderr)); }
2. 指定工作目录(可选)
如果你的TeX文件依赖当前目录下的资源(如.cls样式文件、本地图片等),Rust程序默认工作目录与终端不一致会导致编译失败。此时可以切换到TeX文件所在目录执行命令:
use std::process::Command; use std::path::Path; fn main() { let tex_file_path = Path::new("/Users/John/source/dolphin/XiaoqiangResume/JiangxiaoqiangResume-en.tex"); let output_dir = "/Users/John/source/reddwarf/backend/cv-render/output/"; let output = Command::new("xelatex") // 切换到TeX文件所在目录 .current_dir(tex_file_path.parent().expect("无法获取TeX文件所在目录")) // 仅传递TeX文件名,而非绝对路径 .arg(tex_file_path.file_name().expect("无法获取TeX文件名")) .arg("-output-directory") .arg(output_dir) .output() .expect("failed to execute process"); println!("编译输出:{}", String::from_utf8_lossy(&output.stdout)); println!("错误信息:{}", String::from_utf8_lossy(&output.stderr)); }
3. 排查编译日志
通过打印stdout和stderr可以获取XeLaTeX的详细编译信息,比如是否存在依赖文件缺失、输出目录权限不足等问题,这些都是导致无法生成输出文件的常见原因。
内容的提问来源于stack exchange,提问作者spark
相关产品推荐
相关产品推荐

