由于之前提出的问题(在某个包或类中处理完选项后是否可以进行挂钩?)我想到了一个钩子,在\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
格式文件,以便从任何目录启动引擎时可读。
当然,这种方法也存在一些问题;第一个问题不大,第二个问题才是真正的大问题。
您需要为 DVI 输出中的 LaTeX(如果需要)、XeLaTeX 和 LuaLaTeX 创建类似的格式
解决方案是不可移植
\documentclass
;除非接收者对新格式进行了相同的设置,否则不能分发依赖于修改的文档。