有没有办法检测是否使用了 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。