Externe LaTeX-Pakete | API für .NET
Externe LaTeX-Pakete
Die Aspose.TeX-Bibliothek enthält eine Reihe gängiger LaTeX-Pakete. Sie müssen sich also keine Gedanken darüber machen, wie Sie diese Pakete der TeX-Engine der Bibliothek bereitstellen. Aber manchmal (oder ziemlich oft) erfordert Ihre LaTeX-Datei möglicherweise ein Paket, das über das „nativ“ unterstützte „Paketpaket“ hinausgeht. Wenn dies der Fall ist, können Sie versuchen, die erforderliche Eingabe, d. h. die Quelldateien des erforderlichen Pakets, über die Option RequiredInputDirectory der Klasseninstanz TeXOptions bereitzustellen. Wir werden anhand von zwei Beispielen sehen, wie das funktioniert.
Entpackte erforderliche Eingabe („fancybox“-Paket)
Nehmen wir an, wir haben die folgende einfache LaTeX-Datei, die „required-input-fs.tex“ aus unserer Beispiellösung ist:
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}
In der dritten Zeile können wir sehen, dass die Datei das Paket „fancybox“ erfordert, das nicht „nativ“ unterstützt wird. Nehmen wir außerdem an, dass wir die Quelldatei des Pakets „fancybox“ haben. Da es sich um ein einfaches Paket handelt, besteht es eigentlich aus einer einzigen Datei. Wir können diese Datei an einer beliebigen Stelle in unserem Dateisystem platzieren und den Verzeichnispfad wie folgt angeben:
1options.RequiredInputDirectory = new InputFileSystemDirectory("path-to-directory-where-fancybox.sty-located");
Nachdem wir einen TeX-Job mit dieser Option ausgeführt haben (vergessen Sie nicht, die anderen Optionen nach Bedarf anzupassen), erhalten wir das Ausgabedokument (d. h. ein PNG-Bild).
Hier ist der vollständige Quellcode für das Beispiel:
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();
Archivierte erforderliche Eingabe (Paket „pgfplots“)
Nehmen wir nun an, dass wir die folgende ebenfalls recht einfache LaTeX-Datei haben, nämlich „required-input-zip.tex“ aus unserer Beispiellösung:
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}
In der dritten Zeile sehen wir, dass die Datei das Paket „pgfplots“ erfordert, das ebenfalls nicht „nativ“ unterstützt wird. Auch hier gehen wir davon aus, dass wir über die Quelldateien des Pakets „pgfplots“ verfügen. Es handelt sich um eine ziemlich große Anzahl von Dateien, die auf zwei Speicherorte verteilt sind, wenn Sie sie im Installationsverzeichnis einer beliebigen LaTeX-Satzanwendung finden. Sie finden den Ordner „pgfplots“ sowohl im Ordner „\tex\generic“ als auch im Ordner „\tex\latex“. Und der Inhalt dieser beiden Ordner muss als erforderliche Eingabe für die Aspose.TeX-Bibliothek bereitgestellt werden. Wir möchten, dass diese Quelldateien in ein ZIP-Archiv gepackt werden. Hier ist das Layout des Archivs:
Und so legen wir den Zugriff auf diese Quelldateien fest:
1using (Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2{
3 ...
4 options.RequiredInputDirectory = new InputZipDirectory(zipStream);
5 ...
6}
Nachdem wir einen TeX-Job mit dieser Option ausgeführt haben, erhalten wir das Ausgabedokument:
Hier ist der vollständige Quellcode für das Beispiel:
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}
HINWEIS: Das Ergebnis wurde mit dem Paket
pgfplots
, Version 1.18.1, überprüft. Die Version despfg
-Pakets, das in der Aspose.TeX-Bibliothek enthalten ist, ist 3.1.9a.
Verwendung externer Schriftartenpakete
In der Regel stellen LaTeX-Distributionen eine Reihe von Standardschriftarten für den Schriftsatz zur Verfügung. Außer diesen Schriftarten enthält Aspose.TeX eine Reihe nicht standardmäßiger Schriftartenpakete. Zum Beispiel „amsfonts“, Eurosym
und „wasysym“. Wie wir oben gesehen haben, ermöglicht Aspose.TeX auch die Verwendung externer Pakete. Aber meistens haben wir über Pakete gesprochen, die keine Schriftarten enthalten.
Die Object TeX-Engine-Erweiterung von Aspose.TeX benötigt Schriftartenzuordnungen (bei denen es sich laut Konvention um Textdateien in einem bestimmten Format mit der Erweiterung „.map“ handelt), um zu bestimmen, welche physischen Schriftarten dem internen Schriftartennamen jedes TeX entsprechen . Diese Schriftartenzuordnungen müssen während der Initialisierungsphase in den Speicher von TeX geladen werden. Und natürlich müssen sie in den Dateien des Pakets vorhanden sein, das Sie einbinden. Da die Engine nicht die Namen aller Schriftartenzuordnungen kennt, sucht sie nach allen Dateien mit der Erweiterung „.map“. Daher muss eine Implementierung der Schnittstelle IInputWorkingDirectory, die als Wert der Option RequiredInputDirectory verwendet wird, eine Möglichkeit bieten, über die Erweiterung auf Sammlungen von Dateinamen zuzugreifen. Genauer gesagt muss diese Implementierung auch die Schnittstelle IFileCollector implementieren. Die Standardimplementierungen – InputFileSystemDirectory und InputZipDirectory – tun dies bereits.
Nachfolgend stellen wir ein anschauliches Beispiel für ein benutzerdefiniertes erforderliches Eingabeverzeichnis bereit, das auch die Schnittstelle IFileCollector implementiert. Während wir uns auf das Sammeln von Dateinamen nach Erweiterung konzentrieren, lassen wir die Details zum Speichern und Abrufen von Dateien bewusst weg.
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}
Einschränkungen
Es kann vorkommen, dass ein für Ihre LaTeX-Datei erforderliches Paket unter dem LaTeX3e-Kernel entwickelt wird. Ein solches Paket wird höchstwahrscheinlich nicht mit der Aspose.TeX-Bibliothek funktionieren, da letztere auf dem LaTeX2e-Kernel basiert.
Es kann auch vorkommen, dass ein von Ihrer LaTeX-Datei benötigtes Paket direkt geräteabhängige primitive Befehle aufruft, die von der Object TeX-Engine der Aspose.TeX-Bibliothek nicht unterstützt werden. Ein solches Paket wird leider nicht mit Sicherheit funktionieren.