![TeX 源的双重兼容性](https://linux22.com/image/257331/TeX%20%E6%BA%90%E7%9A%84%E5%8F%8C%E9%87%8D%E5%85%BC%E5%AE%B9%E6%80%A7.png)
考虑以下情况。您在本地机器上享受 TeXing,享受各种软件包的最新版本。例如,利用TikZ/externalize
... 或的优势biblatex
。
唉……你大学的 TeX 安装太旧了,或者你的合作者无法使用你的尖端软件包。然后,在另一个系统上签出副本无法编译!
我刚刚使用过的一个解决方案是从源代码中删除所有花哨的东西,使其与旧式系统兼容。然而,这有很大的缺点;例如,现在编译源代码(在本地机器上)需要更长的时间,因为您无法利用最新安装的版本TikZ
。
让我集中讨论一下这个TikZ
问题。有没有办法自动化解决方案?也就是说,在编译开始时运行测试,然后使能够或者禁用包的使用externalize
取决于文档当前编译的系统?
这种方法有意义吗?
编辑:
我冒着过于本地化的风险,但我确实想找到一个解决方案并接受这里的答案。我尝试使用@JosephWright 的想法如下:
\makeatletter
\IfFileExists{tikzexternal.sty}
{%
\usetikzlibrary{external}%
\tikzexternalize%
\tikzsetexternalprefix{figures/cache/}%
\renewcommand{\todo}[2][]{%
\tikzexternaldisable\@todo[#1]{#2}\tikzexternalenable}%
}%
{%
}%
\makeatother
编译时我出现以下错误:Illegal parameter number in definition of \reserved@a.
我不知道如何修复...有什么想法吗?
答案1
LaTeX 提供了两个有用的工具:\IfFileExists
和\@ifpackagelater
。如果我们以问题中概述的情况为例,我们无法确定该文件是否可用。我将概括为一个包foo
,它可能会给出类似
\makeatletter
\IfFileExists{foo.sty}
{%
% True branch
\usepackage{foo}
\@ifpackagelater{foo}{2012/10/23}
{%
% All good: use latest code
}
{%
% Code older: fall back on something?
}%
}
{%
% False branch: backup plan
}%
\makeatother
请注意,如果日期匹配,则\@ifpackagelater
实际上会给出日期,并且需要来自 LaTeX 包(行)的TRUE
日期。还请注意,通常会查找文件,因此我们需要\ProvidesPackage
\IfFileExists
满的名称(包括扩展名)。