假设我收到一个自包含的 LaTeX 源文件。main.tex
它包含一个宏定义文件my_macros.tex
,作者将其包含在序言中。这个宏文件在我的控制之下,但除了由作者包含之外,不得干扰作者的 LaTeX 操作。
更确切地说:my_macros.tex
在作者使用的电脑上,文件可能是空的。但因为作者是我的客户,所以他同意将其包含在内。在我的电脑上,我可以my_macros.tex
随意填充。
是否可以编写一些宏并将它们放入my_macros.tex
,执行以下操作:
发出后
$ latex main.tex
我将在我的文件系统中找到一个文件,比如说main.nem
,其中包含文件的文档类main.tex
。
例如如果看起来main.tex
像这样
\documentclass{eth_super_article}
% ...
\input{my_macros.tex}
% ....
\begin{document}
%....
\end{document}
然后main.nem
将包含该行,并且仅包含该行
\documentclass{eth_super_article}
答案1
如果你可以假设用户\RequirePackage
以前永远不会添加说明\documentclass
,那么类名将是中的第一个项目\@filelist
。
\makeatletter
\def\hr@getclass#1.#2\@nil{\def\hr@class{#1}}
\expandafter\hr@getclass\@filelist\@nil
\immediate\openout\@partaux=\jobname.nem
\immediate\write\@partaux{%
\noexpand\documentclass
\expandafter\ifx\expandafter\\\@classoptionslist\\\else
[\@classoptionslist]\fi{\hr@class}}
\immediate\closeout\@partaux
\makeatother
如果不能假设上述限制,则需要做更多的事情。
我滥用\@partaux
而不是分配一个新的流;它被使用\include
,它不应该出现在序言中,所以它看起来相当安全。
扩展版本可以处理\RequirePackage
之前可能发生的调用\documentclass
:
\makeatletter
\def\hr@getclass#1.#2,#3\@nil{%
\def\hr@class{#1}\def\hr@ext{#2}\def\hr@filelist{#3}%
\ifx\hr@ext\@clsextension
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\expandafter\hr@getclass\hr@filelist,\@nil}%
}
\let\hr@filelist\@filelist
\expandafter\hr@getclass\hr@filelist,\@nil
\immediate\openout\@partaux=\jobname.nem
\immediate\write\@partaux{%
\noexpand\documentclass
\expandafter\ifx\expandafter\\\@classoptionslist\\\else
[\unexpanded\expandafter{\@classoptionslist}]\fi{\hr@class}}
\immediate\closeout\@partaux
\@onlypreamble\hr@getclass
\@onlypreamble\hr@class
\@onlypreamble\hr@ext
\@onlypreamble\hr@filelist
\makeatother
我们开始一个递归,当找到表单的文件名时结束,这肯定是主类;当然,如果一个用户之前filename.cls
说过,那你就倒霉了。\input{my_macros}
\documentclass