Externe LaTeX-Pakete | Java

Externe LaTeX-Pakete

In der Aspose.TeX-Bibliothek für Java sind eine Reihe gängiger LaTeX-Pakete enthalten. Sie müssen sich also nicht darum kümmern, wie Sie diese Pakete der TeX-Engine der Bibliothek bereitstellen. Aber manchmal (vielleicht oft) erfordert Ihre LaTeX-Datei möglicherweise ein Paket, das über das „nativ“ unterstützte „Paketpaket“ hinausgeht. In diesem Fall können Sie versuchen, die erforderliche Eingabe, d. h. die Quelldateien des erforderlichen Pakets, mithilfe der Methode setRequiredInputDirectory() 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 sehen wir, dass die Datei das Paket „fancybox“ erfordert, das nicht „nativ“ unterstützt wird. Wir gehen außerdem davon aus, dass wir über die Quelldatei des Pakets „fancybox“ verfügen. Da es sich um ein einfaches Paket handelt, besteht es eigentlich nur aus einer Datei. Wir können diese Datei an einer beliebigen Stelle in unserem Dateisystem platzieren und den Verzeichnispfad einfach wie folgt angeben:

1options.setRequiredInputDirectory(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).

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.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
 5// Specify a file system working directory for the required input.
 6// The directory containing packages may be located anywhere.
 7options.setRequiredInputDirectory(new InputFileSystemDirectory(Utils.getInputDirectory() + "packages"));
 8// Initialize the options for saving in PNG format.
 9options.setSaveOptions(new PngSaveOptions());
