Réparation de fichiers LaTeX | .NET

Comment vérifier et réparer un fichier LaTeX

Si vous avez un fichier texte que vous pensez être un fichier LaTeX et que vous souhaitez qu’il soit composé, mais que vous n’êtes pas sûr qu’il s’agisse réellement d’un fichier LaTeX (vous êtes peut-être nouveau dans le monde LaTeX), vous pouvez essayer d’utiliser la vérification et réparation de la fonctionnalité LaTeX fournie par l’API Aspose.TeX pour .NET. Dans l’exemple suivant, nous allons vérifier et réparer un exemple de fichier, « invalid-latex.tex », de l’exemple de projet Aspose.TeX pour .NET.

Tout d’abord, il convient de mentionner que bien que l’exemple de fichier semble utiliser la syntaxe TeX, il n’a pas la structure requise par LaTeX. Comme vous le savez peut-être, un fichier LaTeX doit avoir un préambule qui commence par la commande \documentclass et un corps dans l’environnement document, c’est-à-dire entre \begin{document} et \end{document}.

Examinons maintenant l’exemple de code C#.

 1// Create repair options.
 2LaTeXRepairerOptions options = new LaTeXRepairerOptions();
 3// Specify a file system working directory for the output.
 4options.OutputWorkingDirectory = new OutputFileSystemDirectory(RunExamples.OutputDirectory);
 5// Specify a file system working directory for the required input.
 6// The directory containing packages may be located anywhere.
 7options.RequiredInputDirectory = new InputFileSystemDirectory(Path.Combine(RunExamples.InputDirectory, "packages"));
 8// Specify the callback class to externally guess packages required for undefined commands or environments.
 9options.GuessPackageCallback = new PackageGuesser();
10// Run the repair process.
11new Features.LaTeXRepairer(Path.Combine(RunExamples.InputDirectory, "invalid-latex.tex"), options).Run();

Comme pour un travail TeX classique, nous créons d’abord un objet qui contient les options du processus que nous sommes sur le point d’exécuter. La plupart d’entre elles sont identiques aux options d’un travail TeX classique. En effet, le InputWorkingDirectory est l’espace à partir duquel les fichiers d’entrée doivent être lus. 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é n’est censé être inclus dans le fichier d’entrée principal. Ensuite, OutputWorkingDirectory est l’espace où les fichiers de sortie doivent être écrits. RequiredInputDirectory, s’il est attribué, pointe vers l’espace où vous pouvez stocker les packages LaTeX qui ne sont pas intégrés dans la bibliothèque Aspose.TeX. La propriété GuessPackageCallback sera abordée plus tard.

Après avoir attribué les options, nous lançons simplement le processus !

Alors, à quoi ressemble le processus de vérification et de réparation ? Tout d’abord, l’API recherche dans le fichier d’entrée une occurrence \documentclass. S’il échoue, il suppose que \documentclass{article} doit être inséré au tout début du fichier. Ce fait est reflété dans le fichier de rapport de réparation (.log).

Ensuite, il commence à analyser le fichier d’entrée ajusté depuis le tout début. Le moteur TeX chargé du format LaTeX peut générer une erreur à un moment donné, signalant qu’aucun \begin{document} n’a été trouvé jusqu’à présent, alors que cela aurait déjà dû se produire. Ainsi, la position à laquelle \begin{document} doit être inséré est définie et reflétée dans le rapport.

Au fur et à mesure que le moteur analyse le fichier, il peut trouver des commandes ou des environnements non définis. 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 existe un moyen de faire de telles hypothèses en externe en implémentant l’interface IGuessPackageCallback. Une instance d’une telle classe doit être affectée à l’option GuessPackageCallback.

Voici un exemple très simple qui mappe simplement la commande \head au package fancyhdr :

 1public class PackageGuesser : IGuessPackageCallback
 2{
 3    private Dictionary<string, string> _map = new Dictionary<string, string>();
 4
 5    public PackageGuesser()
 6    {
 7        _map.Add("lhead", "fancyhdr"); // Defines the mapping between the \lhead command and the fancyhdr package.
 8    }
 9
10    public string GuessPackage(string commandName, bool isEnvironment)
11    {
12        string packageName;
13        if (!isEnvironment)
14        {
15            _map.TryGetValue(commandName, out packageName);
16            return 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 corrigé commence par \documentclass{book}. Ensuite, le moteur trouve la commande \lhead susmentionnée et décide que \usepackage{fancyhdr} doit être inséré dans le préambule. Les commandes \href et \includegraphics qui se produisent plus tard obligent le réparateur à insérer \usepackage{hyperref} et \usepackage{graphics} dans le préambule, respectivement. Ces décisions sont basées sur les mappages internes de l’API. Encore une fois, tous ces correctifs sont enregistrés dans le fichier de rapport.

Enfin, le moteur se termine anormalement puisque la fin normale d’un document LaTeX est manquante. Cela oblige le réparateur à ajouter \end{document} à la fin du fichier et à refléter ce fait dans le rapport.

Une fois la version corrigée du fichier d’origine créée, le réparateur exécute le travail TeX dessus pour la vérification finale. Dans notre exemple, cette exécution ne trouve 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.

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.