2

拿这个最小的 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

4

1 回答 1

2
Open3.popen3(
  'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)

工作正常。

错误消息告诉您,该文件"minimal.tex"不存在。

使用 popen3 的 varargs 形式,commands数组被传递到使用and调用的Process#spawn地方。参数不会传递给 shell。旁注,这样您还可以使用“复杂”参数调用其他进程,例如.xelatexarg1=-interaction=nonstopmodearg2=minimal.texOpen3.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

于 2019-04-19T09:46:05.123 回答