我知道\ifeof18
并\pdfshellescape
检测是否\write18
已启用,但两者都只告诉我是否已启用。我需要使用一个不在受限制命令列表中的程序\write18
,因此想检查它是否受限制。你如何正确地做到这一点?
答案1
您可以使用适当的功能来查询引擎expl3
。这适用于跨引擎。
\documentclass{article}
\ExplSyntaxOn
\iow_term:e
{
***************^^J *~
\int_case:nn { \c_sys_shell_escape_int }
{
{0}{No~shell~escape}
{1}{Unrestricted~shell~escape}
{2}{Restricted~shell~escape}
}
^^J***************
}
\sys_if_shell_restricted:T
{
\sys_get_shell:nnN
{ kpsewhich~--var-value=shell_escape_commands }
{ \cctab_select:N \c_document_cctab }
\l_tmpa_tl
\iow_term:e
{
***************^^J
*~Restricted~shell-escape~is~available;~the~allowed~programs~are^^J
*~\l_tmpa_tl ^^J
***************
}
}
\ExplSyntaxOff
\stop
输出pdflatex
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex)
[...]
***************
* Restricted shell escape
***************
(|kpsewhich --var-value=shell_escape_commands)
***************
* Restricted shell-escape is available; the allowed programs are
* bibtex,bibtex8,extractbb,gregorio,kpsewhich,makeindex,memoize-extract.pl,memo
ize-extract.py,repstopdf,r-mpost,texosquery-jre8,
***************
输出lualatex -no-shell-escape
This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)
[...]
***************
* No shell escape
***************
输出uplatex -shell-escape
This is e-upTeX, Version 3.141592653-p4.1.0-u1.29-230214-2.6 (utf8.uptex) (TeX Live 2023) (preloaded format=uplatex)
[...]
***************
* Unrestricted shell escape
***************
原始答案 2012
测试 shell 逃逸的最佳方法是使用以下pdftexcmds
包:
\usepackage{pdftexcmds}
\makeatletter
\ifcase\pdf@shellescape
\message{No shell escape}\or
\message{Unrestricted shell escape}\or
\message{Restricted shell escape}\fi
\makeatother
当然,您可以输入任何代码。请注意,在较旧的 TeX 发行版中使用 LuaTeX(版本号低于 0.68)时,这可能会产生错误的结果。
该包使用整数\pdfshellescape
(如果pdftex
使用)\shellescape
和xetex
使用 LuaTeX 的 Lua 函数模拟寄存器。
该整数的值为
0,如果 shell 转义被禁用(类似调用
pdflatex -no-shell-escape
)1,如果 shell 转义不受限制(类似这样的调用
pdflatex -shell-escape
)2、如果 shell 逃逸受到限制(简单调用
pdflatex
)
(以上内容shell_escape
在texmf.cnf
变量的正常设置下成立p
)。
你可以使用pdflatex
以下命令列出受限 shell 转义中允许的程序
\ifnum\pdf@shellescape=\tw@
\begingroup
\everyeof{\noexpand}
\typeout{%
***************^^J%
* Restricted shell-escape is available; the allowed programs are^^J%
* \@@input|"kpsewhich --var-value shell_escape_commands" ^^J%
***************}
\endgroup
但不幸的是,这不能用 和 来实现xelatex
(lualatex
对于后者,一些 Lua 函数可能会有所帮助)。输出是
***************
* Restricted shell-escape is available; the allowed programs are
* bibtex,bibtex8,kpsewhich,makeindex,mpost,repstopdf,
***************
答案2
我正在这样做:
\ifnum\ShellEscapeStatus=1%
% -shell-escape is ON
\else%
\message{Oops, it's OFF :( ^^J}%
\fi%