答案1
该caption
软件包需要修补命令\caption
、\@caption
和\@makecaption
,前者由 LaTeX 内核定义(但有时会被像这样的文档类覆盖revtex4-1
),后者由文档类定义。
不幸的是,没有关于如何修补内部 LaTeX 命令的指南,而“LaTeX 包”的概念仅适用于无需修补内部 LaTeX 代码即可扩展 LaTeX 的包。因此,像这样的包caption
无法以干净且兼容的方式实现,这简直是不可能完成的任务。
基本上,修补现有命令有四种不同的方法:
- 保存旧定义,并让新定义也使用旧定义。
\patchcmd
使用软件包提供的命令(或其他命令)修补该命令etoolbox
。- 重新定义定义而不保存并使用旧定义。但尽量内置文档类和/或其他包提供的定义。
- 只需重新定义,而无需保存和使用旧定义。
所选方法会极大地影响您的定义与其他软件包的兼容性,这些软件包要么也重新定义该命令,要么依赖于该命令的特定行为。这是不同 LaTeX 软件包(或 LaTeX 文档类和软件包)之间存在如此多不兼容性的众多原因之一。
直到版本 3.0,该caption
包都使用方法 1。但是由于许多文档类和包重新定义了\caption
和\@caption
本身,这种方法已导致无法维护。因此,从版本 3.1 开始,该caption
包使用方法 3。为了确保它不会覆盖任何功能\caption
,它会在重新定义之前检查\@caption
、 和\@makecaption
是否已知。如果发现未知定义,它会拒绝重新定义\caption
和\@caption
,以确保caption
包按预期工作或incompatible
向用户发送消息,然后返回“兼容模式”,仅提供未修补 的包版本 1.0 已提供的功能\caption
。(由于该subcaption
包依赖于 的修补版本,\caption
因此\@caption
它根本无法工作。)
顺便说一句:幸运的是,该软件包适配的大多数 LaTeX 软件包caption
都已停用/无人维护,否则跟踪这些软件包内部的变化将花费大量时间。这基本上意味着,这样的软件包caption
之所以能够实现,是因为大多数其他 LaTeX 软件包已经停用!
因此,任何文档类(或重新定义\caption
或的包\@caption
)只要包caption
不适应它,就会被视为“不兼容”。
现在回到你的问题:
为什么该类revtex4-1
与包不兼容subcaption
?因为该caption
包尚未适配 revtex4-1 文档类。
这种不兼容性能轻易修复吗?我不知道。为了回答这个问题,我不得不仔细研究一下 的来源revtex4-1
。
然而,目前将caption
包改编为文档类意味着要增强caption
包本身。这种情况将随着即将推出的 3.4 版caption
包而改变,该版本将为这些改编提供文档化的接口,因此更多的人(或文档类的作者本人)可以提供这些改编。