Paquetes LaTeX externos | .NET

Paquetes externos de LaTeX

La biblioteca Aspose.TeX incluye varios paquetes comunes de LaTeX. Por lo tanto, no tiene que preocuparse por cómo proporcionar estos paquetes al motor TeX de la biblioteca. Pero a veces (o con bastante frecuencia) su archivo LaTeX puede requerir un paquete más allá del “paquete” de paquetes admitido “de forma nativa”. Si este es el caso, puede intentar proporcionar la entrada requerida, es decir, los archivos fuente del paquete requerido, a través de la opción RequiredInputDirectory de la instancia de clase TeXOptions. Veremos cómo funciona esto con dos ejemplos.

Entrada requerida desempaquetada (paquete fancybox)

Digamos que tenemos el siguiente archivo LaTeX simple, que es required-input-fs.tex de nuestra solución de ejemplo:

 1\documentclass{article}
 2\usepackage[a6paper,landscape]{geometry}
 3\usepackage{fancybox}
 4\begin{document}
 5Test: \fbox{
 6  \begin{Bitemize}[b]
 7  \item First item
 8  \item A second one\\ on two lines
 9  \item(2pt) A third with extra space
10  \end{Bitemize}
11}
12\par\bigskip
13Test: \fbox{
14  \begin{Beqnarray}[t]
15  y & = & x^2 \\
16  a^2 + 2ab + b^2 & = & (a + b)^2 \\
17  \int_0^\infty e^{-ax} dx & = & \frac{1}{a}
18  \end{Beqnarray}
19}
20\end{document}

En la tercera línea, podemos ver que el archivo requiere el paquete fancybox, que no es compatible “de forma nativa”. Supongamos también que tenemos el archivo fuente del paquete fancybox. Es un paquete simple, por lo que realmente consta de un único archivo. Podemos colocar este archivo en cualquier lugar de nuestro sistema de archivos y especificar la ruta del directorio de la manera más simple que se muestra a continuación:

1options.RequiredInputDirectory = new InputFileSystemDirectory("path-to-directory-where-fancybox.sty-located");

Después de ejecutar un trabajo TeX con esta opción (no olvide ajustar las otras opciones según sea necesario), obtenemos el documento de salida (es decir, una imagen PNG).

Documento de salida

Aquí está el código fuente completo del ejemplo:

 1// Create conversion options for Object LaTeX format upon Object TeX engine extension.
 2TeXOptions options = TeXOptions.ConsoleAppOptions(TeXConfig.ObjectLaTeX);
 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// Initialize the options for saving in PNG format.
 9options.SaveOptions = new PngSaveOptions();
10// Run LaTeX to PNG conversion.
11new TeXJob(Path.Combine(RunExamples.InputDirectory, "required-input-fs.tex"), new ImageDevice(), options).Run();

Entrada requerida archivada (paquete pgfplots)

Digamos ahora que tenemos el siguiente archivo LaTeX también bastante simple, que es required-input-zip.tex de nuestra solución de ejemplo:

 1\documentclass{article}
 2\usepackage[margin=0.25in]{geometry}
 3\usepackage{pgfplots}
 4\pgfplotsset{width=10cm,compat=1.18}
 5\begin{document}
 6
 7First example is 2D and 3D math expressions plotted side-by-side.
 8
 9%Here begins the 2D plot
10\begin{tikzpicture}
11\begin{axis}
12\addplot[color=red]{exp(x)};
13\end{axis}
14\end{tikzpicture}
15%Here ends the 2D plot
16\hskip 5pt
17%Here begins the 3D plot
18\begin{tikzpicture}
19\begin{axis}
20\addplot3[
21    surf,
22]
23{exp(-x^2-y^2)*x};
24\end{axis}
25\end{tikzpicture}
26%Here ends the 3D plot
27
28\end{document}

En la tercera línea, podemos ver que el archivo requiere el paquete pgfplots, que tampoco es compatible de forma “nativa”. Nuevamente, asumimos que tenemos los archivos fuente del paquete pgfplots. Es una cantidad bastante grande de archivos que se dividen en dos ubicaciones si los encuentra en el directorio de instalación de cualquier aplicación de composición tipográfica LaTeX. Puede encontrar la carpeta pgfplots en las carpetas \tex\generic y \tex\latex. Y el contenido de ambas carpetas debe proporcionarse como entrada requerida para la biblioteca Aspose.TeX. Queremos que estos archivos fuente estén empaquetados en un archivo ZIP, así que aquí está el diseño del archivo:

Diseño del archivo

Y así es como especificamos el acceso a estos archivos fuente:

