首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么xelatex不希望由popen3以vararg形式调用?

为什么xelatex不希望由popen3以vararg形式调用?
EN

Stack Overflow用户
提问于 2019-04-17 20:50:01
回答 1查看 59关注 0票数 2

以这个最小的LaTeX文档为例:

代码语言:javascript
复制
% minimal.tex
\documentclass{article}

\begin{document}
    Hello World!
\end{document}

这个Ruby (2.5.1)脚本:

代码语言:javascript
复制
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

运行脚本,我们得到:

代码语言:javascript
复制
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 ...

干得很好!

xelatexpopen3的结合有什么特别之处?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 09:46:05

代码语言:javascript
复制
Open3.popen3(
  'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)

效果很好。

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

使用popen3的varargs形式,commands数组被传递给Process#spawn,在那里用arg1=-interaction=nonstopmodearg2=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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55735773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档