以这个最小的LaTeX文档为例:
% minimal.tex
\documentclass{article}
\begin{document}
Hello World!
\end{document}这个Ruby (2.5.1)脚本:
require 'open3'
Open3.popen3(
'xelatex', '-interaction=nonstopmode', '"minimal.tex"'
) do |_stdin, stdout, stderr, wait_thr|
log = stdout.readlines + stderr.readlines
exit_status = wait_thr.value
puts exit_status
puts log.join('').strip!
end运行脚本,我们得到:
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex)
...
! I can't find file `'"minimal.tex"''.这太令人惊讶了。不仅因为文件在那里,而且因为两者
Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"') do ...和Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"') do ...干得很好!
xelatex和popen3的结合有什么特别之处?
发布于 2019-04-19 09:46:05
Open3.popen3(
'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)效果很好。
错误消息告诉您,文件"minimal.tex"不存在。
使用popen3的varargs形式,commands数组被传递给Process#spawn,在那里用arg1=-interaction=nonstopmode和arg2=minimal.tex调用xelatex。参数不会传递给shell。请注意,这样您也可以用“复杂”args调用其他进程,例如Open3.popen3('mkdir', 'directory with spaces and $SHELL')。
Ad Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"'):在这里,整个字符串被认为是发送到标准shell的命令,这个shell负责双引号。
广告Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"'):在这里我只能猜测lualatex忽略双引号。
另见:https://ruby-doc.org/core-2.2.0/Process.html#method-c-exec
https://stackoverflow.com/questions/55735773
复制相似问题