编辑:自从发布问题以来,我已修复了一些错误。我认为它们不会影响下面的答案,但我想更正记录以保证完整性。
背景
我有一个 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
在工作中(pdftexcmds
v0.20)的定义\pdf@shellescape
是
\ifnum\luatexversion<68 %
\else
\def\pdf@shellescape{%
\directlua0{%
oberdiek.pdftexcmds.shellescape()%
}%
}%
\fi
在 pdftexcmds 版本 ( pdftexcmds
v0.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
,所以当使用宏时,\catcode
是0
正确的:
\ifnum\luatexversion<68 %
\else
\def\pdf@shellescape{%
\directlua0{%
oberdiek.pdftexcmds.shellescape()%
}%
}%
\fi
要修复此问题,您只需在加载\pdf@shellescape
后以相同的方式重新定义,但现在不会被忽略:pdftexcmds
0
\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}