Packages LaTeX externes | .NET
Packages LaTeX externes
La bibliothèque Aspose.TeX comprend un certain nombre de packages LaTeX courants. Vous n’avez donc pas à vous soucier de la manière de fournir ces packages au moteur TeX de la bibliothèque. Mais parfois (ou assez souvent), votre fichier LaTeX peut nécessiter un package au-delà du « bundle » de packages pris en charge « nativement ». Si tel est le cas, vous pouvez essayer de fournir l’entrée requise, c’est-à-dire les fichiers sources du package requis, via l’option RequiredInputDirectory de l’instance de classe TeXOptions. Nous verrons comment cela fonctionne avec deux exemples.
Entrée requise décompressée (package fancybox
)
Disons que nous avons le fichier LaTeX simple suivant, qui est required-input-fs.tex
de notre
exemple de solution :
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}
Sur la 3ème ligne, nous pouvons voir que le fichier nécessite le package fancybox
, qui n’est pas supporté “nativement”. Supposons également que nous ayons le fichier source du package fancybox
. Il s’agit d’un package simple, il se compose donc en réalité d’un seul fichier. Nous pouvons placer ce fichier n’importe où dans notre système de fichiers et spécifier le chemin du répertoire aussi simplement que indiqué ci-dessous :
1options.RequiredInputDirectory = new InputFileSystemDirectory("path-to-directory-where-fancybox.sty-located");
Après avoir exécuté un travail TeX avec cette option (n’oubliez pas d’ajuster les autres options si nécessaire), nous obtenons le document de sortie (c’est-à-dire une image PNG).
Voici le code source complet de l’exemple :
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();
Entrée requise archivée (package pgfplots
)
Disons maintenant que nous avons le fichier LaTeX suivant, également assez simple, qui est required-input-zip.tex
de notre exemple de solution :
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}
Sur la 3ème ligne, nous pouvons voir que le fichier nécessite le package pgfplots
, qui n’est pas non plus supporté “nativement”. Encore une fois, nous supposons que nous avons les fichiers sources du paquet pgfplots
. Il s’agit d’un nombre assez important de fichiers répartis entre deux emplacements si vous les trouvez dans le répertoire d’installation de n’importe quelle application de composition LaTeX. Vous pouvez trouver le dossier pgfplots
dans les dossiers \tex\generic
et \tex\latex
. Et le contenu de ces deux dossiers doit être fourni comme entrée requise dans la bibliothèque Aspose.TeX. Nous souhaitons que ces fichiers sources soient regroupés dans une archive ZIP, voici donc la présentation de l’archive :
Et voici comment nous spécifions l’accès à ces fichiers sources :
1using (Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2{
3 ...
4 options.RequiredInputDirectory = new InputZipDirectory(zipStream);
5 ...
6}
Après avoir exécuté un travail TeX avec cette option, nous obtenons le document de sortie :
Voici le code source complet de l’exemple :
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}
REMARQUE : Le résultat a été vérifié à l’aide du package
pgfplots
version 1.18.1. La version du packagepfg
inclus dans la bibliothèque Aspose.TeX est la 3.1.9a.
Utilisation de packages de polices externes
En règle générale, les distributions LaTeX fournissent un ensemble de polices par défaut disponibles pour la composition. À l’exception de ces polices, Aspose.TeX inclut un certain nombre de packages de polices non standard. Par exemple, « amsfonts », « eurosym » et « wasysym ». Comme nous l’avons vu ci-dessus, Aspose.TeX permet également d’employer des packages externes. Mais nous parlions surtout de packages qui ne contiennent pas de polices.
L’extension du moteur Object TeX de Aspose.TeX a besoin de cartes de polices (qui sont des fichiers texte dans un certain format avec l’extension .map
par convention) pour déterminer quelles polices physiques correspondent au nom de police interne de chaque TeX. . Ces cartes de polices doivent être chargées dans la mémoire de TeX lors de la phase d’initialisation. Et, bien sûr, elles doivent être présentes parmi les fichiers du package que vous branchez. Comme le moteur ne connaît pas les noms de toutes les cartes de polices, il recherche tous les fichiers avec l’extension .map
. Par conséquent, une implémentation de l’interface
IInputWorkingDirectory utilisée comme valeur de l’option
RequiredInputDirectory doit fournir un moyen d’accéder aux collections de noms de fichiers par extension. Plus précisément, cette implémentation doit également implémenter l’interface
IFileCollector. Les implémentations standard -
InputFileSystemDirectory et
InputZipDirectory - le font déjà.
Ci-dessous, nous fournissons un exemple illustratif d’un répertoire d’entrée requis personnalisé qui implémente également l’interface IFileCollector. Tout en nous concentrant sur la collecte des noms de fichiers par extension, nous omettons intentionnellement les détails du stockage et de la récupération des fichiers.
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}
Restrictions
Il peut arriver qu’un package requis par votre fichier LaTeX soit développé sous le noyau LaTeX3e. Un tel package ne fonctionnera probablement pas avec la bibliothèque Aspose.TeX puisque cette dernière est basée sur le noyau LaTeX2e.
Il peut également arriver qu’un package requis par votre fichier LaTeX appelle directement des commandes primitives dépendantes du périphérique qui ne sont pas prises en charge par le moteur Object TeX de la bibliothèque Aspose.TeX. Malheureusement, un tel package ne fonctionnera pas à coup sûr.