Réparation de fichiers LaTeX | Java

Comment vérifier et réparer un fichier LaTeX

Si vous ne savez pas si un fichier texte est un fichier LaTeX et souhaitez qu’il soit composé, vous pouvez utiliser la fonctionnalité de vérification et de réparation LaTeX offerte par l’API Aspose.TeX pour Java. Dans l’exemple ci-dessous, nous allons vérifier et réparer un exemple de fichier, « invalid-latex.tex », de l’exemple de projet Aspose.TeX pour Java.

Pour commencer, il est important de noter que l’exemple de fichier semble utiliser la syntaxe TeX mais n’a pas la structure requise par LaTeX. Comme vous le savez peut-être, un fichier LaTeX doit inclure un préambule commençant par la commande \documentclass, ainsi qu’un corps inclus dans l’environnement du document, spécifiquement entre \begin{document} et \end{document}.

Examinons maintenant l’exemple de code Java.

 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();

Semblable à un travail TeX classique, nous commençons par créer un objet contenant les options du processus que nous sommes sur le point d’exécuter. La plupart de ces options sont les mêmes que celles d’un travail TeX classique. En effet, en appelant la méthode setInputWorkingDirectory(), on précise l’espace à partir duquel les fichiers d’entrée doivent être lus. Cependant, dans cet exemple, nous ne l’utilisons pas ici car nous fournissons le chemin complet du fichier d’entrée principal dans le système de fichiers et aucun fichier personnalisé ne doit être inclus dans le fichier d’entrée principal. Ensuite, nous appelons la méthode setOutputWorkingDirectory() pour spécifier l’espace où les fichiers de sortie doivent être écrits. Si elle est appelée, la méthode setRequiredInputDirectory() fait pointer les options vers l’espace où vous pouvez stocker les packages LaTeX qui ne sont pas intégrés dans la bibliothèque Aspose.TeX. Enfin, la méthode setGuessPackageCallback() sera abordée plus tard.

Une fois les options attribuées, nous pouvons procéder à l’exécution du processus.

Alors, à quoi ressemble le processus de vérification et de réparation ? Cela commence par la recherche par l’API d’une occurrence \documentclass dans le fichier d’entrée. S’il n’est pas trouvé, l’API suppose que \documentclass{article} doit être inséré au début du fichier. Ces informations sont enregistrées dans le fichier de rapport de réparation (.log).

Ensuite, le processus commence à analyser le fichier d’entrée ajusté depuis le début. Le moteur TeX équipé du format LaTeX peut, à un moment donné, générer une erreur indiquant que \begin{document} n’a pas encore été trouvé alors qu’il aurait déjà dû l’être. De cette façon, la position à laquelle \begin{document} doit être inséré est définie et reflétée dans le rapport.

Lors de l’analyse ultérieure du fichier, le moteur peut rencontrer des commandes ou des environnements non définis. Dans de tels cas, l’API peut faire des hypothèses sur les packages requis intégrés (ceux qui définissent les commandes et les environnements qui ne sont pas définis tant que ces packages ne sont pas inclus) pour certaines des commandes et environnements les plus courants. Cependant, il est possible de faire de telles hypothèses en externe par une classe qui implémente l’interface IGuessPackageCallback. Une fois que vous avez développé une telle classe, une instance de celle-ci doit être transmise au processus en appelant la méthode setGuessPackageCallback().

Voici un exemple de base qui mappe simplement la commande \head au package fancyhdr :

 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}

Comme pour le fichier exemple, le moteur rencontre d’abord la commande \chapter, qui n’est pas définie dans la classe de document article mais est définie dans la classe de document book. L’API ajuste la classe du document afin que la version finale du fichier réparé commence par \documentclass{book}. Ensuite, le moteur trouve la commande \lhead susmentionnée et détermine que \usepackage{fancyhdr} doit être inséré dans le préambule. Les commandes \href et \includegraphics qui apparaissent plus tard dans le fichier obligent le réparateur à insérer \usepackage{hyperref} et \usepackage{graphics} dans le préambule, respectivement. Ces décisions sont prises sur la base des mappages internes de l’API. Comme auparavant, toutes ces réparations sont enregistrées dans le fichier de rapport.

Enfin, le moteur se termine anormalement car la conclusion appropriée d’un document LaTeX manque. En conséquence, le réparateur ajoute \end{document} à la fin du fichier et inclut ces informations dans le rapport.

Après avoir créé la version corrigée du fichier original, le réparateur exécute un travail TeX dessus pour la vérification finale. Dans notre exemple, cette exécution ne détecte aucune erreur critique, la version corrigée peut donc être composée plus ou moins comme prévu.

Voici le rapport complet :

 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.

Vous pouvez également consulter notre application Web gratuite AI LaTeX Repairer, qui est construite sur la base de la fonctionnalité implémentée dans Aspose.TeX for .NET API et implique une fonctionnalité plus avancée. implémentation de l’interface IGuessPackageCallback.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.