如何告诉人们为什么这些软件包已被弃用并且不再应使用?

如何告诉人们为什么这些软件包已被弃用并且不再应使用?

我使用 LaTeX 已经有一段时间了。随着撰写的文档越来越多,我了解到有些软件包不应该使用或已被其他软件包取代。

我查看朋友或学生写的文件时,一次又一次地看到那些被弃用的。我总是告诉他们不要使用它们,因为有更好的。然后他们问我,为什么不更新旧的,而是写新的。

我想知道是否有任何简单的解释,可以说服他们编写更好的代码并使用最新的软件包。

答案1

TeX 和 LaTeX 最初设计的主要动机是文档稳定性,您应该能够获得 20 年前的 LaTeX 文档并仍能对其进行处理。要获得绝对保证的稳定性,您需要存档整个系统可执行文件、字体等,但大多数情况下这不是必需的,旧的 LaTeX 文档可以在新系统上运行而无需更改。

您可以在作为基本 LaTeX 发行版的一部分分发的软件包中看到这一点fixltx2e。它对 LaTeX 实施了一系列不相关的可用性改进,如果不是出于兼容性要求,这些改进将直接合并到代码中。

请注意,在像 LaTeX 这样的系统中,没有所谓的兼容更改,它在用户级别公开其实现。如果你任何改成任何命令,某个地方的某个文档将会被破坏。如果您只是添加\relax或删除一个虚假{}组,或者%在空格标记不会造成任何损害的地方将一个添加到行尾,则修改后的命令的操作行为可能相同,但某个地方的某个人将使用补丁包(或只是直接使用分隔参数进行操作)以假定其定义中的第三个标记是\halign(或其他)的方式修补该命令,并且如果该标记成为第四个标记,则修补失败。或者也许文档正在使用\checkcommand并故意在原始命令以任何方式更改时抛出错误。

因此,当事情发生变化时,最好更改包名称并将内容放入新包中,即使您是原始包的维护者,因此可以进行更新。这意味着旧文档保持不变。但这确实意味着您必须至少部分支持两个版本的代码。

有时软件包会被其他人有效替换。例如enumeratecolor是核心 LaTeX 发行版的一部分。您可能会在本站看到一些答案,暗示它们被和替换enumitemxcolor但这些软件包是贡献的扩展,而不是核心版本的一部分。这个区别不像以前那么重要了,现在大多数人使用 tex 发行版,例如 texlive 或 miktex,因为无论原始来源如何,它都能以一致的方式处理软件包更新。这些软件包的名称不同,部分原因是它们有不同的作者并分开维护,但如上所述,即使涉及同一个维护者,也可能会调用新的软件包,以便旧的接口保持不变。

即使命令结构相同,更新包也可能很困难,有报道称,有些情况下longtable分页选择可能不太理想。可以添加修改决策的代码,但必须更改许多现有文档中的分页,这实际上并不可接受。即使新版本在某种程度上更好,如果现有文档强制分页以克服旧算法的限制,那么分页就会发生变化,文档很容易留下空白页或只有几行表格。(在这种情况下,可能需要选择加入新功能的包选项。)

有几次我试图通过要求 ctan 维护人员从分发中删除软件包来强制弃用软件包。这实际上行不通:如果您有一个包含数千份历史文档的文档档案,您肯定不想浏览所有这些文档以查看它们是否使用旧的弃用软件包并更新它们以使用新的软件包。更简单(并且非常合理)的做法是投诉并让软件包恢复(或维护它的本地副本)。

答案2

除了其他答案之外,我还要评论一下:

了解哪些软件包已过时的一个非常好的资源是l2tabu – 过时的软件包和命令(德文原版)或l2tabu 英语(感谢@ari-brodsky)它显示了哪些包不再应使用并提供了替代方案。

我建议告诉所有学生在编写自己的文档之前和编写文档时检查此文档,尤其是当他们使用别人的代码时......

答案3

TeX 已经存在了相当长一段时间,随着时间的推移,构建的文档数量相当庞大。其中一些旧文档依赖于这些过时软件包中内置的功能。当创建一个可重现旧软件包功能的新软件包时,您需要选择是否使其向后兼容(相同的命令、完全相同的输出……)。这并不总是可行或可取的。解决方案是出于向后兼容性的原因保留旧软件包,并构建一个最好用于较新文档的新软件包。

软件包并行开发之所以会发生的另一个原因是,当出于(略微)不同的原因而创建新的软件包时,但由于添加了新功能,新软件包开始做得更好,因此成为特定功能的事实上的软件包,而旧软件包则被淘汰。

答案4

“每个 LATEX 用户迟早都会面临兼容性噩梦。有了如此强大的调解能力(LATEX 代码能够随意重新定义自身 - 根本不提供任何代码保护),文档编译不可避免地会因类/样式冲突而失败。在理想世界中,类/样式冲突应该只是软件包维护者而不是 LATEX 最终用户的关注点。不幸的是,世界是真实的,不是理想的,最终用户的文档编译确实会中断。情况接近无政府状态。” - Didier Verna (文章推介会

LaTeX 中有太多不必要的代码/包分支。这真是一场噩梦。你无法保护你的内部或用户命令。\def总是地震,开发人员对发现\newcommand\@ifdefinable不方便或认为它们不重要的用户无能为力。但我们不要忘记:Knuth 坚持认为他并不是想让 TeX 受到开发人员的欢迎;他只是想为他的秘书提供一个简单的系统。我不知道 LuaTeX 或任何引擎是否提供代码保护和/或自动为所有包命令添加包名称(可能是缩写形式)的前缀。

Didier 的观点是正确的,TeX 仅仅是一种宏扩展语言,通常不提供任何编程风格,而且遗憾的是,它也不坚持这种风格。

相关内容