Sie sind hier

Emacs und Helferlein, Folge 1: latexmk

Vorwort

Vor ungefähr zwei Jahren habe ich begonnen, beruflich Emacs zu verwenden, um Texte mit LaTeX zu schreiben. Ich bin so eine Art Geisteswissenschaftler, genauer gesagt: Jurist.

Nach zwei Jahren mit Emacs, AUCTeX und LaTeX wird es Zeit, all' die anfangs ganz erstaunlichen Helferlein vorzustellen, bevor ich vergesse, wie erstaunt und erfreut ich bei deren jeweiliger Entdeckung war.

Wenn einem niemand sagt, dass M-q (»M« bezeichnet die Alt-Taste, »C« die Strg-Taste; M-q bedeutet also, Alt-q zu drücken) den Absatz, in dem sich der Cursor befindet, im Editor neu setzt, wie soll man drauf kommen, dass es so etwas überhaupt gibt? Tolle Sache! Da fragt man sich doch, was man noch alles nicht kennt.

In ein paar kurzen Kapiteln will ich meine »Entdeckungen« hier vorstellen. Nicht für die Techniker, sondern für diejenigen, die aus einer ganz untechnischen Welt kommen und irgendwann feststellen, dass man zum Bedienen von Computern am besten das Werkzeug nimmt, das die Fachleute auch nehmen.

Erste Folge: latexmk, ein perl-Script.
Keine Kurzgeschichten!

Irgendwer fragte mich 'mal, ob es nicht mühsam sei, mit Emacs zu arbeiten. Denn jedesmal, wenn man etwas von Emacs wolle, müsse man zuerst eine Kurzgeschichte schreiben.

Da ist 'was dran. Ein Beispiel: Um Emacs + AUCTeX mitzuteilen, sie mögen bitte LaTeX den Text kompilieren lassen, muss man den Puffer (der den Text enthält) abspeichern und dann kompilieren: C-x C-s zum Speichern, C-c C-c RET zum Kompilieren. Auch für mich als geübten 10-Finger-Schreiber kostet das einen Moment Konzentration und lenkt mich ab.

Ich schreibe jeden Tag irgendwelche Texte mit LaTeX, AUCTeX und Emacs. Im Editor ist der Text wegen der hervorgehobenen LaTeX-Befehle nicht so sehr übersichtlich. Bei Tabellen (brauche ich dauernd) wird's noch unübersichtlicher. Die erstelle ich zwar meistens in einer Tabellenkalkulation und exportiere sie von dort aus in LaTeX, aber um um eine Nachbearbeitung kommt man nicht herum.

Ein Ausweg bestünde darin, alles mit org-mode zu schreiben. Übersichtlicher kann die Sache dann nicht mehr werden. Aber dann müsste ich mich auf den LaTeX-Export von org-mode verlassen, was ich nicht will.

Ich möchte daher meinen Text auf dem (virtuellen) Papier sehen, möglichst schnell. Und ohne meine Gedanken zu unterbrechen.

Abhilfe: latexmk

Man kann nun einerseits Emacs mitteilen, dass der Befehl zum Kompilieren auch automatisch den Text speichern soll, oder das Speichern startet die Kompilierung. Ich habe mich für letzteres entschieden und verwende dafür unter Windows wie unter Linux das Perl-Script latexmk, erhältlich hier: http://www.phys.psu.edu/~collins/software/latexmk-jcc/

latexmk überwacht eine *.tex-Datei auf Änderung. Sobald die Datei neu gespeichert wird, startet latexmk soviele Durchläufe mit LaTeX, pdfLaTeX, LuaLaTeX und was auch immer, wie gebraucht werden.

Man könnte latexmk über Emacs aufrufen und dem Aufruf sogar eine Taste zuordnen. Aber wenn ein Fehler auftritt, will ich das gleich sehen, ohne mich durch eine Vielzahl von Emacs-Puffern zu wühlen. Daher öffne ich für latexmk immer eine Konsole, navigiere mich in das betreffende Verzeichnis und starte latexmk von dort mit folgendem Befehl:

latexmk -pvc -pdf Dateiname.tex

Ab diesem Moment muss ich mein LaTeX-Dokument nur neu speichern und es entsteht ein neues pdf. Den Befehl dazu – C-x C-s – gebe ich inzwischen ein, ohne einen Gedanken daran zu verschwenden.

Woher weiß latexmk, dass ich ein pdf will, dass es zur Herstellung pdflatex verwenden soll und ich außerdem synctex verwende?

Ich habe eine Zeile in eine Konfigurationsdatei geschrieben (unter Linux hört sie auf den Namen `.latexmkrc`):

$pdflatex = 'pdflatex --interaction nonstopmode --synctex=-1 %O %S'

Damit wird pdflatex als Programm festgelegt. Die Option -pvc startet die Überwachung und die Option -pdf sagt latexmk, dass ich ein PDF als Ausgabe wünsche.

