使用带有 FMT 文件的独立包

使用带有 FMT 文件的独立包

我正在尝试使用 TeX 的功能将“格式”文件与standalone包一起转储。有四种情况需要考虑,除了一种之外,其他情况我都可以正常工作。

首先是我正在使用的文件。有pre.tex,它会加载我的所有包并将其转换为我的格式文件。它具有以下内容:

%&PDFLATEX
\makeatletter\@ifclassloaded{standalone}{}
  {\documentclass[class=report]{standalone}
    \usepackage{standalone}
    \def\preambledocclass{}}\makeatother
\usepackage{geometry}

接下来,我有main.tex,其中包含一个文件sub.tex

%&pre
\makeatletter\@ifundefined{preambledocclass}{%%
  \documentclass[class=report]{standalone}
  \usepackage{standalone}
  \input{pre}}{}\makeatother
\begin{document}
\section{main}
\input{sub}
\end{document}

最后,我有sub.tex,其中不包含任何其他文件:

%&pre
\makeatletter\@ifundefined{preambledocclass}{%%
  \documentclass[class=report]{standalone}
  \usepackage{standalone}
  \input{pre}}{}\makeatother
\begin{document}
\section{sub-document}
\end{document}

我的目标是能够sub独立于进行编译main。此外,我想创建一个 FMT 文件并同时pre拥有这两个文件submain使用该格式文件(如果存在)。

为了创建 FMT 文件,我运行pdflatex -ini pre \dump

请注意,mainsub都输入pre;但是,当pre.fmt可用时,pre实际上是在main或开始之前输入的。在和的开头sub检查是否已加载。preambledocclasssubmainpre.fmt

有四种情况需要考虑,取决于是否pre.fmt可用。

  1. pre.fmt无法使用:
    1. pdflatex sub- 成功。
    2. pdflatex main- 成功。
  2. pre.fmt可用的

    1. pdflatex sub- 成功。
    2. pdflatex main-- 我收到以下错误:

      (./sub.tex
      
      ! LaTeX Error: Can be used only in preamble.
      
      See the LaTeX manual or LaTeX Companion for explanation.
      Type  H <return>  for immediate help.
       ...
      
      l.6 \begin{document}
      
      ?
      

如果我改变sub它,它会声明documentclass何时pre.fmt加载,如下所示:

%&pre
\makeatletter\@ifundefined{preambledocclass}{%%
  ...}{\documentclass{standalone}}\makeatother

然后我就不能再sub独立编译了(场景 2.1)。我得到了一个双重 documentclass 声明错误。添加一个检查来查看是否\documentclassequals \@twoclasseserror,如下所示:

%&pre
\makeatletter\@ifundefined{preambledocclass}{%%
...}{\ifx\documentclass\@twoclasseserror\else\documentclass{standalone}\fi}\makeatother

修复了sub,但是中断了main(场景 2.2),导致了一个严重的错误:

(./sub.tex
! Extra }, or forgotten \endgroup.
\sa@gobble ...reamble@\sa@filepath \endcsname {#1}
                                                  \@ifundefined {sa@written@...
l.6 \begin{document}

?

我如何才能成功编译上述所有 4 种场景?

顺便说一句,我正在使用版本 v0.4a – 2011/04/07 standalone

答案1

这里的问题是,您需要\documentclasssub文件中添加一个,以便跳过其前导码。跳过的代码是重新定义版本的一部分\documentclass。如果从未执行该宏,则\begin{document}永远不会重新定义并导致通常的错误。\documentclass当子文件作为主文档的一部分进行编译时,您需要在所有情况下添加一些。由于您在主文件和子文件中都使用了类,因此standalone您不能使用提供的常规 if 开关和宏,standalone因为它们在两种情况下都是正确的。

这个想法是检查是否\documentclass等于\@twoclasseserror,但您不能将包含\documentclass在任何子\if... \fi句中,因为\fi将跳过其余的前言部分。您需要更改代码以在\documentclass处理之前关闭 if 子句。

请注意,该命令与v1.0 中的 new 选项\section一起使用时会引起麻烦。crop选择为默认值。因此,您应该preview明确设置该选项(这是版本 v0.x 的默认值)。

以下列出需要进行更改的三个文件:

预处理

%&pdflatex
\makeatletter\@ifclassloaded{standalone}{}
  {\documentclass[class=report,preview]{standalone}
    \usepackage{standalone}
    \def\preambledocclass{}}\makeatother
\usepackage{geometry}

主文本

\documentclass[preview]{standalone}
\usepackage{standalone}
\def\preambledocclass{}
\begin{document}
\input{sub}
\end{document}

亚特克斯

%&pre
\makeatletter
\@ifundefined{preambledocclass}{%%
  \documentclass[class=report,preview]{standalone}
  \usepackage{standalone}
  \input{pre}
}{%
 \ifx\documentclass\@twoclasseserror
    \expandafter\@gobble
 \else
    \expandafter\@firstofone
 \fi
 {\documentclass{standalone}}%
}
\makeatother
\begin{document}
\section{sub-document}
\end{document}

已使用该软件包的 v0.4a 和 v1.0 进行测试standalone

注意,必须写成%&pdflatexpre.tex而不是%&PDFLATEX,否则在Linux等区分大小写的操作系统下会出错。

相关内容