Teilweise Neukompilierung, wie?

Teilweise Neukompilierung, wie?

Editoren wie BaKoMa TeX und texpad scheinen in der Lage zu sein, einzelne Seiten neu zu kompilieren. Ich würde gerne wissen, wie ich das selbst bewerkstelligen kann, konnte aber bisher nicht herausfinden, wie das geht.

Ich hoffe, dass jemand mit mehr Wissen hier einige Antworten geben kann. Was ich idealerweise suche, ist ein schrittweiser Prozess, idealerweise von der Art, die in einen Editor integriert werden könnte (ich helfe bei der Entwicklung der LaTeX Workshop VSCode-Erweiterung).

Antwort1

AucTeX, Emacs bekanntester Hauptmodus für *TeX hat eine TeX-command-regionFunktion, die einen Compiler für den Teil der Datei ausführt, der zuvor mit der Maus ausgewählt wurde (natürlich geht das auch mit der Tastatur). Sie können diesen Funktionscode ganz einfach in Emacs überprüfen, wenn Sie ihn implementieren möchten.

Da ich kein Emacs-Benutzer mehr bin, führe ich einfach mein nicht ganz so elegantes, aber funktionierendes externes Shell-Skript aus. Sollte mit jeder Texlive-Installation und KSH funktionieren, vielleicht auch mit jeder anderen Shell. Dies sollte auf keinen Fall in einem Editor implementiert werden.

#!/bin/ksh
#tex_region.sh first_line last_line file [master file]

#where am I?
ousuisje=$(pwd)
#is there a master file?
if [[ -s $4 ]];
then
   maitre=$4;
else
   maitre=$3;
fi
#copy the preamble
sed -e '/maketitle/,$d' $maitre > /tmp/$maitre ;
#copy file from line $2 to line $3
head -n $2 $3 |tail -n $(( $2 - $1 + 1 )) |\
#absolute path to graphic files
sed "/includegraphics/s:{\([^}]\+}\):{$ousuisje/\1:">> /tmp/$maitre
#add \end{document} to temporary file
echo -E "\end{document}" >> /tmp/$maitre

#goes to /tmp
cd /tmp

#checks which *latex has to be called then compile
laoulualatex=$(grep -c '^\\\usepackage{polyglossia}' $maitre)
if (( $laoulualatex == 1 )) ;
then
   # if your distro is texlive, binaries should be in $TEXDIR/bin
   lualatex $maitre ;
else
   pdflatex $maitre ;
fi

######read the pdf with mupdf (code inspired by Vincent Lozano's framabook
###### "pour aller plus loin avec la ligne de commande")
#checks whether the pdf is opened with mupdf
pidpdf=$(ps -U dthiriet | grep mupdf | grep ${maitre%tex}pdf | cut -d' ' -f1)
if test -z $pidpdf ;
   #if not, calls mupdf
then 
   mupdf ${maitre%tex}pdf & 
else
   #send a SIGHUP signal to mupdf to actualize the pdf
   kill -s HUP $pidpdf ;
fi ;

#####back to my file
cd $ousuisje

PS: Es ist besser, Programme mit ihrem absoluten Pfad in einem Skript aufzurufen, aber ich habe sie beim Kopieren meines Skripts gelöscht, um dieses Skript etwas portabler zu machen.

Antwort2

Nur um sicherzugehen: Sie wissen, wie man ein Hauptdokument erstellt und mit , , so viele Teile einfügt, wie Sie \includemöchten\input\includeonly so viele Teile einbindet wie Sie möchten. Details finden Sie hier:Wann sollte ich \input statt \include verwenden?. Dadurch wird die Neukompilierung ziemlich schnell.

Sie können die Kompilierung sogar beschleunigen, indem Sie ein vorkompiliertes Format verwenden, siehe das Paket mylatexformat.

Und Sie können dies steigern, wenn Sie Latexmk im Hintergrund kompilieren lassen.

Möglicherweise erlaubt Ihr Editor eine automatische Speicherung, z. B. zwei Sekunden nachdem Sie mit dem Tippen aufgehört haben. latexmk bemerkt die Speicherung und beginnt mit der Kompilierung im vorkompilierten Format.

Am Ende erhalten Sie nahezu augenblicklich ein Bild der Seite, auf der Sie etwas geändert haben.

Antwort3

Um eine echte Online-Kompilierung zu erreichen, verwenden andere Programme wie BaKoMa TeX ein modifiziertes (La-)TeX. Mit dem neueren LuaTeX ist es einfacher, tief in die internen Komponenten einzudringen. Vielleicht ist dies ein Weg, den Sie untersuchen können.

Als Workaround können Sie jedoch die Kompilierung mit LaTeX bis zur aktuellen Cursorposition in Ihrem Editor starten. Nehmen wir an, Ihr vollständiges Dokument sieht folgendermaßen aus:

\documentclass{article}
\begin{document}

$1$
\newpage
$2$

[Cursorposition]

Some more example text.

Anstatt fortzufahren, die Eingabe hier zu beenden und die Kompilierung abzubrechen, wird die DVI-Datei trotzdem bis zu diesem Punkt geschrieben.

\newpage
$3$
\newpage
$4$

\end{document}

Es ist möglich, den ersten Block mit LaTeX einzugeben und zu kompilieren. Wenn der Benutzer dann eine kurze Pause macht, kann die Kompilierung fortgesetzt und beispielsweise auf der nächsten Seite abgebrochen werden. Das DVI-Dokument steht dann fast sofort zur Verfügung. Im Hintergrund kann der Kompilierungsprozess dann bis zur Cursorposition erneut gestartet werden, sodass der Arbeitsablauf des Benutzers nicht unterbrochen wird.

Bei einer modifizierten LaTeX-Programmdatei wäre die erste Optimierung, den Kompilierungsprozess in einer Art Cache aufzuzeichnen, so dass der Teil vor der aktuellen Seite nicht erneut kompiliert werden muss, es sei denn, er ändert sich. Das macht diesen Ansatz auch einigermaßen praktikabel, da es keine programmtechnische Möglichkeit gibt, den Inhalt einer vorherigen Seite mit Code auf den späteren Seiten zu beeinflussen. Dies unterscheidet eine LaTeX-Datei beispielsweise von einer C-Quelldatei, bei der am Ende der Datei vorherige Teile geändert werden können.

Antwort4

Ich weiß, das ist nicht genau das, was Sie suchen, aber es gibt Plugins für VIM, die eine Livevorschau des Dokuments bieten.

Mitvim-latex-live-vorschauSie können diesen Effekt erzielen. Dies funktioniert natürlich nur, wenn Sie VIM als Editor verwenden. Ich bin kein EMACS-Benutzer, aber ich bin sicher, dass es dort auch ähnliche Möglichkeiten gibt.

Ich hoffe, dies kann Ihnen die richtige Richtung weisen.

verwandte Informationen