1using (Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2{
3    ...
4    options.RequiredInputDirectory = new InputZipDirectory(zipStream);
5    ...
6}

Después de ejecutar un trabajo TeX con esta opción, obtenemos el documento de salida:

Documento de salida

Aquí está el código fuente completo del ejemplo:

 1// Create conversion options for Object LaTeX format upon Object TeX engine extension.
 2TeXOptions options = TeXOptions.ConsoleAppOptions(TeXConfig.ObjectLaTeX);
 3// Specify a file system working directory for the output.
 4options.OutputWorkingDirectory = new OutputFileSystemDirectory(RunExamples.OutputDirectory);
 5// Initialize the options for saving in PNG format.
 6options.SaveOptions = new PngSaveOptions();
 7// Create a file stream for the ZIP archive containing the required package.
 8// The ZIP archive may be located anywhere.
 9using (Stream zipStream = File.Open(Path.Combine(RunExamples.InputDirectory, "packages\\pgfplots.zip"), FileMode.Open))
10{
11    // Specify a ZIP working directory for the required input.
12    options.RequiredInputDirectory = new InputZipDirectory(zipStream, "");
13    
14    // Run LaTeX to PNG conversion.
15    new TeXJob(Path.Combine(RunExamples.InputDirectory, "required-input-zip.tex"), new ImageDevice(), options).Run();
16}

NOTA: El resultado se verificó utilizando la versión 1.18.1 del paquete pgfplots. Mientras que la versión del paquete pfg incluida en la biblioteca Aspose.TeX es la 3.1.9a.

Emplear paquetes de fuentes externos

Como regla general, las distribuciones de LaTeX proporcionan un conjunto de fuentes predeterminadas disponibles para la composición tipográfica. Excepto estas fuentes, Aspose.TeX incluye varios paquetes de fuentes no estándar. Por ejemplo, “amsfonts”, “eurosym” y “wasysym”. Como vimos anteriormente, Aspose.TeX también permite emplear paquetes externos. Pero sobre todo estábamos hablando de paquetes que no contienen fuentes. La extensión del motor Object TeX de Aspose.TeX necesita mapas de fuentes (que son archivos de texto en un formato determinado con la extensión .map por convención) para determinar qué fuentes físicas corresponden al nombre de fuente interno de cada TeX. . Estos mapas de fuentes deben cargarse en la memoria de TeX durante la fase de inicialización. Y, por supuesto, deben estar presentes entre los archivos del paquete que está conectando. Como el motor no conoce los nombres de todos los mapas de fuentes, busca todos los archivos con la extensión .map. Por lo tanto, una implementación de la interfaz IInputWorkingDirectory que se utiliza como valor de la opción RequiredInputDirectory debe proporcionar una forma de acceder a colecciones de nombres de archivos por extensión. Más específicamente, esta implementación también debe implementar la interfaz IFileCollector. Las implementaciones estándar, InputFileSystemDirectory y InputZipDirectory, ya lo hacen.

A continuación, proporcionamos un ejemplo ilustrativo de un directorio de entrada personalizado requerido que también implementa la interfaz IFileCollector. Si bien nos centramos en recopilar nombres de archivos por extensión, omitimos intencionalmente los detalles del almacenamiento y recuperación de archivos.

 1// This is an implementation of IInputWorkingDirectory that is suitable for the TeX job's RequiredInputDirectory option
 2// in case required input contains fonts provided by external packages.
 3// The class additionally implements IFileCollector, which provides access to file collections by extension.
 4// This is necessary to load external font maps, which are files (outside TeX syntax) that map TeX's
 5// internal font names to file names of physical fonts.
 6public class RequiredInputDirectory : IInputWorkingDirectory, IFileCollector
 7{
 8    private Dictionary<string, Dictionary<string, string>> _fileNames =
 9        new Dictionary<string, Dictionary<string, string>>();
10
11    public RequiredInputDirectory()
12    {
13    }
14
15    // This method should preliminarily be called for each file entry that is supposed to be located inside
16    // the required input directory. Inside is an example of how the dictionary of file names could be organized
17    // for easy collection of file names by extension.
18    // Here fileName is a full file name. This can be a file path on a file system, a URL, or whatever else (theoretically).
19    public void StoreFileName(string fileName)
20    {
21        string extension = Path.GetExtension(fileName);
22        string name = Path.GetFileNameWithoutExtension(fileName);
23        
24        Dictionary<string, string> files;
25        if (!_fileNames.TryGetValue(extension, out files))
26            _fileNames.Add(extension, files = new Dictionary<string, string>());
27
28        files[name] = fileName;
29    }
30
31    // The IInputWorkingDirectory implementation.
32    public NamedStream GetFile(string fileName, bool searchSubdirectories = false)
33    {
34        return new NamedStream(null, fileName); // Here we actually return a stream for the file requested by its name.
35    }
36
37    // Here is how we gather file collections by extension.
38    public string[] GetFileNamesByExtension(string extension, string path = null)
39    {
40        Dictionary<string, string> files;
41        if (!_fileNames.TryGetValue(extension, out files))
42            return new string[0];
43
44        return new List<string>(files.Values).ToArray();
45    }
46
47    public void Dispose()
48    {
49        _fileNames.Clear();
50    }
51}

Restricciones

Puede suceder que un paquete requerido por su archivo LaTeX esté desarrollado bajo el kernel LaTeX3e. Lo más probable es que un paquete de este tipo no funcione con la biblioteca Aspose.TeX ya que esta última se basa en el kernel LaTeX2e.

También puede suceder que un paquete requerido por su archivo LaTeX llame directamente a comandos primitivos dependientes del dispositivo que no son compatibles con el motor Object TeX de la biblioteca Aspose.TeX. Desafortunadamente, un paquete así no funcionará con seguridad.

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.