我有一个普遍的问题。如果我正在编写 .cls 文件(或包文件),编辑标准命令(例如\section
由使用的标准类或 latex.ltx 定义的命令)的最佳方法是什么?
在这种假设的情况下,例如,我可以使用像titlesec
或\patchcmd
from这样的包etoolbox
,或者使用RenewDocumentCommand
/进行完整的重新定义renewcmand
。
哪种可能性是改变此类命令最可靠、最安全的方法,为什么?如果我不得不猜测,我会说这是最简单的更新方式,因为它需要的附加包较少,但我可能错了。
编辑
因为我的问题可能有点不具体,所以我尝试说得更清楚一些。
假设我正在编写一个类文件,该文件提供了特定期刊的布局,在最好的情况下,可以添加到 CTAN。如果我想在这种情况下更改分段命令的样式,但当然要保留编号、目录等方面。在这种情况下,最可靠/最安全的方法是什么?
提前致谢!
答案1
仍然基于观点,但对于评论来说太长了。
\renewcommand
如果从标准定义开始并进行更改,则可读性更强且更安全,注意保留提供编号等功能的整个结构,如OP所要求并在@enkorvaks 答案中讨论的那样。
尽管如此,为了获得更好的兼容性,我还是喜欢使用来进行小的etoolbox
更改patchcmd
(例如\large
-> \Large
)。对于大型项目加载许多包的情况,它们etoolbox
不加载的可能性相当小。
举个例子,在我的大多数自定义.sty
或中.cls
,基于标准book
ckass,我使用来表示s\renewcommand
中的重大变化 (实际上是和中的),但对和进行轻微修改(假设人们了解 LaTeX 如何使用它的 6 个参数)。chapter
\@makechapterhead
\@makeschapterhead
\patchcmd
\section
\subsection
\@startsection
而且,与本网站上的许多帖子相反,我建议永远不要使用titlesec
/ titleformat
,因为这会破坏一些事情,更糟糕的是(对我的用例而言)与 不兼容minitoc
。
另一件重要的事情是要尽早做出更改,特别是在加载hyperref
许多其他更改之前,这些更改也会改变分段命令,但通常不会像前者那样在“很晚”加载的包中列出。
答案2
正如 Alan Munn 在他的评论中指出的那样,“这要视情况而定。”对于样式 ( .sty
),我建议使用包,因为您的命令.sty
几乎可以与任何类一起使用,并且重新定义“标准”命令将导致许多事情的行为不符合文档作者的预期。该\section
命令的作用远不止将字体设置为更大的尺寸、使其加粗和使其变为无衬线。如果您\renewcommand
或\RenewDocumentCommand
命令\section
(例如){\Large \textbf{\textsf{#1}}}
,您将失去制作目录的所有能力(以及对标题、章节编号等的内部引用)。
如果您正在编写自己的课程供自己使用,并且不打算发布它,请选择最简单的选项来做您想做的事情。
如果您正在编写自己的类(.cls
文件)以供公众使用,请使命令\section
至少与标准命令相当(即根据需要编号、根据需要设置样式、目录、参考资料)。有些软件包可以为您处理所有这些复杂的细节,这意味着您无需考虑所有的边缘情况和细节你不使用,但其他人可能会用。
总结:
您可能没有注意到许多极端情况和用途,因为您不使用它们。其他人可能会注意到(并且可能会注意到)。编写良好的现有包会处理这些问题,因此您不必这样做。