![部分编译命令/环境?](https://linux22.com/image/305850/%E9%83%A8%E5%88%86%E7%BC%96%E8%AF%91%E5%91%BD%E4%BB%A4%2F%E7%8E%AF%E5%A2%83%EF%BC%9F.png)
为了加快大型文档的编译时间,我对部分编译产生了兴趣。(我已经知道“预编译”前导格式fmt
文件,并打算使用它)。
第一个问题是我继承了文件的骨架,它使用 (嵌套) \input
s 而不是\include
s,所以我实际上无法使用\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 页 - 看起来像这样,减去边距(单击可查看完整尺寸):
我想要做的是在环境命令中“包装”感兴趣的区域,如下所示:
...
\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 页如下所示:
...后面是空白页,直到第 65 页。在我的工作流程中,我使用它evince
来预览 - 如果页数没有变化,那么evince
在重新加载 pdf 文件时,滚动条的位置将保持不变 - 这样,我可以将焦点保持在 PDF 中的同一位置,而无需滚动,即使我在部分和完整编译之间切换。
我希望可以将此命令/环境包含在\input
/的任意嵌套中\include
;由于我希望它跟踪页码和其他更改(如字体大小),我设想首先需要进行完整编译,然后才可以进行部分编译。但是,我想如果在编写过程中(和部分编译预览),此“第二部分”的内容超出一页大小,那么计算新的页码就不是问题了。
当然,我会选择一些不一定插入空白页,也不跟踪页码的东西 - 只要它可以以某种方式让 Latex 在部分编译运行期间“跳过”所有不感兴趣的部分,这样它就不必处理通往感兴趣区域的所有宏(和文本/图像)(因此,可以预期显着的加速)。
是否有任何带有命令或环境的包可以执行此操作?
PS:在我搜索的过程中,我只发现了一些相关的东西(例如可以进行区域编译),但并不真正适用(因为它们本身不是 Latex 的包):
- 奥科特克斯(通过如何使用多张 TikZ 图片加速 LaTeX 编译?) - 这是 Emacs 的一个“插件”,我从未使用过;它似乎最适合将单个方程式或图形作为独立图像,而不是 .pdf 中的连续内容
- 威兹泰克斯(通过自定义格式文件:当其中一个文件发生更改时,如何自动生成“预编译前言”) - 再次是 Emacs 的“插件”,但它只适用于
latex
DVI 文件(而我使用pdf/xe/lualatex
并希望使用 PDF)
编辑:根据评论,我尝试使用包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
我使用xemacs
AUC-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
),所以我希望最终会出现一个更博学的答案;我也希望将来有时间更新这个答案,修改链接的答案,使其更好地适合这个问题。