10// Run LaTeX to PNG conversion.
11new TeXJob(Utils.getInputDirectory() + "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 Menge an 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:

Archivlayout

Und so legen wir den Zugriff auf diese Quelldateien fest:

1final Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2try {
3    ...
4    options.setRequiredInputDirectory(new InputZipDirectory(zipStream));
5    ...
6} finally {
7    if (zipStream != null)
8        zipStream.close();
9}

Nachdem wir einen TeX-Job mit dieser Option ausgeführt haben, erhalten wir das Ausgabedokument:

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.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
 5// Initialize the options for saving in PNG format.
 6options.setSaveOptions(new PngSaveOptions());
 7// Create a file stream for the ZIP archive containing the required package.
 8// The ZIP archive may be located anywhere.
 9final InputStream stream = new FileInputStream(Utils.getInputDirectory() + "packages\\pgfplots.zip");
10try {
11    // Specify a ZIP working directory for the required input.
12    options.setRequiredInputDirectory(new InputZipDirectory(stream, ""));
13    
14    // Run LaTeX to PNG conversion.
15    new TeXJob(Utils.getInputDirectory() + "required-input-zip.tex", new ImageDevice(), options).run();
16} finally {
17    if (stream != null)
18        stream.close();
19}

HINWEIS: Das Ergebnis wurde mit dem Paket pgfplots, Version 1.18.1, überprüft. Die Version des pfg-Pakets, das in der Aspose.TeX-Bibliothek enthalten ist, ist 3.1.9a.

Verwendung externer Schriftartenpakete

In der Regel enthalten LaTeX-Distributionen eine Auswahl an Standardschriftarten, die für den Schriftsatz verwendet werden können. Zusätzlich zu diesen Schriftarten bietet Aspose.TeX mehrere nicht standardmäßige Schriftartenpakete wie „amsfonts“, Eurosym und „wasysym“. Wie bereits erwähnt, unterstützt Aspose.TeX auch die Verwendung externer Pakete, obwohl unser Fokus hauptsächlich auf Paketen lag, die keine Schriftarten enthalten. Die Object TeX-Engine-Erweiterung in Aspose.TeX erfordert Schriftartenzuordnungen, bei denen es sich um Textdateien mit der Erweiterung „.map“ handelt, die die physischen Schriftarten angeben, die dem internen Schriftartennamen jedes TeX entsprechen. Diese Schriftartenzuordnungen müssen während der Initialisierungsphase in den Speicher von TeX geladen und in den Paketdateien enthalten sein. Da die Engine nicht die Namen aller Schriftartenkarten kennt, sucht sie nach Dateien mit der Erweiterung „.map“. Daher muss die Implementierung der Schnittstelle IInputWorkingDirectory, die als Wert der Option RequiredInputDirectory verwendet wird, eine Möglichkeit bieten, auf Sammlungen von Dateinamen basierend auf ihrer Erweiterung zuzugreifen. Insbesondere muss diese Implementierung auch die Schnittstelle IFileCollector implementieren. Die Standardimplementierungen InputFileSystemDirectory und InputZipDirectory erfüllen diese Anforderung bereits.

Nachfolgend stellen wir ein Beispiel für ein benutzerdefiniertes erforderliches Eingabeverzeichnis vor, das auch die Schnittstelle IFileCollector implementiert. Unser Hauptaugenmerk liegt auf der Erfassung von Dateinamen anhand ihrer Erweiterung, und wir lassen 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
 5public class RequiredInputDirectory implements IInputWorkingDirectory, IFileCollector
 6{
 7    private Map<String, Map<String, String>> _fileNames = new HashMap<String, Map<String, String>>();
 8
 9    public RequiredInputDirectory()
10    { 
11    }
12
13    // This method should preliminarily be called for each file entry that is supposed to be located inside
14    // the required input directory. Inside is an example of how the dictionary of file names could be organized
15    // for easy collection of file names by extension.
16    // Here fileName is a full file name. This can be a file path on a file system, a URL, or whatever else (theoretically).
17    public void storeFileName(String fileName)
18    {
19        String extension = getExtension(fileName);
20        String name = getFileNameWithoutExtension(fileName);
21
22        Map<String, String> files = _fileNames.get(extension);
23        if (files == null)
24            _fileNames.put(extension, files = new HashMap<String, String>());
25
26        files.put(name, fileName);
27    }
28
29    // The IInputWorkingDirectory implementation.
30    public TeXInputStream getFile(String fileName, boolean searchSubdirectories)
31    {
32        return new TeXInputStream(null, fileName); // Here we actually return a stream for the file requested by its name.
33    }
34    
35    // Here is how we gather file collections by extension.
36    public String[] getFileNamesByExtension(String extension)
37    {
38    	return getFileNamesByExtension(extension, null);
39    }
40
41    // Here is how we gather file collections by extension.
42    public String[] getFileNamesByExtension(String extension, String path)
43    {
44        Map<String, String> files = _fileNames.get(extension);
45        if (files == null)
46            return new String[0];
47        
48        return files.values().toArray(new String[0]);
49    }
50    
51    private String getExtension(String fileName)
52    {
53    	int pos = fileName.indexOf('.');
54    	if (pos < 0)
55    		return "";
56    	
57    	return fileName.substring(pos);
58    }
59    
60    private String getFileNameWithoutExtension(String fileName)
61    {
62    	int pos = fileName.lastIndexOf('/');
63    	if (pos >= 0)
64    		fileName = fileName.substring(pos + 1);
65    	
66    	pos = fileName.indexOf('.');
67    	if (pos < 0)
68    		return fileName;
69    	
70    	return fileName.substring(0, pos);
71    }
72
73    public void close()
74    {
75        _fileNames.clear();
76    }
77}

Einschränkungen

Ein für Ihre LaTeX-Datei erforderliches Paket kann unter dem LaTeX3e-Kernel entwickelt werden. Ein solches Paket wird höchstwahrscheinlich nicht mit der Aspose.TeX-Bibliothek funktionieren, da letztere auf dem LaTeX2e-Kernel basiert.

Außerdem ruft ein von Ihrer LaTeX-Datei benötigtes Paket möglicherweise direkt geräteabhängige primitive Befehle auf, die von der Object TeX-Engine der Aspose.TeX-Bibliothek nicht unterstützt werden. Ein solches Paket wird leider nicht mit Sicherheit funktionieren.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.