我希望能够自动确定我正在运行的 TeXLive 版本。我有时会遇到问题,在尝试调试问题之前,先测试文件在旧版本中是否编译正确会很有用。
目前,我已经更新了我的代码以使用新的特点这datatool
按照没有空间容纳新的 \count 和 datatool。 随着datatool
更新,我更新了全部其他软件包,现在遇到一个问题,至少似乎已经正常运行一年多了。
但要切换回运行旧版 TeXLive2011 并不容易,因为它没有新软件包。当然,更新 2011 版的软件包会有点违背此处的目的。:-)
下面的 MWE 在最新的版本中运行良好更新TeXLive2012(或更高版本2.13
)datatool
。但是,为了使其与旧版本一起运行,需要手动将版本编辑\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
这pdflatex
是lualatex
可能的,因为 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 年)才实现。