是否可以从文档中获取 TeXlive 版本年份,以及最好是用户平台?

是否可以从文档中获取 TeXlive 版本年份,以及最好是用户平台?

是否有可能在lualatex不使用 shell 转义的情况下从文档内部了解二进制文件的版本年份?如果我还能检测用户的平台就更好了。

我知道可以检测特定软件包的日期,如果软件包太旧,可能会发出警告。但这不是我需要的。我有一个自定义文档类(不在 CTAN 上),它附带一些非 TeX 附加功能。我想向终端打印一条消息,提醒用户他们应该使用其中一个附加功能(这可能取决于二进制文件的年份和平台)。

二进制文件可以是luatexluahbtex,使用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

在此处输入图片描述

在此处输入图片描述

这里的“unix”必须理解得比较宽泛。

\documentclass{article} % Compile with anything.
\begin{document}
binary/format is  \UseName{c_sys_engine_format_str} \UseName{c_sys_engine_version_str}

You are running it on \UseName{c_sys_platform_str} 
\end{document}

答案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}

这支持pdftexluatexxetex回到 2018 年(这是尽可能远的);它可以被补充或ptexeptex。它依赖于 TeX Live 在其生命周期中从不更改可执行文件的事实。

答案3

您可以从以下位置提取数据\luatexbanner

\def\texliveyear{\expandafter\texliveyearA\luatexbanner}
\def\texliveyearA #1(#2 #3 #4){#4}

The \TeX{}live distribution is: \texliveyear.

\bye

相关内容