Hin und wieder wird das PDF direkt über einen Beamer auf einer Leinwand abgebildet und die Anwesenden besprechen den Text. Wenn man beim Schreiben immer mal wieder ein schnelles C-x C-s einstreut, fällt der Unterschied zu Word vor allem dadurch auf, dass wir schreiben können, wie wir wollen, ohne jedes Gefrickel.

Und das alles dank so vieler Leute, die »fer umme« ganze Paläste aus Code errichtet haben oder in Foren Fragen beantworten, beispielsweise, wie man Emacs automatisch kompilieren lassen kann. Unglaublich.

Kommentare

Schön geschrieben und sehr informativ. Als Bemerkung sei mir nur erlaubt, darauf hinzuweisen, dass emacs+auctex bei C-c C-c nicht einfach nur einen LaTeX-Lauf startet. Stattdessen kontrolliert es zunächst, welche Datei denn der TeX-Master zum aktuellen Buffer ist. Dann kontrolliert es, welche Dateien von diesem TeX-Master eingebunden werden. Falls irgend eine dieser Dateien in einem Buffer – also geöffnet – ist, wird geprüft, ob der entsprechende Buffer geändert wurde. Falls dies der Fall ist, wird für jeden betroffenen, geänderten Buffer nachgefragt, ob dieser gespeichert werden soll.

Als nächstes wird kontrolliert, ob sich irgend eine der Dateien (beispielsweise durch Speichern des Buffers) geändert hat. Falls das der Fall ist, wird ein LaTeX-Lauf vorgeschlagen anderenfalls wird nur ein Viewer-Aufruf vorgeschlagen. Dabei wird dann auch kontrolliert, ob ein DVI- oder ein PDF-Viewer aufgerufen werden muss. In der Voreinstellung wird unter Linux inzwischen evince als PDF-Viewer aufgerufen. Sollte dieser das Dokument bereits geöffnet haben, wird aber keine neue Instanz geöffnet, sondern die vorhandene aktiviert. Evince wiederum prüft im Hintergrund selbst, ob das PDF sich geändert hat, und zeigt die Seite dann selbst neu an. Mit okular oder xpdf funktioniert das ebenfalls. Unrühmliche Ausnahme ist hier der Adobe Reader (den ich ohnehin kaum verwende).

Wenn ich mich recht erinnere, schlägt auctex bei C-c auch BibTeX und MakeIndex-Läufe vor, wenn entsprechende Dateien vorhanden sind und sich geändert haben. Ansonsten kann man die auch aus dem Menü oder mit anderen Tastenkürzeln selbst starten.

Und falls eines dieser Programme aufgerufen wurde, kontrolliert auctex auch noch heuristisch, ob ein weiterer LaTeX-Lauf notwendig ist. Es informiert dann darüber und beim nächst C-c schlägt es ggf. auch erst noch einen weiteren LaTeX-Lauf statt des Viewer-Aufrufs vor. Dazu verwendet es u. a. die Rerun-Meldung von LaTeX.

TeX-Master, PDF-Modus, Verwendung von latex oder xelatex oder lualatex, sind übrigens Dinge, die man wahlweise über das Menü oder per local variables in der Datei einstellen kann. Für mein luaindex-Projekt steht dort beispielsweise:

%% Local Variables:
%% TeX-master: t
%% TeX-PDF-mode: t
%% TeX-engine: luatex
%% End:

Damit weiß auctex, dass die Datei selbst der TeX-master ist, LaTeX im PDF-Modus betrieben – also ein PDF erzeugt – und als Maschine luatex verwendet werden soll. auxtec ruft also lualatex im PDF-Modus auf.

Man kann an der Stelle emacs beispielsweise auch noch über die Codierung informieren. Normalerweise ist das aber nicht notwendig, da emacs diese selbst bereits erkennen kann und im Zweifelsfall beim Speichern nachfragt.

Um latexmk zu starten, muss man eine Konsole ("Eingabeaufforderung" unter Windows) öffnen und sich in das richtige Verzeichnis navigieren. Unter Windows kann man nun auch direkt vom Dateimanager ("Explorer") eine Konsole im aktuellen Verzeichnis öffnen. Microsoft bietet hier:

http://windows.microsoft.com/en-US/windows/downloads/windows-xp?T1=PT

unter powertoys ein Programm namens "CmdHerePowertoySetup.exe". Nach der Installation und ohne Neustart (!) ist die Konsole mit einem Rechtsklick auf einen Order im Dateimanager zu erreichen.

Ab Windows 7 soll das sogar out-of-the-box funktionieren.

Zumindest unter Nautilus (Dateimanager für Gnome; Gnome: Desktop für Linux) geht das auch ganz einfach, wenn man das gesuchte Verzeichnis vor sich hat: Rechtsklick und »Im Terminal öffnen« wählen. Das kann man auch mit einer Tastenkombination belegen (in einem Nautilusfenster oben auf »Datei« klicken, mit dem Mauspfeil über den gewünschten Eintrag gehen, nicht klicken sondern die Tastenkombination drücken, die man für diesen Eintrag benutzen will, fertig), zum Beispiel Strg+Shift+T.

