LaTeX-Dateireparatur | API für Java
So überprüfen und reparieren Sie eine LaTeX-Datei
Wenn Sie nicht sicher sind, ob es sich bei einer Textdatei um eine LaTeX-Datei handelt, und diese formatiert werden soll, können Sie die von der Aspose.TeX-API für Java angebotene LaTeX-Prüf- und Reparaturfunktion nutzen. Im folgenden Beispiel überprüfen und reparieren wir eine Beispieldatei, „invalid-latex.tex“, aus dem Aspose.TeX für Java-Beispielprojekt.
Zunächst ist es wichtig zu beachten, dass die Beispieldatei offenbar die TeX-Syntax verwendet, jedoch die für LaTeX erforderliche Struktur fehlt. Wie Sie vielleicht wissen, muss eine LaTeX-Datei eine Präambel enthalten, die mit dem Befehl \documentclass beginnt, sowie einen in der Dokumentumgebung eingeschlossenen Textkörper, insbesondere zwischen \begin{document} und \end{document}.
Schauen wir uns nun das Java-Codebeispiel an.
1// Create repair options.
2LaTeXRepairerOptions options = new LaTeXRepairerOptions();
3// Specify a file system working directory for the output.
4options.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
5// Specify a file system working directory for the required input.
6// The directory containing packages may be located anywhere.
7options.setRequiredInputDirectory(new InputFileSystemDirectory(Utils.getInputDirectory() + "packages"));
8// Specify the callback class to externally guess packages required for undefined commands or environments.
9options.setGuessPackageCallback(new PackageGuesser());
10
11// Run the repair process.
12new LaTeXRepairer(Utils.getInputDirectory() + "invalid-latex.tex", options).run();
Ähnlich wie bei einem regulären TeX-Job erstellen wir zunächst ein Objekt, das die Optionen für den Prozess enthält, den wir ausführen möchten. Die meisten dieser Optionen sind die gleichen wie bei einem regulären TeX-Job. Tatsächlich geben wir beim Aufruf der Methode setInputWorkingDirectory() den Speicherplatz an, aus dem die Eingabedateien gelesen werden sollen. In diesem Beispiel verwenden wir es jedoch nicht, da wir den vollständigen Pfad zur Haupteingabedatei im Dateisystem bereitstellen und keine benutzerdefinierten Dateien in die Haupteingabedatei aufgenommen werden sollen. Als nächstes rufen wir die Methode setOutputWorkingDirectory() auf, um den Speicherplatz anzugeben, in den die Ausgabedateien geschrieben werden sollen. Wenn die Methode setRequiredInputDirectory() aufgerufen wird, verweisen Optionen auf den Bereich, in dem Sie LaTeX-Pakete speichern können, die nicht in die Aspose.TeX-Bibliothek eingebettet sind. Schließlich wird die Methode setGuessPackageCallback() später besprochen.
Sobald die Optionen zugewiesen wurden, können wir mit der Ausführung des Prozesses fortfahren.
Wie sieht also der Prüf- und Reparaturprozess aus? Es beginnt damit, dass die API nach einem \documentclass
-Vorkommen in der Eingabedatei sucht. Wenn es nicht gefunden wird, geht die API davon aus, dass \documentclass{article}
am Anfang der Datei eingefügt werden sollte. Diese Informationen werden in der Reparaturberichtdatei (.log) aufgezeichnet.
Als nächstes beginnt der Prozess mit dem Scannen der angepassten Eingabedatei von Anfang an. Die mit dem LaTeX-Format ausgestattete TeX-Engine kann irgendwann einen Fehler auslösen, der darauf hinweist, dass \begin{document}
noch nicht gefunden wurde, obwohl dies bereits der Fall sein sollte. Auf diese Weise wird die Position, an der \begin{document}
eingefügt werden muss, definiert und im Bericht widergespiegelt.
Beim weiteren Scannen der Datei stößt die Engine möglicherweise auf undefinierte Befehle oder Umgebungen. In solchen Fällen kann die API für einige der häufigsten Befehle und Umgebungen Annahmen zu eingebetteten erforderlichen Paketen treffen (diejenigen, die die Befehle und Umgebungen definieren, die erst definiert werden, wenn diese Pakete enthalten sind). Es ist jedoch möglich, solche Annahmen extern durch eine Klasse zu treffen, die die Schnittstelle IGuessPackageCallback implementiert. Sobald Sie eine solche Klasse entwickelt haben, sollte eine Instanz davon durch Aufruf der Methode „setGuessPackageCallback()“ an den Prozess übergeben werden.
Hier ist ein einfaches Beispiel, das einfach den Befehl „\head“ dem Paket „fancyhdr“ zuordnet:
1// The callback class to externally guess packages required for undefined commands or environments.
2public static class PackageGuesser implements IGuessPackageCallback
3{
4 private Map<String, String> _map = new HashMap<String, String>();
5
6 public PackageGuesser()
7 {
8 _map.put("lhead", "fancyhdr"); // Defines the mapping between the \lhead command and the fancyhdr package.
9 }
10
11 public String guessPackage(String commandName, boolean isEnvironment)
12 {
13 if (!isEnvironment)
14 {
15 String packageName = _map.get(commandName);
16 return packageName != null ? packageName : ""; // It's better to return an empty string to avoid consequent calls for the same command name.
17 }
18
19 // Some code for environments
20 // ...
21
22 return "";
23 }
24}
Was die Beispieldatei betrifft, stößt die Engine zunächst auf den Befehl \chapter
, der nicht in der Dokumentklasse „article“, sondern in der Dokumentklasse „book“ definiert ist. Die API passt die Dokumentklasse an, sodass die endgültige Version der reparierten Datei mit \documentclass{book}
beginnt. Dann findet die Engine den oben genannten \lhead
-Befehl und stellt fest, dass \usepackage{fancyhdr}
in die Präambel eingefügt werden muss. Die Befehle \href
und \includegraphics
, die später in der Datei auftreten, veranlassen den Repairer, \usepackage{hyperref}
bzw. \usepackage{graphics}
in die Präambel einzufügen. Diese Entscheidungen werden auf Grundlage der internen Zuordnungen der API getroffen. Alle diese Reparaturen werden wie bisher in der Protokolldatei protokolliert.
Schließlich wird die Engine abnormal beendet, weil der richtige Abschluss eines LaTeX-Dokuments fehlt. Infolgedessen hängt der Reparaturbetrieb \end{document}
an das Ende der Datei an und fügt diese Informationen in den Bericht ein.
Nachdem die korrigierte Version der Originaldatei erstellt wurde, führt der Reparierer zur endgültigen Überprüfung einen TeX-Job darauf aus. In unserem Beispiel erkennt dieser Lauf keine kritischen Fehler, sodass die korrigierte Version mehr oder weniger wie erwartet gesetzt werden kann.
Hier ist der vollständige Bericht:
1Trying to repair the original file...
2--------------------------------------------------------------------------------
3\documentclass is missing in the original file. Inserted at the beginning.
4\begin{document} is missing in the original file. Inserted at line 3, pos. 0.
5The command \chapter at line 3, pos. 0 is undefined. Consider using \usepackage{package_name} in the preamble,
6 where 'package_name' is the name of the package which defines this command.
7The command \lhead at line 5, pos. 0 is undefined. \usepackage{fancyhdr} is inserted in the preamble
8 since the 'fancyhdr' package supposedly defines the command.
9The command \href at line 8, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
10 since the 'hyperref' package supposedly defines the command.
11The command \href at line 17, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
12 since the 'hyperref' package supposedly defines the command.
13The command \href at line 20, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
14 since the 'hyperref' package supposedly defines the command.
15The command \href at line 27, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
16 since the 'hyperref' package supposedly defines the command.
17The command \href at line 32, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
18 since the 'hyperref' package supposedly defines the command.
19The command \includegraphics at line 54, pos. 2 is undefined. \usepackage{graphicx} is inserted in the preamble
20 since the 'graphicx' package supposedly defines the command.
21The command \href at line 67, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
22 since the 'hyperref' package supposedly defines the command.
23The command \href at line 95, pos. 57 is undefined. \usepackage{hyperref} is inserted in the preamble
24 since the 'hyperref' package supposedly defines the command.
25The command \href at line 96, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
26 since the 'hyperref' package supposedly defines the command.
27The command \href at line 98, pos. 100 is undefined. \usepackage{hyperref} is inserted in the preamble
28 since the 'hyperref' package supposedly defines the command.
29\end{document} is missing in the original file. Inserted at the end.
30
31Checking the repaired file...
32--------------------------------------------------------------------------------
33There are no critical errors in the fixed file.
Sie können sich auch unsere kostenlose Web-App AI LaTeX Repairer ansehen, die auf der in Aspose.TeX for .NET API implementierten Funktion basiert und eine erweiterte Version beinhaltet Implementierung der Schnittstelle „IGuessPackageCallback“.