Почему xelatex не хочет вызываться popen3 в форме vararg? - PullRequest
2 голосов
/ 17 апреля 2019

Возьмите этот минимальный документ 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?

1 Ответ

2 голосов
/ 19 апреля 2019
Open3.popen3(
  'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)

отлично работает.

В сообщении об ошибке сообщается, что файл "minimal.tex" не существует.

С формой varargs в popen3 массив commands передается в Process#spawn, где xelatex вызывается с arg1=-interaction=nonstopmode и arg2=minimal.tex. Аргументы не передаются в оболочку. Примечание: таким образом, вы также можете вызывать другие процессы со «сложными» аргументами, например, Open3.popen3('mkdir', 'directory with spaces and $SHELL').

Ad Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"'): здесь вся строка считается командой, отправляемой в стандартную оболочку, и эта оболочка заботится о двойных кавычках.

Ad Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"'): здесь я могу только догадываться, что lualatex игнорирует двойные кавычки.

См. Также: https://ruby -doc.org / core-2.2.0 / Process.html # method-c-exec

...