Ob das unter Gnome 3 auch noch geht, weiß ich nicht.

Bei KDE kann man sowohl aus Dolphin als auch aus Konqueror Verzeichnisse per Drag&Drop in ein Konsole-Fenster werfen. Früher wurde man dann sogar noch gefragt, ob man zu diesem Verzeichnis wechseln oder den Verzeichnisname nur kopieren will. Das war aber den Anwendern wohl zu nervig, so dass inzwischen einfach der Verzeichnisname kopiert wird.

Man kann natürlich auch mit der rechten Maustaste auf ein Verzeichnis klicken und dann als Aktion »Open Terminal Here" auswählen. Die deutsche Sprachanpassung ist an dieser Stelle je nach Version/Distribution leider etwas unvollständig.

Übrigen: Drag&Drop von Dolphin (oder Konqueror) in ein offenes emacs funktioniert ebenfalls. Erkennt emacs dabei ein Verzeichnis öffnet es dieses im dired-mode. Im dired-mode kann man bekanntlich durch »M-x shell« einen Buffer mit Shell im aktuell angezeigten Verzeichnis öffnen.

cookie170 schrieb:
Ab Windows 7 soll das sogar out-of-the-box funktionieren.

AFAIK geht das schon ab Windows-Vista. Je nach Windows-Version muss man allerdings beim Rechtsklick AFAIR noch zusätzlich die Umschalt-Taste (aka Shift-Taste) gedrückt halten.

Ich nutze üblicherweise verschiedene Pakete, die beim Kompilieren viel Zeit brauchen, Libertine zum Beispiel.

Sobald ein paar Leute um einen Tisch sitzen und ich Änderungen in einen Vertrag einfügen soll, spielt das eine Rolle: das PDF wird über einen Beamer angezeigt und bis meine im Editor vorgenommenen Änderungen sichtbar werden, vergehen ein paar Sekunden zuviel.

Daher stelle ich inzwischen bei solchen Gelegenheiten ein eigenes Format her, in dem schon die gesamte Präambel berücksichtigt ist. Ich bilde mir ein, es ginge dann schneller. Der Befehl, um ein solches Format namens »Brief« aus einer Datei »Musterbrief.tex« herzustellen, lautet:

 pdflatex -ini -jobname="Brief" "&pdflatex" mylatexformat.ltx ""Musterbrief.tex""  

Man beachte die doppelten Anführungszeichen.

Als erste Zeile in meine Datei »Musterbrief.tex« schreibe ich dann:
%&Brief.

Das Verfahren hat zwei Nachteile:

1. Wenn ich die Kompilierung nicht über latexmk laufen lasse, gibt es einen Fehler und die Kompilierung bricht ab, warum auch immer. Ich bin dem nicht nachgegangen, weil der Sinn der Formatverwendung in meinem Fall gerade darin besteht, mit der Kombination von Format und latexmk schnell ein neues PDF zu erstellen.

2. Manchmal vergesse ich, das Format neu zu erstellen, nachdem ich irgendwas in der Präambel geändert habe und wundere mich, warum es nicht funktioniert...

Noch nicht ausprobiert habe ich einen Vorschlag, der hier: http://tex.stackexchange.com/a/141582 zu finden ist. Es geht darum, dass man während der laufenden Kompilierung weiter zwischen PDF und Quelle hin und her springen kann. Dass soll unter Linux funktionieren, wenn man folgenden Code in die Konfigurationsdatei von latexmk einfügt:

$preview_prefix="__preview__";
$preview_file = "$preview_prefix%R__.pdf";
$sync_file = "$preview_prefix%R__.synctex.gz";
 
$pdflatex="pdflatex -synctex=1 %O %S; cp %R.pdf $preview_file; cp %R.synctex.gz $sync_file";
$pdf_previewer = "start okular %O $preview_file > /dev/null 2>&1";

Wenn ich mal einen wirklich langen Text zu bearbeiten habe, werde ich das testen.

Um latexmk zu starten, kann man von Emacs aus eine Konsole öffnen in dem Verzeichnis, in dem die gerade geöffnete Datei gespeichert ist, genauer gesagt, dem Pfad, unter dem der aktuelle Puffer gespeichert wurde. Unter Linux ist das einfach : M-x shell RET. Aber unter Windows (in meinem Fall: Windows 7) musste ich folgende Zeilen in meine .emacs Datei schreiben:

;; cmd.exe an der Stelle der aktuellen Datei öffnen
;; http://stackoverflow.com/a/13509208/1171221
(defun start-cmd () (interactive) 
(let ((proc (start-process "cmd" nil "cmd.exe" "/C" "start" "cmd.exe")))
  (set-process-query-on-exit-flag proc nil)))

Dann öffnet sich nach M-x start-cmd RET ein Konsolenfenster mit dem Pfad des aktuellen Puffers.

Comments for "Emacs und Helferlein, Folge 1: latexmk" abonnieren