
Für Programmiersprachen wie C
, C++
, C#
, Java
usw. gibt es immer eine Art statischer Analysatoren, Tools, die den Quellcode auf nicht erreichbaren Code, ungenutzte Variablen, Speicherlecks und andere Dinge überprüfen, die für die Kompilierung nicht relevant sind (und die die Compiler daher überhaupt nicht melden oder bemerken).
Gibt es ähnliche Tools für LaTeX?
Natürlich gibt es einige Pakete, wie onlyamsmath
oder nag
die nach veralteten Makros oder Paketen suchen und refcheck
nach nicht verwendeten Labels. Aber gibt es Pakete und/oder Tools, die nach veralteten Makros oder Paketen suchen oder darauf hinweisen?
- Unerreichbarer Code:
\if\else\fi
Konstruktionen, bei denen ein oder mehrere Pfade niemals erreicht werden können? - ineffiziente Schleifen, wie
\foreach
sie vereinfacht werden könnten? - unbenutzte Makrodefinitionen?
- schlagen Sie gegebenenfalls die Verwendung von
\newcommand*
anstelle von\newcommand
vor? - Verdächtiger Mangel an möglichen Klammern oder Leerzeichen? Wie:
a^b c
- klara^{bc}
- klara^bc
- verdächtig: Rendert wie 1., aber vielleicht war 2. beabsichtigt?
- Verdächtige Leerzeilen (Absätze)? Zum Beispiel zwischen Text und Gleichung?
- verdächtig oder vermisstKommentare am Ende der Zeile?
- was fällt Ihnen sonst noch ein, was sehr oft falsch oder ineffizient oder für das menschliche Auge unklar ist?
Antwort1
Die kurze Antwort lautet: Das ist nicht möglich.
Es gibt einige Tools, die bestimmte Dinge tun, aber sie können das Latex-Dokument nicht wirklich analysieren. Daher sollten alle von ihnen gegebenen Ratschläge nur als Hinweise verstanden werden und könnten falsch sein.
Der große Unterschied zwischen LaTeX und den von Ihnen genannten Sprachen wie C und Java besteht darin, dass die Syntax von LaTeX nicht analysiert werden kann. Selbst die grundlegende lexikalische Analyse und Tokenisierung der Eingabe hängt vom Laufzeitverhalten ab.
\section[abc}
Es scheint sich um einen Syntaxfehler zu handeln, den man bei einer statischen Analyse erkennen würde, aber das Dokument könnte
\documentclass{article}
\ifodd\time\catcode`[1\fi
\begin{document}
\section[abc}
aa
\end{document}
was bedeutet, dass es ein gültiges Dokument ist oder nicht, je nachdem, wie viele Minuten seit Mitternacht vergangen sind. Dies ist offensichtlich ein Extremfall, aber nicht so extrem, wie Sie vielleicht denken. Viele Pakete machen ähnliche Dinge, die die Analyse des Dokuments verändern, denken Sie zum Beispiel an Babel-Kurzschriften. Die Tatsache, dass Babel geladen wurde, kann statisch durch Überprüfen der Präambel erkannt werden, aber um zu bestimmen, welche Sprache zu einem bestimmten Zeitpunkt gültig ist, muss wirklich ein vollständiger LaTeX-Interpreter ausgeführt werden.
Selbst wenn es möglich wäre, würde ich in Frage stellen, ob einige Ihrer Artikel wirklich markiert werden sollten.
- Unerreichbarer Code:
\if\else\fi
Konstruktionen, bei denen ein oder mehrere Pfade niemals erreicht werden können?
Die Schwierigkeit besteht hier darin, zu bestimmen, welche Token tatsächlich Tests sind. Meistens sieht man keine Tex-Grundelemente wie \if
But-Token, die über definiert sind \newif
, die für einen Prüfer schwerer zu erkennen sind. Es könnte vielleicht angenommen werden, dass jedes Token, das mit beginnt, \if..
in diesem Sinne ein if-Token ist, aber beispielsweise \ifthenelse
beginnt LaTeX mit \if....
, hat aber eine ganz andere Syntax.
- ineffiziente Schleifen, wie
\foreach
sie vereinfacht werden könnten?
\foreach
ist einfach ein Makro, sodass fast per Definition jede bestimmte Verwendung davon durch die Erweiterung des Makros vereinfacht werden kann. Aber das wird möglicherweise nicht als Vereinfachung angesehen ...
- unbenutzte Makrodefinitionen?
LaTeX und alle seine Pakete sind Makrodefinitionen und die meisten Dokumente verwenden die meisten der definierten Befehle nicht, sodass jedes Dokument typischerweise Tausende von ungenutzten Makros enthält.
- schlagen Sie gegebenenfalls die Verwendung von
\newcommand*
anstelle von\newcommand
vor?
Ich bin mir nicht sicher, wie das gemacht werden könnte, es sei denn, Sie zeichnen jede Verwendung des Makros in einem bestimmten Dokument auf und stellen fest, dass es in diesem Fall nie verwendet wird.
- Verdächtiger Mangel an möglichen Klammern oder Leerzeichen? Wie:
a^b c
- klara^{bc}
- klara^bc
- verdächtig: Rendert wie 1., aber vielleicht war 2. beabsichtigt?
Ich würde dieser Prüfung nicht zustimmen. 2. ist die Standard-Latex-Syntax. Wenn Sie sich entscheiden, 1. zuzulassen, sollten Sie auch 3 ohne Kommentar zulassen. Es ist ein zentraler Teil des Designs der TeX-Mathematikmodus-Syntax, dass Leerzeichen außer beim Beenden von Befehlsnamen keine Rolle spielen.
- Verdächtige Leerzeilen (Absätze)? Zum Beispiel zwischen Text und Gleichung?
TeX bemüht sich, zu unterscheiden, ob der Text nach einer Anzeige ein neuer Absatz ist oder nicht, und LaTeX emuliert dieses Verhalten für alle seine Listenumgebungen. Sofern der statische Analysator die Sätze nicht interpretiert und vorschlägt, dass es sich nicht um den Anfang eines Absatzes handeln sollte, sollte er keine Leerzeilen kommentieren.
- verdächtige oder fehlende [Kommentare am Zeilenende][1]?
Ja, solange es den Beginn der Latex3-Syntax oder ähnlicher Pakete erkennen kann, die die Regeln und Bedeutungen ändern, %
ist dies nicht notwendig.
- was fällt Ihnen sonst noch ein, was sehr oft falsch oder ineffizient oder für das menschliche Auge unklar ist?
Es ist eine gute Idee, das Dokument von einem Menschen Korrektur lesen zu lassen. Das menschliche Auge kann das immer noch besser als das einer Maschine :-)
Antwort2
Obwohl die akzeptierte Antwort eine Reihe guter Punkte enthält, gibt es Software zur Durchführung statischer LaTeX-Analysen. Wie erwartet sind diese bei weitem nicht so umfassend wie Linter für eine Sprache wie Python.
Der bemerkenswerteste dieser Linter istChkTeXEs ist auch aufCTANund ist Teil vonTeX Live(seit2010).