Die meisten Befehle in TeX Live setzen kein Dokument. Sie lesen eines. texdef zeigt, wie ein Befehl tatsächlich definiert ist; chktex und lacheck benennen die Eigenarten der Quelldatei; texfot kürzt ein tausendzeiliges Log auf eine Handvoll Zeilen; texcount zählt Wörter; texloganalyser gräbt genau die Zeilen aus einer .log heraus, die gebraucht werden. Zeit kostet bei der Arbeit mit LaTeX nicht der Satz, sondern die Suche danach, warum etwas nicht funktioniert hat – diese Ecke der Distribution lohnt die Stunde, die es dauert, sie kennenzulernen. Das Öffnen eines Pakethandbuchs mit texdoc gehört auf eine andere Seite; hier steht alles Übrige, am Ende dazu Ghostscript für Eingriffe ins fertige PDF.
texdef – wie ist dieser Befehl eigentlich definiert
Wenn Umdefinitionen kollidieren, ist der schnellste Weg zur derzeit gültigen Definition, die Engine direkt zu fragen. Ein latexdef \section liefert \long macro:->\@startsection {section}{1}{\z@ }{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont \Large \bfseries } – den tatsächlichen Wert, und zwar in der vorliegenden Installation. Soll ein Paket geladen sein, kommt -p hinzu: latexdef -p amsmath \tfrac gibt \genfrac {}{}{}1 zurück, und man sieht sofort, dass \tfrac nur eine dünne Hülle um \genfrac ist. Bei einem nicht existierenden Namen lautet die Antwort knapp undefined. Autor ist Martin Scharrer; in TeX Live 2024 steckt version 1.9 vom 2020/09/27.
Hier taucht derselbe Kniff auf wie bei dvipdfmx. latexdef ist ein Symlink auf texdef, und das Programm entscheidet anhand des Aufrufnamens, welches Format es lädt: texdef bedeutet plain TeX, latexdef bedeutet LaTeX. Deshalb antwortet ein bloßes texdef \LaTeX mit undefined, und das ist kein Fehler. Dasselbe lässt sich mit -t latex oder -t lualatex ausdrücklich sagen. Noch nützlicher sind die Suchoptionen. -F nennt den Ort der Definition: latexdef -p booktabs -F \toprule antwortet \toprule first defined in "/usr/local/texlive/2024/texmf-dist/tex/latex/booktabs/booktabs.sty". Und -l listet die Anwenderbefehle eines Pakets – praktisch, wenn man vor dem Handbuch erst einmal sehen will, was es überhaupt gibt.
latexdef \section # the definition in force right now
latexdef -p amsmath \tfrac # with a package loaded
latexdef -p booktabs -F \toprule # which file defined it
latexdef -p geometry -l # the user-level commands a package adds
latexdef -c beamer \frametitle # inside a different document classchktex und lacheck – zwei Linter, die auf Verschiedenes schauen
Beide fangen die Sorte Problem ab, bei der das Dokument zwar übersetzt, die Seite aber falsch aussieht – mit unterschiedlichen Schwerpunkten. chktex achtet auf typografische Gewohnheiten. Dieselbe Datei ergibt nummerierte Beanstandungen wie Warning 26 in lint.tex line 4: You ought to remove spaces in front of punctuation. und Warning 44 in lint.tex line 5: User Regex: 1:Capitalize before references., jeweils mit einem ^ unter der beanstandeten Spalte. Nummeriert heißt abschaltbar: Stört Regel 18, die ein gerades doppeltes Anführungszeichen durch echte TeX-Anführungszeichen ersetzt sehen will, hilft chktex -n18. lacheck achtet auf strukturelle Entsprechung. Passen Umgebungen, geschweifte Klammern oder Mathematikbegrenzer nicht zusammen, zeigt es beide Enden mit Zeilennummern, paarweise als <- und ->. Bei einer absichtlich kaputten Datei erschien "broken.tex", line 5: <- unmatched "\end{enumerate}" und unmittelbar danach "broken.tex", line 3: -> unmatched "\begin{itemize}" – früher als die Engine und in weit lesbarerer Form.
Für den Einsatz in CI ist ein Unterschied entscheidend. lacheck liefert Exit-Code 0, ganz gleich was es findet. Die kaputte Datei oben – zwei nicht zusammenpassende Umgebungen und eine ungeschlossene Formel – ergab trotzdem 0. Damit lässt sich ein Build nicht absichern; man muss die Standardausgabe auffangen und selbst urteilen. chktex -q lieferte dagegen bei jedem Lauf mit Warnungen 2 und bei einer sauberen Datei 0. Darauf kann man ein Tor setzen. Noch ein Hinweis: Das chktex dieses macOS-Builds von TeX Live 2024 ist mit erweiterten POSIX-Regulärausdrücken übersetzt, und eine seiner Standardregeln nutzt einen Perl-artigen Lookahead – jeder Lauf beginnt daher mit einer Zeile, die mit chktex: WARNING -- Compilation of regular expression anfängt. Schaden richtet das nicht an, doch wer es im CI-Log ausblendet, hat es ruhiger.
chktex -q paper.tex # exit 2 when it prints warnings, 0 when clean
chktex -q -n18 -n26 paper.tex # mute the quotation-mark and punctuation rules
lacheck paper.tex # unmatched groups, shown as a <- and -> pair
lacheck paper.tex | tee lacheck.out # its exit code is always 0, so read thisUm den Charakter dieser Werkzeuge zu verstehen, lohnt der Abschnitt BUGS in der Manpage von lacheck. Er räumt ein, dass das Programm von fortgeschrittenen Makros verwirrt und von einfachen getäuscht wird, dass es TeX nicht mag und keine Möglichkeit bietet, einzelne Warnungen abzuschalten – und beschreibt sich selbst als „at best a crude approximation“. Vielleicht ist es diese Ehrlichkeit, warum ein kleines Werkzeug, das Kresten Krab Thorup Anfang der 1990er Jahre schrieb und Per Abrahamsen überarbeitete, bis heute in TeX Live steckt. Auch chktex startet weiterhin mit dem Banner Copyright 1995-96 Jens T. Berger Thielemann. Fast dreißig Jahre alte Werkzeuge, die zu einem heute geschriebenen Manuskript noch nützliche Bemerkungen machen: Auch das ist das Tempo der LaTeX-Welt.
texfot – aus 24 Zeilen Log werden 4
Der Grund, warum niemand die Ausgabe von TeX liest, ist schlicht: Es ist zu viel. texfot startet die Engine stellvertretend und lässt nur die beachtenswerten Zeilen durch. Hier rollten bei einem einseitigen Dokument mit lipsum unter blankem pdflatex 24 Zeilen vorbei; derselbe Lauf unter texfot pdflatex ergab 4. Übrig blieben die Versionszeile der Engine, Overfull \hbox (122.18651pt too wide) detected at line 4 sowie Output written on over.pdf (1 page, 19010 bytes). Verworfen wird dabei nichts: Die vollständige, ungefilterte Ausgabe wird in eine temporäre Datei getee-t, bei Bedarf also nachlesbar – --tee= ändert das Ziel, --tee=/dev/null schaltet es ab. Der Exit-Status wird unverändert von der Engine durchgereicht, ein Einbau in latexmk oder CI zerstört also nichts: Bei einem fehlerhaften Dokument kam 1 zurück, genau wie bei nacktem pdflatex. Autor ist Karl Berry.
texfot pdflatex paper.tex
# texfot: invoking: pdflatex paper.tex
# This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024)
# Overfull \hbox (122.18651pt too wide) detected at line 4
# Output written on paper.pdf (1 page, 19010 bytes).
texfot --tee=/dev/null lualatex paper.tex # do not keep the full copy
# .latexmkrc: wrap the engine
$pdflatex = 'texfot pdflatex %O %S';texcount und texloganalyser – Wörter zählen, das Log durchgraben
Wenn eine Einreichung „höchstens 8.000 Wörter Fließtext“ verlangt, hilft wc -w nicht: Es zählt \usepackage und jeden Makronamen mit. texcount – TeXcount 3.1.1, vom Oktober 2018 – versteht die LaTeX-Syntax und zählt entsprechend; es weist Fließtext, Überschriften und Bildunterschriften getrennt aus, bis hin zur Zahl der Formeln. Mit -brief schrumpft alles auf eine Zeile wie 2+0+0 (0/0/0/0) File: over.tex. Das zweite Werkzeug, texloganalyser (Thomas van Oudenhove, version 0.11, BSD-Lizenz), gräbt sich durch eine bereits geschriebene .log: -o holt nur die Overfull-Boxen heraus, -r nur die Querverweiswarnungen, -i die geladenen Bilder, -s die verwendeten .sty- und .cls-Dateien. Während texfot während des Laufs filtert, gräbt dieses im fertigen Log; die beiden überschneiden sich nicht, beide bereitzuhalten kostet nichts.
texcount -brief paper.tex # words in text + headers + captions
texcount -inc -sum paper.tex # follow \input and \include, one total
texloganalyser -o paper.log # only the overfull boxes
texloganalyser -r paper.log # only the reference warnings
texloganalyser -s paper.log # which .sty and .cls were actually loadedGhostscript – PDFs zusammenführen, und wann „Komprimieren“ nichts bringt
gs ist der PostScript- und PDF-Interpreter und steckt zugleich unter ps2pdf. Mit -sDEVICE=pdfwrite schreibt es PDF, womit sich Umwandlung aus PostScript, Zusammenführen mehrerer PDFs und Herauslösen von Seiten in je einer Zeile erledigen lassen. Am einfachsten ist das Zusammenführen: die Eingaben einfach der Reihe nach aufzählen. Hier wurden aus einer PDF von 7.940 Bytes und einer von 6.865 Bytes ein einziger Band von 12.543 Bytes. Zu beachten: gs gehört nicht zu TeX Live; es ist das Ghostscript, das MacTeX und ähnliche Installer gesondert mitbringen, hier in der Version 10.03.0.
gs -q -sDEVICE=pdfwrite -dNOPAUSE -dBATCH \
-sOutputFile=merged.pdf front.pdf body.pdf
gs -q -sDEVICE=pdfwrite -dNOPAUSE -dBATCH \
-dFirstPage=3 -dLastPage=8 -sOutputFile=extract.pdf paper.pdf
gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH \
-sOutputFile=small.pdf big.pdfEine weit verbreitete Behauptung gehört hier richtiggestellt. -dPDFSETTINGS ist kein Schalter, der ein PDF komprimiert. Diese Voreinstellungen regeln vor allem die Politik beim Neuabtasten von Bildern, wobei die Auflösungsuntergrenze von /screen über /ebook und /printer bis /prepress steigt. Ein Dokument ohne Rasterbilder hat folglich nichts zu schrumpfen. Im Test hier kam eine reine Text-PDF von 6.865 Bytes mit /screen auf 7.310, mit /ebook auf 7.309, mit /prepress auf 7.302 und mit /printer sogar auf 9.869 Bytes – alle vier größer als das Original, weil nur der Aufwand des Neuaufbaus übrig bleibt. Die Option verdient ihr Geld bei Dokumenten voller Fotos und Scans. Und in jedem Fall gilt: vorher und nachher mit dem Auge prüfen, ob eingebettete Schriften, Links, Lesezeichen und Seitengröße erhalten sind. pdfwrite baut das PDF neu auf, und dabei können unsichtbare Informationen verloren gehen.
Welcher Befehl beantwortet welche Frage
| Befehl | Die Frage, die er beantwortet |
|---|---|
latexdef NAME | Wie ist dieser Befehl gerade definiert – und mit -F, welche Datei ihn definiert hat |
chktex -q | Hat die Quelle typografische Unarten – und liefert einen Status, auf den sich CI stützen kann |
lacheck | Passen Umgebungen und Klammern zusammen – der Exit-Code ist aber stets 0 |
texfot ENGINE FILE | Welche wenigen Zeilen aus dem Log dieses Laufs sind wirklich wichtig |
texcount -brief | Wie viele Wörter Fließtext gibt es, ohne Makros und \usepackage mitzuzählen |
texloganalyser -o | Nur die Overfull-Boxen oder Referenzwarnungen aus einer vorhandenen .log herausholen |
gs -sDEVICE=pdfwrite | PDFs zusammenführen, Seiten herauslösen oder eine bildlastige PDF verkleinern |