有没有办法从包内部检测是否使用了 MiKTeX?

有没有办法从包内部检测是否使用了 MiKTeX?

有没有办法检测是否使用了 MiKTeX TeX LaTeX 可执行文件?类似\ifmiktex甚至\IfFileExists{<some file only present in MiKTeX>}{}{}

原因是,在我的某个软件包中,我必须在另一个 .tex 文件上重新执行 LaTeX,这当然需要用户启用 shell escape 又名 write18 功能。但是,我想以递归方式支持此功能,即另一个 .tex 文件本身可以调用自己的 LaTeX 子进程。为了使其工作,我必须将正确的命令行选项添加到 ( pdf)latex可执行文件的内部调用中。现在此选项-shell-escape适用于 TeXLive,但--enable-write18适用于 MiKTeX。

以下是我计划如何实现此功能的一些示例代码。缺少的部分是 的定义\ifmiktex

\ifpdf
   \def\latexcmd{pdflatex }%
\else
   \def\latexcmd{latex }%  
\fi

\ifmiktex
   \immediate\write18{\latexcmd --enable-write18 \options \file}%
\else
   \immediate\write18{\latexcmd -shell-escape \options \file}%
\fi

答案1

MiKTeX 支持可选参数--enable-write18以及--shell-escape

MiKTeX 的可能测试

\documentclass{article}

\newif\ifMiKTeX
\makeatletter
\def\testMiKTeX{\expandafter\testMiKTeX@i\pdftexbanner\@nil}
\def\testMiKTeX@i#1(#2)#3\@nil{\testMiKTeX@ii#2..\@nil}
\def\testMiKTeX@ii#1.#2.#3\@nil{\ifx\relax#2\relax\else\MiKTeXtrue\fi}
\makeatother
\testMiKTeX

\begin{document}

\ifMiKTeX we use MiK\TeX \else we use \TeX Live\fi

\end{document}

答案2

这里是一个通用的概念验证解决方案,它提供\ifmiktex\iftexlive切换。它基于 Herberts 的建议,使用 的输出\pdftexbanner。完成后,它可以发布为ifdist包或类似内容。

请注意,\pdftexbanner扩展为带有 catcode“other”的文本,因此\@onlevel@sanitze也用于为宏参数文本提供相同的 catcode。


更新2012/05/05:

重新编写并测试了 Tex Live Linux、TeX Live Windows 和 MiKTeX 的代码。提供了对不支持的 XeLaTeX 的警告。我将其放在包中。Will Robertson 可能会将其集成到 中ifplatform

\ProvidesPackage{ifdistro}[2012/05/05 v1.0 Provides if-switches for MiKTeX and TeX Live]

\newif\ifmiktex
\newif\iftexlive

\begingroup
\makeatletter
\def\MiKTeX{MiKTeX}
\@onelevel@sanitize\MiKTeX
\def\TeXLive{TeX Live}
\@onelevel@sanitize\TeXLive
\def\WebIIC{Web2C}
\@onelevel@sanitize\WebIIC

% Test if \pdftexbanner exists, which is the case for latex, pdflatex and lualatex
% but not xelatex.
\expandafter\ifx\csname pdftexbanner\endcsname\relax
    \PackageWarning{ifdistro}
        {Primitive \string\pdftexbanner\space not found!\MessageBreak
         Switches \expandafter\string\csname ifmiktex\endcsname\space 
         and \expandafter\string\csname iftexlive\endcsname\space 
         will not be set\@gobble}% gobbles the "on line X" part
\else

% Scans for 'MiKTeX' string with catcode 12 (other)
\expandafter\def\expandafter\testmiktex\expandafter#\expandafter1\MiKTeX#2\relax{%
        \ifx\empty#2\empty
             \global\miktexfalse
        \else
             \global\miktextrue
        \fi
}
\expandafter\expandafter
\expandafter\testmiktex\expandafter\pdftexbanner\MiKTeX\relax\relax
\ifmiktex\else
% Scans for 'TeX Live' string with catcode 12 (other)
\expandafter\def\expandafter\testtexlive\expandafter#\expandafter1\TeXLive#2\relax{%
        \ifx\empty#2\empty
             \global\texlivefalse
        \else
             \global\texlivetrue
        \fi
}
\expandafter\expandafter
\expandafter\testtexlive\expandafter\pdftexbanner\TeXLive\relax\relax
\iftexlive\else
% Scans for 'Web2C' string with catcode 12 (other)
% This string is used by TeX Live under MS Windows
\expandafter\def\expandafter\testtexlive\expandafter#\expandafter1\WebIIC#2\relax{%
        \ifx\empty#2\empty
             \global\texlivefalse
        \else
             \global\texlivetrue
        \fi
}
\expandafter\expandafter
\expandafter\testtexlive\expandafter\pdftexbanner\TeXLive\relax\relax
\fi\fi

\fi

\endgroup

答案3

一个好方法是测试某个应用程序是否存在。例如,如果 Yap(MiKTeX 的 dvi 查看器)存在,您就知道您正在使用 MiKTeX。这种方法的优点是可以与任何其他引擎配合使用,但缺点是必须启用 write18。

相关内容