得益于 ,我们可以根据⟨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”。
显然,有一个用于此类宏的包,但我已经完成核心方法了;-)