LaTeX-Dateireparatur | Aspose.TeX 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}.

Setzen Sie inputFile auf den vollständigen Pfad zu invalid-latex.tex, outputDirectory auf einen vorhandenen Ausgabeordner und packagesDirectory auf einen Ordner mit fancyhdr.sty und dessen Abhängigkeiten. Speichern Sie den unten gezeigten Callback mit seinem Import als PackageGuesser.java und erstellen Sie vor dem Reparaturaufruf PackageGuesser packageGuesser = new PackageGuesser(). Importieren Sie die verwendeten Aspose.TeX-Klassen und behandeln oder deklarieren Sie Ausnahmen. Wenden Sie eine Lizenz gemäß der Lizenzanleitung an. Die Ein- und Ausgabeverzeichnisse bleiben bis zum Ende der Reparatur geöffnet und werden anschließend geschlossen.

 1// Repair the LaTeX structure and infer packages for undefined commands.
 2// inputFile is the full invalid LaTeX path; packagesDirectory contains fancyhdr.sty.
 3// outputDirectory is an existing output folder; packageGuesser is a PackageGuesser instance.
 4LaTeXRepairerOptions options = new LaTeXRepairerOptions();
 5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 6InputFileSystemDirectory packages = new InputFileSystemDirectory(packagesDirectory);
 7options.setOutputWorkingDirectory(output);
 8options.setRequiredInputDirectory(packages);
 9options.setGuessPackageCallback(packageGuesser);
10TeXJobResult result;
11try {
12    result = new LaTeXRepairer(inputFile, options).run();
13} finally {
14    output.close();
15    packages.close();
16}

Ä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.

Dieses Beispiel ordnet den Befehl \lhead dem Paket fancyhdr zu. Der Callback erhält den Befehlsnamen ohne führenden Backslash; für unbekannte Befehle und Umgebungen wird eine leere Zeichenfolge zurückgegeben:

 1import com.aspose.tex.features.IGuessPackageCallback;
 2
 3// Save as PackageGuesser.java and assign an instance with setGuessPackageCallback().
 4public class PackageGuesser implements IGuessPackageCallback {
 5    @Override
 6    public String guessPackage(String commandName, boolean isEnvironment) {
 7        // The command name has no leading backslash.
 8        if (!isEnvironment && "lhead".equals(commandName)) {
 9            return "fancyhdr";
10        }
11        // Empty means that this callback cannot identify a package.
12        return "";
13    }
14}

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{graphicx} 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.

Nach der Reparatur führt der Repairer einen TeX-Auftrag zur abschließenden Prüfung aus. In diesem Beispiel meldet der abschließende Bericht keine kritischen Fehler. Der Rückgabewert von run() kann sich auf den ursprünglichen Durchlauf beziehen; prüfen Sie daher den Reparaturbericht und die korrigierte .tex-Datei. Die Reparatur stellt keine fehlenden externen Ressourcen bereit. Die Beispieldatei verweist etwa auf Figures/uet_logo.pdf, das für einen vollständigen Satz separat bereitgestellt werden muss.

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“.