是否有可能在lualatex
不使用 shell 转义的情况下从文档内部了解二进制文件的版本年份?如果我还能检测用户的平台就更好了。
我知道可以检测特定软件包的日期,如果软件包太旧,可能会发出警告。但这不是我需要的。我有一个自定义文档类(不在 CTAN 上),它附带一些非 TeX 附加功能。我想向终端打印一条消息,提醒用户他们应该使用其中一个附加功能(这可能取决于二进制文件的年份和平台)。
二进制文件可以是luatex
或luahbtex
,使用latex
格式。
伪代码MWE:
\documentclass{article} % Compile with lualatex.
\usepackage{fontspec}
\edef\whatbinary{\get\year\of\texlive\binary} % Such as 2023, 2024. OK if longer date.
\edef\whatplatform{\is\this\linux\mac\windows}
\begin{document}
Your TeXlive version year is \whatbinary.\par
You are running it on \whatplatform.
\end{document}
当然,由于是伪代码,因此上述内容无法编译。
答案1
答案2
如果您想要了解当前正在运行的 TeX Live 的发行年份,您可以获取一个肯定存在的文件的路径,即plain.tex
,这无需启用不受限制的 shell 即可实现。
然后您可以轻松地从该路径中提取年份。
\documentclass{article}
\ExplSyntaxOn
\str_new:N \l__railg_tlyear_str
\sys_get_shell:nnN { kpsewhich ~ plain.tex } { \cctab_select:N \c_str_cctab } \l__railg_tlyear_str
\regex_replace_once:nnN { [^[:digit:]]*([[:digit:]]{4}).* } { \1 } \l__railg_tlyear_str
\NewExpandableDocumentCommand{\tlyear}{}{\str_use:N \l__railg_tlyear_str}
\ExplSyntaxOff
\begin{document}
You're running \TeX~Live \tlyear.
\end{document}
如果我切换到早期的发行版,我会得到预期的结果。
您也可以制作一个可执行版本表。
\documentclass{article}
\ifcsname NewExpandableDocumentCommand\endcsname\else\usepackage{xparse}\fi
\ExplSyntaxOn
\cs_generate_variant:Nn \str_case:nnF { V }
\NewExpandableDocumentCommand{\gettlyear}{}
{
\str_if_exist:NTF \c_sys_engine_version_str
{
\str_case:VnF \c_sys_engine_str
{
{pdftex}{\railg_gettlyear_pdftex:}
{luatex}{\railg_gettlyear_luatex:}
{xetex}{\railg_gettlyear_xetex:}
}
}
{TeX~Live~older~than~2018}
}
\cs_new:Nn \railg_gettlyear_pdftex:
{
\str_case:VnF \c_sys_engine_version_str
{
{1.40.26}{2024}
{1.40.25}{2023}
{1.4.24}{2022}
{1.4.23}{2021}
{1.4.21}{2020}
{1.4.20}{2019}
{1.4.19}{2018}
}
{SORRY,~bad~string}
}
\cs_new:Nn \railg_gettlyear_luatex:
{
\str_case:VnF \c_sys_engine_version_str
{
{1.18.0}{2024}
{1.17.0}{2023}
{1.15.0}{2022}
{1.13.2}{2021}
{1.12.0}{2020}
{1.10.0}{2019}
{1.07.0}{2018}
}
{SORRY,~bad~string}
}
\cs_new:Nn \railg_gettlyear_xetex:
{
\str_case:VnF \c_sys_engine_version_str
{
{0.999996}{2024}
{0.999995}{2023}
{0.999994}{2022}
{0.999993}{2021}
{0.999992}{2020}
{0.999991}{2019}
{0.99999}{2018}
}
{SORRY,~bad~string}
}
\ExplSyntaxOff
\begin{document}
\typeout{Running TeX Live \gettlyear}
\end{document}
这支持pdftex
,luatex
并xetex
回到 2018 年(这是尽可能远的);它可以被补充或ptex
和eptex
。它依赖于 TeX Live 在其生命周期中从不更改可执行文件的事实。
答案3
您可以从以下位置提取数据\luatexbanner
:
\def\texliveyear{\expandafter\texliveyearA\luatexbanner}
\def\texliveyearA #1(#2 #3 #4){#4}
The \TeX{}live distribution is: \texliveyear.
\bye