检测正在使用的 LaTeX 格式版本

检测正在使用的 LaTeX 格式版本

ltxcmds提供\ltx@ifpackagelater,,\ltx@ifclasslater并且\ltx@iffilelater\@ifpackagelater- 但是否有任何“如果 TeX 稍后”或其他方式(自动)获取使用的 TeX 版本(当然,除了查看日志文件等)?在 Joseph Wright 的评论之后,我现在知道我想知道 LaTeX 格式(而不是 TeX)版本。(他已经给出了这个问题的答案)。很酷:在 tex.stackexchanges 上,答案提供给甚至不知道他们的问题的人!

答案1

自 2020-10-01 版本起,LaTeX 内核提供了在 LaTeX 版本为或更新时\IfFormatAtLeastTF{<date>}{<true code>}{<false code>}执行的命令,否则执行该命令。示例:<true code><date><false code>

\documentclass{article}

\IfFormatAtLeastTF{2021/06/01}{%
  \newcommand\VersionInfo{This document was compiled using \LaTeX\ version 2021-06-01 or newer.}%
}{%
  \newcommand\VersionInfo{This document was compiled using a \LaTeX\ version older than 2021-06-01.}%
}

\begin{document}

\VersionInfo

\end{document}

此外,\IfClassAtLeastTF{<class name>}{<date>}{<true code>}{<false code>}\IfPackageAtLeastTF{<package name>}{<date>}{<true code>}{<false code>}为类和包测试提供了类似的命令。

请注意,这三个命令在 2020-10-01 之前的 LaTeX 版本中不存在。在编写可能使用旧 LaTeX 版本编译的代码时,您必须记住这一点。在这种情况下,您可以例如添加

\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}

如果需要的话就进行定义\IfFormatAtLeastTF,或者测试是否存在\IfFormatAtLeastTF(例如通过\ifcsname\@ifundefined),然后根据是否\IfFormatAtLeastTF存在来执行代码。

答案2

pdfTeX 的最新版本,以及我认为所有版本的 XeTeX 和 LuaTeX,都为引擎提供了“版本”数据。例如

\documentclass{article}
\usepackage{ifluatex,ifxetex}
\makeatletter
\def\engineversion@#1#2.{%
  \ifnum#2>9\relax
    #1.#2.%
  \else
    0.#1#2.%  
  \fi
}
\def\engineversion@@#1#2#3{#1.#2#3}
\edef\engineversion{%
  \ifxetex
    XeTeX:\the\XeTeXversion\XeTeXrevision
  \else
    \ifluatex
      LuaTeX:\expandafter\engineversion@\the\luatexversion.\luatexrevision
    \else
      pdfTeX:\expandafter\engineversion@@\the\pdftexversion.\pdftexrevision
    \fi
  \fi
}
\makeatother
\show\engineversion

会以“友好”的方式显示。这提醒你,告知正在使用的引擎版本也意味着担心哪个引擎正在使用中。如果没有更多上下文,很难确定需要什么效果。一种可能的方法是

\def\@ifpdftexlater#1{%
  \ifxetex
    \expandafter\@secondoftwo
  \else
    \ifluatex
      \expandafter\expandafter\expandafter\@secondoftwo
    \else
      \ifnum#1>\pdftexversion
        \expandafter\expandafter\expandafter\expandafter
          \expandafter\expandafter\expandafter\@secondoftwo
      \else
        \expandafter\expandafter\expandafter\expandafter
          \expandafter\expandafter\expandafter\@firstoftwo
      \fi
    \fi
  \fi
}
% Use cases
\@ifpdftexlater{150}{\TRUE}{\FALSE} % TRUE on my system
\@ifpdftexlater{150}{\TRUE}{\FALSE} % FALSE on my system

它测试主要的 pdfTeX 版本,对于任何大于或等于给定参数的主要版本,结果为 TRUE,对于较旧的版本或开始使用错误的引擎,结果为 FALSE。(这需要ifluatexifxetex包。)小修订版的测试稍微复杂一些,但适用相同的方法。

如果您确实想要 TeX 版本,那么横幅或类似的东西是唯一的选择。Knuth 没有提供宏\texversion,虽然可以区分 TeX2 和 TeX3,但这没什么用(因为 TeX3 是在 1982 年发布的!)。

答案3

(第二个答案,因为问题似乎并不是真正关于 TeX 版本。)

LaTeX 格式的版本存储在宏中\fmtversion。LaTeX 没有提供直接的接口来对此进行日期测试,但将其组合起来并不太难:

\newcommand*\@iflatexlater{\@ifl@t@r\fmtversion}

这是用来

\@iflatexlater{2001/09/01}{\TRUE}{\FALSE} % TRUE, I hope!
\@iflatexlater{2011/09/01}{\TRUE}{\FALSE} % FALSE

答案4

如果你使用pdftexPDF 或 DVI 模式(即pdflatexlatex使用现代 LaTeX),你可以调整 Herbert 对我的问题的回答 有没有办法从包内部检测是否使用了 MiKTeX?来提取 TeX 版本。

它使用原语\pdftexbanner打印如下内容:

This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1

3.1415926是 TeX 版本,可以按照上面的链接提取。但是,这通常不适用于非常旧的 TeX,因为 TeXpdftex未在 DVI 模式下使用。

相关内容