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。(这需要ifluatex
和ifxetex
包。)小修订版的测试稍微复杂一些,但适用相同的方法。
如果您确实想要 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
如果你使用pdftex
PDF 或 DVI 模式(即pdflatex
或latex
使用现代 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 模式下使用。