TeX Live 2016: minted не работает с LuaLaTeX (ошибка исправлена ​​в июне 2016 г.)

TeX Live 2016: minted не работает с LuaLaTeX (ошибка исправлена ​​в июне 2016 г.)

Я установил TeX Live 2016 в том виде, в котором он вышел сегодня (спасибо разработчикам за это).

Теперь у меня есть следующий MWE:

\documentclass{article}
\usepackage{minted}
\begin{document}

\begin{minted}{ruby}
class Foo
  def init
    pi = Math::PI
    @var = "Pi is approx. #{pi}"
  end
end
\end{minted}

\end{document}

При запуске pdflatex --shell-escape test.texон проходит через файл и выдает PDF, как и ожидалось. Делать то же самое с lualatex --shell-escape test.texне удается с

This is LuaTeX, Version 0.95.0 (TeX Live 2016) 
 system commands enabled.
(./test.tex
LaTeX2e <2016/03/31>
Babel <3.9r> and hyphenation patterns for 1 language(s) loaded.
(/opt/texlive/2016/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/opt/texlive/2016/texmf-dist/tex/latex/base/size10.clo))
(/opt/texlive/2016/texmf-dist/tex/latex/minted/minted.sty
(/opt/texlive/2016/texmf-dist/tex/latex/graphics/keyval.sty)
(/opt/texlive/2016/texmf-dist/tex/latex/oberdiek/kvoptions.sty
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/ltxcmds.sty)
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/infwarerr.sty)
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/etexcmds.sty
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/ifluatex.sty))))
(/opt/texlive/2016/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix 
<2008/02/07> (tvz)) (/opt/texlive/2016/texmf-dist/tex/latex/float/float.sty)
(/opt/texlive/2016/texmf-dist/tex/latex/base/ifthen.sty)
(/opt/texlive/2016/texmf-dist/tex/latex/tools/calc.sty)
(/opt/texlive/2016/texmf-dist/tex/latex/ifplatform/ifplatform.sty
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/ifpdf.sty)
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/luatex-loader.sty
(/opt/texlive/2016/texmf-dist/scripts/oberdiek/oberdiek.luatex.lua)))
(/opt/texlive/2016/texmf-dist/tex/generic/oberdiek/catchfile.sty)
uname -s > "test.w18"

! Package catchfile Error: File `test.w18' not found.

See the catchfile package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.93     \CatchFileDef\@tempa{\ip@file}{}

? 

Как уже упоминалось, это свежеустановленный TeX Live 2016; я также проверил установленную версию Pygmentize, которая является 2.1.3 (установлена ​​через pip). Тестирование с TeX Live 2015, однако, вышеприведенный код работает без проблем как с pdflatex, так и с lualatex.

Есть ли у кого-нибудь подсказка, как это исправить, или это ошибка в lualatex или minted (или каком-то другом пакете), о которой следует сообщить?

Обновлять:Начиная с mintedверсии 2.2 (08.06.2016) пакет загружается shellescавтоматически, как отметили @David Carlisle и @egreg в комментариях; поэтому проблема больше не должна возникать, если у вас установлена ​​эта версия.

решение1

Несколько пакетов, использующих , \write18необходимо будет обновить для совместимости с LuaLaTeX в LuaTeX 0.90; mintedсреди них.

Однако shellescпакет предоставляет необходимое решение:

\documentclass{article}
\usepackage{shellesc}
\usepackage{minted}

\begin{document}

\begin{minted}{ruby}
class Foo
  def init
    pi = Math::PI
    @var = "Pi is approx. #{pi}"
  end
end
\end{minted}

\end{document}

(спасибо ArTourter за то, что заметил это).

Вот набор исправлений, которые заменяют все появления на \immediate\write18, что \ShellEscявляется более безопасным способом, не прибегая к переопределениям \write.

Эти патчи вообще не нуждаются в LuaLaTeX, поэтому код работает со всеми движками.

\documentclass{article}
\usepackage{shellesc,xpatch}
\usepackage{minted}

\makeatletter
\xpatchcmd{\DeleteFile}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\DeleteFile}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\ProvideDirectory}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\TestAppExists}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\TestAppExists}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@checkstyle}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@checkstyle}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@checkstyle}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@checkstyle}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@pygmentize}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@pygmentize}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@pygmentize}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@pygmentize}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd{\minted@pygmentize}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\makeatother

\begin{document}

\begin{minted}{ruby}
class Foo
  def init
    pi = Math::PI
    @var = "Pi is approx. #{pi}"
  end
end
\end{minted}

\end{document}

введите описание изображения здесь

Примечание: я не могу проверить исправления в Windows, поэтому в этом случае они могут быть неполными.

Более короткий код доступен, если использовать regexpatch:

\documentclass{article}
\usepackage{shellesc,regexpatch}
\usepackage{minted}

\makeatletter
\xpatchcmd*{\DeleteFile}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd*{\ProvideDirectory}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd*{\TestAppExists}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd*{\minted@checkstyle}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\xpatchcmd*{\minted@pygmentize}
  {\immediate\write18}
  {\ShellEscape}
  {}{}
\makeatother

\begin{document}

\begin{minted}{ruby}
class Foo
  def init
    pi = Math::PI
    @var = "Pi is approx. #{pi}"
  end
end
\end{minted}

\end{document}

Связанный контент