部分编译命令/环境?

部分编译命令/环境?

为了加快大型文档的编译时间,我对部分编译产生了兴趣。(我已经知道“预编译”前导格式fmt文件,并打算使用它)。

第一个问题是我继承了文件的骨架,它使用 (嵌套) \inputs 而不是\includes,所以我实际上无法使用\includeonly

为了演示我想要的内容,请考虑这个 MWE - 为简单起见,一个“平面”/单个test.tex文件:

\documentclass[11pt]{book}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{lipsum}

% https://tex.stackexchange.com/questions/4139/how-to-change-font-size-mid-document
% only 10, 11 and 12
\def\changeBaseFontSize#1{%
  \let\orignewcommand\newcommand
  \let\newcommand\renewcommand
  \makeatletter
  \input{bk#1.clo}%
  \makeatother
  \let\newcommand\orignewcommand
}

\usepackage{lastpage}
% page number override for book class:
\makeatletter
\def\@evenhead{\thepage\ of\ \pageref{LastPage}\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage\ of\ \pageref{LastPage}}%
\makeatother
% \usepackage{fancyhdr}
% \pagestyle{plain}
% \lhead[\thepage\ of \pageref{LastPage}]{}
% \rhead[]{\thepage\ of \pageref{LastPage}}


\begin{document}
\frontmatter
\clearpage
\mainmatter

\chapter{Some chapter}
\section{Section One}
\lipsum[1-145]

Changing the FONT here... \changeBaseFontSize{12}

\lipsum[20]
\lipsum[23]


\section{Section Two}
\lipsum[35]

Changing the FONT here... \changeBaseFontSize{11}

\lipsum[38]


\section{Section Three}
\lipsum[1-145]


\end{document}

这样得到的文档有 65 页;假设我正在写第二部分,最后在第 33 页 - 看起来像这样,减去边距(单击可查看完整尺寸):

测试.png

我想要做的是在环境命令中“包装”感兴趣的区域,如下所示:

...
\lipsum[23]


\begin{PartialPreview} % PSEUDO
\section{Section Two}
\lipsum[35]

Changing the FONT here... \changeBaseFontSize{11}

\lipsum[38]
\end{PartialPreview} % PSEUDO


\section{Section Three}
...

此时,在编译时(可以通过命令行控制,或者仅仅通过“PartialPreview”命令/环境),我希望 Latex 生成一个前 32 页为空白的文档;第 33 页如下所示:

测试1.png

...后面是空白页,直到第 65 页。在我的工作流程中,我使用它evince来预览 - 如果页数没有变化,那么evince在重新加载 pdf 文件时,滚动条的位置将保持不变 - 这样,我可以将焦点保持在 PDF 中的同一位置,而无需滚动,即使我在部分和完整编译之间切换。

我希望可以将此命令/环境包含在\input/的任意嵌套中\include;由于我希望它跟踪页码和其他更改(如字体大小),我设想首先需要进行完整编译,然后才可以进行部分编译。但是,我想如果在编写过程中(和部分编译预览),此“第二部分”的内容超出一页大小,那么计算新的页码就不是问题了。

当然,我会选择一些不一定插入空白页,也不跟踪页码的东西 - 只要它可以以某种方式让 Latex 在部分编译运行期间“跳过”所有不感兴趣的部分,这样它就不必处理通往感兴趣区域的所有宏(和文本/图像)(因此,可以预期显着的加速)。

是否有任何带有命令或环境的包可以执行此操作?

PS:在我搜索的过程中,我只发现了一些相关的东西(例如可以进行区域编译),但并不真正适用(因为它们本身不是 Latex 的包):


编辑:根据评论,我尝试使用包comment,并在序言末尾添加以下内容:

\newenvironment{PartialPreview}{}{}
\ifx\doskip\relax
  \typeout{DOSKIP}
  \usepackage{etoolbox}
  \usepackage{comment}
  % https://tex.stackexchange.com/questions/14135/how-to-automatically-add-text-immediately-after-begindocument
  %\AtBeginDocument{\comment} % ! Extra \endgroup.
  %\AtBeginDocument{\begin{comment}} % Runaway argument? ! File ended while scanning use of \next.
  %\AfterEndPreamble{\comment} % ! Extra \endgroup.
  \AfterEndPreamble{\begin{comment}} % Runaway argument? ! File ended while scanning use of \next.
  %\AtEndDocument{\endcomment}%{\end{comment}}
\fi

...所以不必手动维护\begin{comment}文档的开头,我可以通过命令行控制预览pdflatex "\let\doskip\relax\input{test.tex}";不幸的是,这不起作用 - 错误消息被添加为%注释。

答案1

我使用xemacsAUC-TeX(也有常规包emacs,但我没有用过)。它提供命令来处理多文件文档的当前文件,或者仅处理标记区域。处理部分之外的大多数引用将显示为未定义,但对于快速查看来说,这已经足够了。

如果您\include{...}有文件,您可以声明\includeonly{list,of,files,to,include},处理完整的文档只会为您提供所请求的文件,并从以前的运行中填写来自外部的交叉引用(即,它假设页码不变,没有新的\label{...},章节/部分/...编号没有变化)。

答案2

好吧,抱歉我写得太短了;但我设法在将 \comment 或 \begin{comment} 添加到 \AtBeginDocument?;它使用该{comment}包,并定义其修改版本\excludecomment;以便可以使用:

\end{SKIPLINES} % the below range will be typeset:
\lipsum[5]
\begin{SKIPLINES}

...(注意\end打开、\begin关闭)来定义将排版的部分(其余部分将被清空),如果该过程使用 运行pdflatex "\let\doskip\relax\input{test.tex}"

我知道链接的解决方案也有点问题(它在文件中也不起作用\input),所以我希望最终会出现一个更博学的答案;我也希望将来有时间更新这个答案,修改链接的答案,使其更好地适合这个问题。

相关内容