原始答案 2012

原始答案 2012

我知道\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使用)\shellescapexetex使用 LuaTeX 的 Lua 函数模拟寄存器。

该整数的值为

0,如果 shell 转义被禁用(类似调用pdflatex -no-shell-escape

1,如果 shell 转义不受限制(类似这样的调用pdflatex -shell-escape

2、如果 shell 逃逸受到限制(简单调用pdflatex

(以上内容shell_escapetexmf.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

但不幸的是,这不能用 和 来实现xelatexlualatex对于后者,一些 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%

相关内容