背景

背景

编辑:自从发布问题以来,我已修复了一些错误。我认为它们不会影响下面的答案,但我想更正记录以保证完整性。

背景

我有一个 Python 脚本,可以调用它lualatex来生成大量简短的独立文档。出于偏执和努力学习良好习惯,我使用subprocess.check_call()--no-shell-escape确保我的调用lualatex不会产生任何异常。该脚本在工作时运行良好,但在家里lualatex遇到错误并返回非零返回代码。如果我--no-shell-escape从选项列表中省略,则不会发生此错误。

了解为什么会出现这种情况会很好!有 TeX.SE 的居民能解释一下吗?

平均能量损失

以下是 egreg 编写的测试代码片段在这个答案中

%From https://tex.stackexchange.com/a/96718/82389
\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\count@=\pdf@shellescape
\showthe\count@
\makeatother

\begin{document}
Ciao
\end{document}

如果我将上述内容保存为并在工作中test.tex运行,它会报告lualatex --no-shell-escape test

work $ lualatex --no-shell-escape test.tex
This is LuaTeX, Version beta-0.76.0-2013121407 (rev 4627) 
[...output trimmed...]
> 0.
l.6 \showthe\count@

但是,如果我在家里运行相同的命令,就会发生以下情况。

home $ lualatex --no-shell-escape test.tex
This is LuaTeX, Version 0.95.0 (TeX Live 2016) 
[...output trimmed...]
! Missing number, treated as zero.
<to be read again> 
\relax 
l.5 \count@=\pdf@shellescape

? 
> 0.
l.6 \showthe\count@

特别是,我收到了之前没有出现的错误。

我不确定发生了什么,并且有兴趣了解更多。

其他信息

版本号

在上班:

  • LuaTeX,版本 beta-0.76.0-2013121407(TeX Live 2013/dev/Debian)(rev 4627)
  • pdftexcmds 版本:2011/11/29 v0.20
work $ luatex --version | head -n 1
This is LuaTeX, Version beta-0.76.0-2013121407  (TeX Live 2013/dev/Debian) (rev 4627)
work $ locate pdftexcmds.sty
/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
work $ kpsewhich pdftexcmds.sty
/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
work $ grep 'Version:' < `kpsewhich pdftexcmds.sty`
%% Version: 2011/11/29 v0.20

在家里:

  • LuaTeX,版本 0.95.0 (TeX Live 2016)
  • pdftexcmds 版本:2017/03/19 v0.25。
  • 注意:在原帖中,我误以为版本在家里也是 v0.20。这是不正确的。看来我安装了多个 texlive,幸运的是 luatex 使用的是较新版本的样式文件。
home $ luatex --version | head -n 1
This is LuaTeX, Version 0.95.0 (TeX Live 2016)
home $ locate pdftexcmds.sty
/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
home $ kpsewhich pdftexcmds.sty
/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
home $ grep 'Version:' < $(kpsewhich pdftexcmds.sty)
%% Version: 2017/03/19 v0.25

定义\pdf@shellescape

在工作中(pdftexcmdsv0.20)的定义\pdf@shellescape

\ifnum\luatexversion<68 %
\else
  \def\pdf@shellescape{%
    \directlua0{%
      oberdiek.pdftexcmds.shellescape()%
    }%
  }%
\fi

在 pdftexcmds 版本 ( pdftexcmdsv0.25) 中,它被定义为

\ifnum\luatexversion<68 %
\else
  \protected\edef\pdf@shellescape{%
   \numexpr\directlua{tex.sprint(status.shell_escape)}\relax}
\fi

在撰写本文时,后者的定义也存在于 的当前版本中pdftexcmds。实现似乎在 中进行了讨论这个 GitHub 问题

杂项

如果我运行lualatex --shell-escape test.tex\count@则打印为 1。如果我运行lualatex test.tex\count@则打印为 2。在这两种情况下,我都没有收到任何 TeX 错误。这两个命令在工作和家庭中的行为相同。

答案1

显然是的……

我认为这是新版本的一个错误,而pdftexcmds旧版本中没有这个错误(无论如何,您都应该更新您的发行版:)。

pdftexcmds定义\pdf@shellescape为:

\ifnum\luatexversion<68 %
\else
  \protected\edef\pdf@shellescape{%
   \numexpr\directlua{tex.sprint(status.shell_escape)}\relax}
\fi

这将产生类似的东西\numexpr 0\relax

但是,如果在加载之后pdftexcmds,你说\show\pdf@shellescape,你会看到(使用标志运行--no-shell-escape):

> \pdf@shellescape=\protected macro:
->\numexpr \relax .

这会引起! Missing number, treated as zero.错误。

发生这种情况是因为之前的代码中pdftexcmds有:

\ifnum\luatexversion<36 %
\else
  \catcode`\0=9 %
\fi

这使得0成为被忽略的字符。使用此 catcode 机制,0返回的 会消失,并使宏无效\pdf@shellescape

的旧版本pdftexcmds没有这个问题,因为\pdf@shellescape不是用 创建的\edef,而是用 创建的\def,所以当使用宏时,\catcode0正确的:

\ifnum\luatexversion<68 %
\else
  \def\pdf@shellescape{%
    \directlua0{%
      oberdiek.pdftexcmds.shellescape()%
    }%
  }%
\fi

要修复此问题,您只需在加载\pdf@shellescape后以相同的方式重新定义,但现在不会被忽略:pdftexcmds0

\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\ifnum\luatexversion<68 %
\else
  \protected\edef\pdf@shellescape{%
   \numexpr\directlua{tex.sprint(status.shell_escape)}\relax}
\fi
\count@=\pdf@shellescape
\showthe\count@
\makeatother

\begin{document}
Ciao
\end{document}

相关内容