Um die Kompilierungszeiten großer Dokumente zu beschleunigen, habe ich mich für die partielle Kompilierung interessiert. (Ich kenne die Möglichkeit der „Vorkompilierung“ von fmt
Dateien im Präambelformat bereits und beabsichtige, dies auch zu verwenden.)
Das erste Problem besteht darin, dass ich ein Dateiskelett geerbt habe, das (verschachtelte) \input
s anstelle von \include
s verwendet, sodass ich nicht wirklich verwenden kann \includeonly
.
Um zu demonstrieren, was ich möchte, betrachten Sie dieses MWE – der Einfachheit halber eine „flache“/einzelne test.tex
Datei:
\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}
Das Ergebnis ist ein 65-seitiges Dokument. Nehmen wir an, ich schreibe Abschnitt Zwei, der auf Seite 33 landet – und abzüglich der Ränder so aussieht (zum Vergrößern klicken):
Ich möchte den Bereich, der von Interesse ist, in Umgebungsbefehle „einschließen“, etwa so:
...
\lipsum[23]
\begin{PartialPreview} % PSEUDO
\section{Section Two}
\lipsum[35]
Changing the FONT here... \changeBaseFontSize{11}
\lipsum[38]
\end{PartialPreview} % PSEUDO
\section{Section Three}
...
An diesem Punkt, nach der Kompilierung (entweder steuerbar über die Befehlszeile oder durch bloßes Vorhandensein der „PartialPreview“-Befehle/Umgebung), möchte ich, dass Latex ein Dokument generiert, bei dem die ersten 32 Seiten leer sind und Seite 33 wie folgt aussieht:
... gefolgt von leeren Seiten bis Seite 65. In meinem Arbeitsablauf verwende ich evince
die Vorschau – und wenn sich die Seitenanzahl nicht ändert, evince
bleibt die Position der Bildlaufleiste beim Neuladen einer PDF-Datei unverändert – und so kann ich den Fokus ohne Scrollen an der gleichen Stelle im PDF behalten, selbst wenn ich zwischen teilweiser und vollständiger Kompilierung wechsle.
Ich würde mir wünschen, dass ich diesen Befehl/diese Umgebung in eine beliebige Verschachtelung von \input
/ einbinden könnte \include
; und da ich möchte, dass Seitenzahlen und andere Änderungen (wie Schriftgröße) nachverfolgt werden, würde ich mir vorstellen, dass zunächst eine vollständige Kompilierung erforderlich wäre und eine teilweise Kompilierung erst später möglich wäre. Andererseits wäre es vermutlich kein Problem, neue Seitenzahlen zu berechnen, wenn während des Schreibens (und der Vorschau der teilweisen Kompilierung) der Inhalt dieses „Abschnitts Zwei“ über eine Seite hinaus anwächst.
Natürlich wäre ich mit etwas zufrieden, das nicht unbedingt leere Seiten einfügt oder Seitenzahlen verfolgt – solange es Latex irgendwie dazu bringen kann, alle Teile, die während der teilweisen Kompilierung nicht von Interesse sind, zu „überspringen“, sodass es nicht alle Makros (und Texte/Bilder) auf dem Weg zum interessierenden Bereich verarbeiten muss (und somit eine deutliche Beschleunigung zu erwarten wäre).
Gibt es ein Paket mit Befehlen oder Umgebungen, die dies tun?
PS: Während meiner Suche habe ich nur ein paar Dinge gefunden, die damit zusammenhängen (z. B. eine regionale Kompilierung möglich ist), aber nicht wirklich anwendbar sind (da es sich nicht per se um Pakete für Latex handelt):
- AUCteX(überWie kann die LaTeX-Kompilierung mit mehreren TikZ-Bildern beschleunigt werden?) - dies ist ein „Plugin“ für Emacs, das ich nie verwendet habe. Es scheint, dass es am besten geeignet ist, um einzelne Gleichungen oder Graphen als eigenständige Bilder zu erhalten, anstatt zusammenhängenden Inhalt in einer PDF-Datei.
- Whizzytex(überBenutzerdefinierte Formatdatei: So automatisieren Sie die Generierung der „vorkompilierten Präambel“, wenn eine der dort verwendeten Dateien geändert wird) - wieder ein "Plugin" für Emacs, aber es funktioniert nur mit
latex
DVI-Dateien (während ichpdf/xe/lualatex
PDF verwende und damit arbeiten möchte)
BEARBEITEN: Gemäß den Kommentaren habe ich versucht, das Paket zu verwenden comment
und dies am Ende der Präambel hinzuzufügen:
\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
... so müsste ich die \begin{comment}
am Dokumentanfang nicht manuell pflegen und könnte die Vorschau von der Kommandozeile aus über steuern pdflatex "\let\doskip\relax\input{test.tex}"
; leider funktioniert das nicht - die Fehlermeldungen werden als %
Kommentare eingefügt.
Antwort1
Ich verwende es xemacs
mit AUC-TeX (es gibt emacs
auch ein Paket für die normale Version, aber das habe ich nicht verwendet). Es bietet Befehle, um nur die aktuelle Datei eines Dokuments mit mehreren Dateien oder nur den markierten Bereich zu verarbeiten. Die meisten Verweise außerhalb des verarbeiteten Teils werden als undefiniert angezeigt, aber für einen schnellen Blick reicht es aus.
Wenn Sie \include{...}
Dateien haben, können Sie den Befehl angeben \includeonly{list,of,files,to,include}
. Durch die Verarbeitung des vollständigen Dokuments erhalten Sie dann nur die angeforderten Dateien, wobei externe Querverweise aus vorherigen Durchläufen eingefügt werden (d. h. es wird davon ausgegangen, dass sich die Seitenzahlen nicht ändern, keine neuen Befehle eingegeben werden \label{...}
oder sich die Nummerierung der Kapitel/Abschnitte/... ändert).
Antwort2
Ok, entschuldigen Sie, dass ich das hier so kurz gemacht habe, aber ich habe es geschafft, ein Beispiel zu diesem Problem zu posten auf\comment oder \begin{comment} zu \AtBeginDocument hinzufügen?; es verwendet das {comment}
Paket und definiert eine geänderte Version davon \excludecomment
;, sodass man Folgendes verwenden kann:
\end{SKIPLINES} % the below range will be typeset:
\lipsum[5]
\begin{SKIPLINES}
... (beachten Sie die \end
Öffnungen und \begin
Schließungen), um die Teile zu definieren, die gesetzt werden (während der Rest ausgeblendet wird), wenn der Vorgang mit ausgeführt wird pdflatex "\let\doskip\relax\input{test.tex}"
.
Mir ist bewusst, dass die verlinkte Lösung auch ein wenig problematisch ist (sie funktioniert \input
auch nicht innerhalb von Dateien), daher hoffe ich, dass irgendwann eine fundiertere Antwort erscheint. Außerdem hoffe ich, dass ich in Zukunft Zeit habe, diese Antwort zu aktualisieren und die verlinkte Antwort so zu ändern, dass sie besser zu dieser Frage passt.