如何仅在传递 shell-escape(write18)时有条件地加载包

如何仅在传递 shell-escape(write18)时有条件地加载包

该包gitver需要-shell-escape从本地文件系统上的手稿的 git 存储库中获取 git 元数据。

shell-escape但是,在 VCS 存储库之外编译源代码时(例如在我的顾问的机器上) ,无需传递该标志git。适当地注释掉和注释掉此行很繁琐。也很难改变其他合作者不启用编译的(好)习惯-shell-escape。但是,gitver如果没有检测到 shell-escape,则会大声抱怨并出现错误/停止。

因此,我是否可以改变我的序言,使得通用源代码行(不仅适用于加载gitver包,而且相同的参数适用于minted其他通用 latex 命令)仅在使用 shell-escape 编译时执行?

最小概念示例:

\documentclass{article}

%%% Somehow detect shell-escape here
  \usepackage{gitver} % <-- load only if compiled with shell-escape 
%%% end of test

\begin{document}
Hello world!
\end{document}

答案1

expl3 有一个测试:

\documentclass{article}
\usepackage{expl3}
\csname sys_if_shell_unrestricted:T\endcsname{\usepackage{gitver}} 
\begin{document}
Hello world!
\end{document}

答案2

您可以使用pdftexcmds并定义三分支测试:

\usepackage{pdftexcmds}

\makeatletter
\newcommand{\ShellEscapeURN}[3]{%
  \ifcase\pdf@shellescape
    \expandafter\@firstofthree  % 0 = no shell escape
  \or
    \expandafter\@secondofthree % 1 = unrestricted
  \or
    \expandafter\@thirdofthree  % 2 = restricted
  \else
    \expandafter\@firstofthree
  \fi
  {#3}{#1}{#2}%
}
\providecommand{\@firstofthree}[3]{#1}
\providecommand{\@secondofthree}[3]{#2}
\providecommand{\@thirdofthree}[3]{#3}
\makeatother

这三个参数分别是“无限制 shell 逃逸代码”、“受限 shell 逃逸代码”和“无 shell 逃逸代码”。

就你的情况来说,

\ShellEscapeURN{\usepackage{gitver}}{}{}

使用起来可能更方便,expl3这样就不会暴露表示 shell 转义状态的整数变量的实际值。

\usepackage{expl3}

\ExplSyntaxOn
\cs_new:Npn \ShellEscapeURN #1 #2 #3
 {
  \sys_if_shell_unrestricted:TF
   { #1 } % unrestricted shell
   {
    \sys_if_shell_restricted:TF
     { #2 }
     { #3 }
   }
 }
\ExplSyntaxOff

相关内容