第 12 项https://tex.stackexchange.com/a/148734/18401暗示LaTeX3
也许有一些东西可以修补(或附加代码)命令,就像etoolbox
或一样xpatch
。是这样吗?
答案1
当前版本的 LaTeX 的一个很大的缺陷就是它将多个层次混合在一起。原因当然是因为它是在计算机内存很小的时候编写的,因此效率非常重要。
修补命令在软件包或文档中非常常见:在 LaTeX2.09 的早期,最常用的技巧之一是重新定义\document
以便向其附加指令。结果是许多包(或称样式选项)彼此不兼容,因为它们假定了 的标准定义\document
。
LaTeX2e 的情况有所改善,它为常见任务提供了一些钩子。现在,考虑\chapter
中定义的book.cls
。
% book.cls, line 360:
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
该命令不会吸收参数然后将其用于后续任务,而是发出一些排版指令并进行一些非排版设置。只有在这之后,它才会通过 或 来查看参数\@chapter
。\@schapter
如果您查看 的定义\@chapter
,您将看到执行了属于不同级别的几条指令,最后将章节标题的排版委托给\@makechapter
。
包中充满了宏的重新定义,无论是其他包中给出的还是类中的,甚至还有内核宏!
重新定义内核宏是软件包不兼容的主要原因。如果某个软件包重新定义\@array
(确实有一个软件包这样做了),则任何依赖此宏具有其通常定义的软件包都将无法工作。某些软件包将依赖于array
作为 LaTeX 内核“官方”扩展的软件包,但加载该其他软件包将使它们无法工作。
事实上,它\@array
执行多项工作,在理想情况下,这些工作应该属于多个不同的功能。因此,级别受到尊重,并且调整一项功能并不意味着改变整个设置。
包etoolbox
将这个概念发挥到了极致。biblatex
发现自己需要适应许多类和内核中的函数都符合他的目的。这是因为内核将书目数据管理的几个方面硬编码到几个宏中,而且这些宏的级别也是混合在一起的。因此,他引入了一些辅助宏,使宏修补更容易,避免了复制整个代码块的需要,也有助于维护他的代码。
LaTeX3 项目的目标是在各个层次之间有非常明确的区分。例如,将排版指令与界面创建分开。
因此,\cite
用户级别的命令不会直接与编程级别交互。将有一个用于吸收参数的“命令接口”(想想xparse
),然后这些参数可以传递给“文档接口”,其中将根据定义良好的模板做出一些决定:书目数据管理包将定义自己的模板。实际的排版指令将在不同的级别发出,基于这些模板并使用提供的最低级别函数expl3
。
这种方法(请阅读 Frank Mittelbach 关于 TUGboat 的论文,以更清楚地了解该主题)将使修补命令的旧方法过时。借助“模板”抽象,将提供更多钩子。
当然,你也可以查看核函数的定义并进行修改。但这种做法显然是不被鼓励的。不修补功能将默认提供,因为修补将变得无用。