在 \documentclass 之前挂接

在 \documentclass 之前挂接

由于之前提出的问题(在某个包或类中处理完选项后是否可以进行挂钩?)我想到了一个钩子,在\documentclass调用之前添加代码。因此,坚持上述帖子中介绍的技术,可以尝试

\let\savedDC\documentclass
\renewcommand{\documentclass}[2][]{%
  \typeout{my stuff here}
  \savedDC[#1]{#2}
}

或者直接以钩子宏的形式:

\newcommand{\BeforeDocumentclass}[1]{%
\renewcommand{\documentclass}[2][]{%
  #1
  \savedDC[##1]{##2}
}}

假设这些定义是在使用之后做出的\documentclass(否则就不需要钩子),这将失败,因为它们对 的使用没有实际影响\documentclass。或者简而言之:要定义一个将内容放在\documentclass您之前需要的钩子完全相同。有没有办法/程序可以摆脱这种递归性?

总结编辑:

从评论中得出两种可能的方法。

1)filecontents包:从文档中我了解到用法必须与“旧”文件内容环境完全相同;即它将某些内容写入可以通过检索的外部文件input。直到现在我还没有明白如何编写一个宏来调用input命令以获得所需的结果。

[谨此提醒:我试图通过这个问题弄清楚如何编写像\BeforeDocumentclass{<sth>}\begin{beforedocumentclass} <sth> \end{beforedocumentclass}]这样的宏,将代码移动到 documentclass 之前或者可能移动到最开始。

<sth>
\documentclass{someclass}
...
\BeforeDocumentclass{<sth>}
...

]

2)initex机制:通过使用谷歌,我刚刚发现它(不知何故?)是一个替代编译器;现在可以通过 -ini 选项访问。但我无法找出它实际上是如何工作的。如果有人有文档或类似内容的链接,我将不胜感激。

答案1

创建一个rubenlatex.tex文件,例如

\makeatletter

\def\ruben@whatever{} % here is the hook, define it to suit

\let\latex@@documentclass\documentclass
\def\documentclass{\ruben@whatever\latex@@documentclass}

\makeatother
\dump

然后从命令行运行

pdftex -ini '&pdflatex rubenlatex'

这将创建一个rubenlatex.fmt文件,您可以通过调用来预加载

pdftex -fmt rubenlatex

查看 TeX Live 文档以了解如何存储rubenlatex.fmt格式文件,以便从任何目录启动引擎时可读。

当然,这种方法也存在一些问题;第一个问题不大,第二个问题才是真正的大问题。

  1. 您需要为 DVI 输出中的 LaTeX(如果需要)、XeLaTeX 和 LuaLaTeX 创建类似的格式

  2. 解决方案是不可移植\documentclass;除非接收者对新格式进行了相同的设置,否则不能分发依赖于修改的文档。

相关内容