如何将 documentclass 写入文件

如何将 documentclass 写入文件

假设我收到一个自包含的 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

相关内容