Reparación de archivos LaTeX | .NETO

Cómo comprobar y reparar un archivo LaTeX

Si tiene un archivo de texto que cree que es un archivo LaTeX y desea componerlo, pero no está seguro de si realmente es un archivo LaTeX (tal vez sea nuevo en el mundo LaTeX), puede intentar usar la función de verificación. y reparación de la función LaTeX proporcionada por la API Aspose.TeX para .NET. En el siguiente ejemplo, comprobaremos y repararemos un archivo de muestra, invalid-latex.tex, del proyecto de ejemplo Aspose.TeX para .NET.

En primer lugar, cabe mencionar que aunque el archivo de muestra parece utilizar la sintaxis TeX, no tiene la estructura requerida por LaTeX. Como sabrás, un archivo LaTeX debe tener un preámbulo que comience con el comando \documentclass y un cuerpo dentro del entorno document, es decir, entre \begin{document} y \end{document}.

Veamos ahora el ejemplo de código 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();

Al igual que con un trabajo TeX normal, primero creamos un objeto que contiene las opciones del proceso que estamos a punto de ejecutar. La mayoría de ellas son las mismas que las opciones de un trabajo TeX normal. De hecho, InputWorkingDirectory es el espacio desde el cual se deben leer los archivos de entrada. No lo usamos aquí porque proporcionamos la ruta completa al archivo de entrada principal en el sistema de archivos y no se supone que se incluyan archivos personalizados en el archivo de entrada principal. Entonces, OutputWorkingDirectory es el espacio donde se deben escribir los archivos de salida. RequiredInputDirectory, si está asignado, apunta al espacio donde puede almacenar paquetes LaTeX que no están integrados en la biblioteca Aspose.TeX. La propiedad GuessPackageCallback se analizará más adelante.

Después de asignar las opciones, ¡simplemente ejecutamos el proceso!

Entonces, ¿cómo es el proceso de revisión y reparación? En primer lugar, la API busca en el archivo de entrada una aparición \documentclass. Si falla, asume que \documentclass{article} debe insertarse al principio del archivo. Este hecho se refleja en el archivo del informe de reparación (.log).

Luego, comienza a escanear el archivo de entrada ajustado desde el principio. El motor TeX cargado con el formato LaTeX puede generar un error en algún momento, indicando que no se ha encontrado ningún \begin{document} hasta el momento, aunque ya debería haber ocurrido. Así, la posición en la que se debe insertar \begin{document} queda definida y reflejada en el informe.

A medida que el motor analiza más el archivo, puede encontrar comandos o entornos no definidos. La API puede hacer suposiciones sobre paquetes incorporados requeridos (aquellos que definen los comandos y entornos que no se definen hasta que se incluyen estos paquetes) para algunos de los comandos y entornos más comunes. Sin embargo, existe una manera de hacer tales suposiciones externamente implementando la interfaz IGuessPackageCallback. Se debe asignar una instancia de dicha clase a la opción “GuessPackageCallback”.

Aquí hay un ejemplo muy simple que simplemente asigna el comando \head al paquete 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}

En cuanto al archivo de muestra, el motor encuentra primero el comando \chapter, que no está definido en la clase de documento article pero sí en la clase de documento book. La API ajusta la clase de documento para que la versión final del archivo arreglado comience con \documentclass{book}. Luego, el motor encuentra el comando \lhead antes mencionado y decide que \usepackage{fancyhdr} debe insertarse en el preámbulo. Los comandos \href e \includegraphics que aparecen más adelante hacen que el reparador inserte \usepackage{hyperref} y \usepackage{graphics} en el preámbulo, respectivamente. Estas decisiones se basan en las asignaciones internas de la API. Nuevamente, todas estas correcciones se registran en el archivo del informe.

Finalmente, el motor finaliza de forma anormal porque falta el final normal de un documento LaTeX. Esto hace que el reparador agregue \end{document} al final del archivo y refleje este hecho en el informe.

Una vez que se crea la versión reparada del archivo original, el Reparador ejecuta el trabajo TeX en él para la verificación final. En nuestro ejemplo, esta ejecución no encuentra ningún error crítico, por lo que la versión corregida puede estar escrita más o menos como se esperaba.

Aquí está el informe completo:

 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.

También puede consultar nuestra aplicación web gratuita AI LaTeX Repairer, que se basa en la función implementada dentro de Aspose.TeX para .NET API e implica una versión más avanzada. implementación de la interfaz IGuessPackageCallback.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.