哪种改变命令的方式更强大/可持续

哪种改变命令的方式更强大/可持续

我有一个普遍的问题。如果我正在编写 .cls 文件(或包文件),编辑标准命令(例如\section由使用的标准类或 latex.ltx 定义的命令)的最佳方法是什么?

在这种假设的情况下,例如,我可以使用像titlesec\patchcmdfrom这样的包etoolbox,或者使用RenewDocumentCommand/进行完整的重新定义renewcmand

哪种可能性是改变此类命令最可靠、最安全的方法,为什么?如果我不得不猜测,我会说这是最简单的更新方式,因为它需要的附加包较少,但我可能错了。

编辑

因为我的问题可能有点不具体,所以我尝试说得更清楚一些。

假设我正在编写一个类文件,该文件提供了特定期刊的布局,在最好的情况下,可以添加到 CTAN。如果我想在这种情况下更改分段命令的样式,但当然要保留编号、目录等方面。在这种情况下,最可靠/最安全的方法是什么?

提前致谢!

答案1

仍然基于观点,但对于评论来说太长了。

\renewcommand如果从标准定义开始并进行更改,则可读性更强且更安全,注意保留提供编号等功能的整个结构,如OP所要求并在@enkorvaks 答案中讨论的那样。

尽管如此,为了获得更好的兼容性,我还是喜欢使用来进行小的etoolbox更改patchcmd(例如\large-> \Large)。对于大型项目加载许多包的情况,它们etoolbox不加载的可能性相当小。

举个例子,在我的大多数自定义.sty或中.cls,基于标准bookckass,我使用来表示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至少与标准命令相当(即根据需要编号、根据需要设置样式、目录、参考资料)。有些软件包可以为您处理所有这些复杂的细节,这意味着您无需考虑所有的边缘情况和细节不使用,但其他人可能会用。

总结:

您可能没有注意到许多极端情况和用途,因为您不使用它们。其他人可能会注意到(并且可能会注意到)。编写良好的现有包会处理这些问题,因此您不必这样做。

相关内容