В целях ускорения времени компиляции больших документов я заинтересовался частичной компиляцией. (Я уже знаю о «предварительной компиляции» fmt
файлов формата преамбулы и собираюсь использовать и ее).
Первая проблема заключается в том, что я унаследовал скелет файлов, в которых \input
вместо \include
s используются (вложенные) 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 как таковыми):
- AUCTeX(с помощьюКак ускорить компиляцию LaTeX с несколькими картинками TikZ?) - это "плагин" для Emacs, который я никогда не использовал; и, похоже, он лучше всего подходит для получения отдельных уравнений или графиков в виде отдельных изображений, а не непрерывного содержимого в .pdf
- Whizzytex(с помощьюФайл пользовательского формата: как автоматизировать генерацию «предварительно скомпилированной преамбулы» при каждом изменении одного из используемых там файлов) - снова "плагин" для Emacs, но он работает только с
latex
файлами .xls и .dvi (а я используюpdf/xe/lualatex
и хочу работать с PDF)
EDIT: согласно комментариям, я попытался использовать package 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
также не работает внутри файлов), поэтому я надеюсь, что в конечном итоге появится более эрудированный ответ; я также надеюсь, что в будущем у меня будет время обновить этот ответ, изменив связанный ответ так, чтобы он лучше соответствовал данному вопросу.