\@ifpackagelater 相当于 babel 的语言定义文件吗?

\@ifpackagelater 相当于 babel 的语言定义文件吗?

得益于 ,我们可以根据⟨date⟩的版本制作条件构造。到目前为止,一切顺利。⟨package⟩\@ifpackagelater{⟨package⟩}{⟨date⟩}{⟨yes⟩}{⟨no⟩}

babel-*但这对于“包”(实际上是语言定义文件)不起作用:

\documentclass[english]{article}
\usepackage{babel}
\makeatletter
\@ifpackagelater{english}{2012/08/20}{%
  \typeout{After}
}{%
  \typeout{Before}
}
\makeatother
\begin{document}
\end{document}

因为相应的文件是.ldf而不是.sty文件。

是否有另一种基于⟨date⟩语言定义文件版本的条件构造方法?

答案1

在 LaTeX 中,版本日期可以通过以下方式声明:

\ProvidesClass{<class name>}[YYYY/MM/DD ...]
\ProvidesPackage{<package name>}[YYYY/MM/DD ...]
\ProvidesFile{<file name>}[YYYY/MM/DD ...]

LaTeX 提供:

\@ifclasslater
\@ifpackagelater

\@iffilelater缺失,并且两个命令都只能在前导码中使用。

软件包ltxcmds通过定义完整的集合来弥补差距:

\ltx@ifclasslater
\ltx@ifpackagelater
\ltx@iffilelater

所有三个命令也可以使用 \begin{document}

例子:

\documentclass[english]{article}
\usepackage{babel}
\usepackage{ltxcmds}
\makeatletter
\ltx@iffilelater{english.ldf}{2012/08/20}{%
  \typeout{After}
}{%
  \typeout{Before}
}
\makeatother
\begin{document}
\end{document}

答案2

babel 语言文件使用\ProvidesFile一些版本信息参数——如果应用了正确的扩展名,则此设置对于使用LaTeX核心宏检查文件日期是必要的。\@ifl@ter

它检查文件日期,请参阅定义和用法latex.ltx

\def\@ifl@ter#1#2{%
  \expandafter\@ifl@t@r
    \csname ver@#2.#1\endcsname}
\@onlypreamble\@ifl@ter
\def\@ifl@t@r#1#2{%
  \ifnum\expandafter\@parse@version#1//00\@nil<%
        \expandafter\@parse@version#2//00\@nil
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi}
\@onlypreamble\@ifl@t@r
\def\@parse@version#1/#2/#3#4#5\@nil{#1#2#3#4 }
\@onlypreamble\@parse@version
% Some lines omitted
\def\@ifpackagelater{\@ifl@ter\@pkgextension}
\def\@ifclasslater{\@ifl@ter\@clsextension}
\@onlypreamble\@ifpackagelater
\@onlypreamble\@ifclasslater

可以看出,宏\@ifpackagelater\@ifclasslater实际上没有参数(它们在移动!)并且{true}{false}分支的最终处理留给了\@ifl@t@r

因此,所有要做的就是定义一个单独的宏来检查 babel 定义文件,然后说\@ifbabellater\@b@belextension在这里提供。

\documentclass[english]{article}

\makeatletter
\def\@b@belextension{ldf}
\def\@ifbabellater{%
  \@ifl@ter\@b@belextension%
}
\makeatother
\usepackage{babel}
\makeatletter
\@ifbabellater{english}{2012/08/20}{%
  \typeout{After}
}{%
  \typeout{Before}
}
\makeatother
\begin{document}
\end{document}

在我的设置中,它会在控制台上打印“After”。

显然,有一个用于此类宏的包,但我已经完成核心方法了;-)

相关内容