自动确定正在使用的 TeXLive 版本

自动确定正在使用的 TeXLive 版本

我希望能够自动确定我正在运行的 TeXLive 版本。我有时会遇到问题,在尝试调试问题之前,先测试文件在旧版本中是否编译正确会很有用。

目前,我已经更新了我的代码以使用新的特点datatool按照没有空间容纳新的 \count 和 datatool。 随着datatool更新,我更新了全部其他软件包,现在遇到一个问题,至少似乎已经正常运行一年多了。

但要切换回运行旧版 TeXLive2011 并不容易,因为它没有新软件包。当然,更新 2011 版的软件包会有点违背此处的目的。:-)

下面的 MWE 在最新的版本中运行良好更新TeXLive2012(或更高版本2.13datatool。但是,为了使其与旧版本一起运行,需要手动将版本编辑\def\TeXLiveVersion为 以外的版本2012

参考:

笔记:

  • 为了使 MWE 有用,需要较旧的版本,因为当前的 TeXLive2012 没有问题。或者,如果您最近没有更新软件包并且拥有 v2.12(或更旧)版本的datatool软件包(在这种情况下,除非您手动编辑以下内容,否则它将无法运行\TeXLiveVersion

      \def\TeXLiveVersion{2011}%
    
  • 这是一个较老的问题,我在使用 TeXLive2011 时遇到了问题(但文件可以使用 TeXLive2010 编译成功): 调试建议:TeXLive2011 超出 TeX 容量(但 TeXLive2010 不会超出)。当时我手动更改了序言,但在这种情况下,自动化解决方案同样有用。

  • 如果不明显的话,这里的 MWE 的实际输出是不是很重要。这是一个虚构的例子,用来说明我需要知道我使用的 TeXLive 版本的情况,以及测试所提出的确定版本的解决方案是否有效的方法。

代码:

\def\TeXLiveVersion{2012}% <--- Don't want to have to manually specify this

\documentclass{article}
\usepackage{datatool}
\usepackage{pgffor}
\usepackage{xstring}
\usepackage{letltxmacro}

%\usepackage{filecontents}% Commented to prevent overwriting MyData.csv
\begin{filecontents*}{MyData.csv}
    Directory, Color
    ../dirB,    red
    ../dirC,    yellow
\end{filecontents*}

\LetLtxMacro\MyDTLcleardb{\DTLcleardb}% Default to 2012 and future
\IfEq{\TeXLiveVersion}{2012}{%
}{%
    \newif\ifDTLnewdbonload%
    \LetLtxMacro\MyDTLcleardb{\DTLdeletedb}%
}%

\begin{document}

\DTLnewdb{MyDB}
\DTLnewdbonloadfalse% don't let \DTLloaddb create a new database 

\foreach \x in {1,...,5}{% Read DB numerous times
    \typeout{count=\x}%
    \MyDTLcleardb{MyDB}% clear database
    \DTLloadrawdb[keys={Directory,Color}]{MyDB}{MyData.csv}%
}%

\par\noindent\DTLdisplaydb{MyDB}% Some output to have a PDF
\end{document}

答案1

pdflatexlualatex可能的,因为 TeX Live 程序在其横幅中宣传发布年份:

\documentclass{article}

\makeatletter
\def\getversion{\expandafter\get@version\pdftexbanner\@nil}
\def\get@version#1201#2)#3\@nil{\def\TeXLiveVersion{201#2}}
\makeatother
\getversion

\begin{document}
This has been run with \TeX~Live~\TeXLiveVersion.

\texttt{\pdftexbanner}
\end{document}

在此处输入图片描述

这可能会被横幅中的其他“201”字符串所欺骗,但应该分析由不同 TeX Live 包装(例如,Debian 对其进行了修改)生成的横幅,以便找到一个强大的方案。

但是,仅针对发布年份进行测试是不够的;最好依靠查看软件包版本\@ifpackagelater

更新

哦,好吧,时代变了!下面是一个可能更强大的代码,它依赖于返回的字符串,其\pdftexbanner形式为

<characters>TeX Live 20??<characters>)<characters>

为了进行字符串化,必须使用一些技巧TeX Live

\documentclass{article}

\makeatletter
\begingroup
\edef\get@@version{\def\noexpand\get@version##1\detokenize{TeX Live}##220##3##4##5)##6\noexpand\@nil}
\get@@version{\gdef\TeXLiveVersion{20#3#4}}
\expandafter\get@version\pdftexbanner\@nil
\endgroup
\makeatother

\begin{document}

This has been run with \TeX~Live~\TeXLiveVersion.

\texttt{\pdftexbanner}

\end{document}

響

使用 TeX Live 2018 运行的输出

在此处输入图片描述

替代版本

我们可以利用 TeX Live 将其文件存储在 中的事实.../texlive/20??/

\documentclass{article}
\usepackage{catchfile}

\makeatletter
\begingroup
\CatchFileDef{\banner}{|"kpsewhich plain.tex"}{}
\def\extractfrombanner#1/20#2#3/#4\extractfrombanner{%
  \gdef\TeXLiveVersion{20#2#3}%
}
\expandafter\extractfrombanner\banner\extractfrombanner
\endgroup

\begin{document}

This has been run with \TeX~Live~\TeXLiveVersion.

\texttt{\pdftexbanner}

\end{document}

我的机器上最早运行的 TeX Live 版本是 2013,pdflatex我用它得到了预期的结果。

应该xetex也可以与 XeLaTeX 一起使用,但不幸的是, macOS 软件包中长期存在的错误阻止了它直到最近几年(2018 年)才实现。

相关内容