我正在尝试使用 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
拥有这两个文件sub
并main
使用该格式文件(如果存在)。
为了创建 FMT 文件,我运行pdflatex -ini pre \dump
。
请注意,main
和sub
都输入pre
;但是,当pre.fmt
可用时,pre
实际上是在main
或开始之前输入的。在和的开头sub
检查是否已加载。preambledocclass
sub
main
pre.fmt
有四种情况需要考虑,取决于是否pre.fmt
可用。
pre.fmt
无法使用:pdflatex sub
- 成功。pdflatex main
- 成功。
pre.fmt
可用的pdflatex sub
- 成功。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 声明错误。添加一个检查来查看是否\documentclass
equals \@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
这里的问题是,您需要\documentclass
在sub
文件中添加一个,以便跳过其前导码。跳过的代码是重新定义版本的一部分\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
。
注意,必须写成%&pdflatex
,pre.tex
而不是%&PDFLATEX
,否则在Linux等区分大小写的操作系统下会出错。