Pacchetti in LaTeX esterni | Java
Pacchetti di LaTeX esterni
Esiste un certo numero di pacchetti di LaTeX comuni inclusi nella libreria aspose.tex per java. Quindi non devi prenderti cura di come fornire questi pacchetti al motore Tex della biblioteca. Ma a volte (forse spesso) il tuo file in LaTeX può richiedere un pacchetto oltre il pacchetto “supportato in modo nativo” dei pacchetti. In questo caso, è possibile provare a fornire l’input richiesto, ovvero i file di origine del pacchetto richiesti, utilizzando il metodo setrequiredInputDirectory() dell’istanza di classe Texoptions. Vedremo come funziona con due esempi.
Impostare inputFile sul percorso completo del documento LaTeX corrispondente e outputDirectory su una cartella di output esistente. Entrambi gli esempi di conversione generano PNG a 150 DPI. Importare le classi Aspose.TeX utilizzate nell’esempio scelto, com.aspose.tex.rendering.ImageDevice, com.aspose.tex.rendering.PngSaveOptions e, per l’input ZIP, java.io.InputStream e java.nio.file.Files. Gestire o dichiarare le eccezioni nel metodo chiamante. Applicare una licenza secondo la
guida alle licenze.
Input richiesto non pacchettato (pacchetto FancyBox)
Diciamo che abbiamo il seguente semplice file in LaTeX, che è richiesto-input-fs.tex dalla nostra
soluzione di esempio:
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}
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}La terza riga richiede il pacchetto esterno fancybox. Impostare packagesDirectory su una cartella locale con fancybox.sty e le sue dipendenze. L’esempio completo seguente assegna questa cartella a RequiredInputDirectory e genera un’immagine PNG. Il dispositivo e le directory di lavoro rimangono aperti fino al termine del lavoro, quindi vengono rilasciati o chiusi.

Ecco il codice sorgente completo per l’esempio:
1// Render the fancybox document using external package sources from a local folder.
2// inputFile is the full TeX input path; packagesDirectory contains fancybox.sty.
3// outputDirectory is an existing output folder.
4TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
6InputFileSystemDirectory packages = new InputFileSystemDirectory(packagesDirectory);
7options.setOutputWorkingDirectory(output);
8options.setRequiredInputDirectory(packages);
9PngSaveOptions saving = new PngSaveOptions();
10saving.setResolution(150);
11options.setSaveOptions(saving);
12options.setInteraction(Interaction.NonstopMode);
13options.setTerminalOut(new OutputMemoryTerminal());
14ImageDevice device = new ImageDevice();
15TeXJobResult result;
16int pages;
17try {
18 result = new TeXJob(inputFile, device, options).run();
19 pages = device.getPageCount();
20} finally {
21 device.dispose();
22 output.close();
23 packages.close();
24}Input richiesto archiviato (pacchetto pgfplots)
Supponiamo ora che abbiamo anche il seguente file in LaTeX abbastanza semplice, che è richiesto Input-Zip.tex dalla nostra soluzione di esempio:
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}Nella terza riga, vediamo che il file richiede il pacchetto pgfplots, che non è anche" nativo “supportato. Ancora una volta, supponiamo che abbiamo i file di origine del pacchetto pgfplots. È una serie piuttosto ampia di file che sono divisi tra due posizioni se le si trovano nella directory di installazione di qualsiasi applicazione di composizione in LaTeX. Puoi trovare la cartella pgfplots nelle cartelle\tex\generic e \tex\latex. E il contenuto di entrambe queste cartelle deve essere fornito come input richiesto alla libreria ASPIPE.Tex. Vogliamo che questi file di origine siano confezionati in un archivio con zip, quindi ecco il layout dell’archivio:

Impostare packagesZip su un java.nio.file.Path all’archivio contenente i sorgenti generici e LaTeX del pacchetto. L’esempio Java completo seguente lo apre con Files.newInputStream(...) e assegna un InputZipDirectory a RequiredInputDirectory. L’argomento del percorso base vuoto seleziona l’intero archivio. Tenere aperti il flusso ZIP e la directory fino al termine del lavoro TeX, quindi chiuderli. Il risultato è un’immagine PNG con i due grafici.

Ecco il codice sorgente completo per l’esempio:
1// Render the 2D/3D plots using pgfplots package sources from a ZIP archive.
2// inputFile is the full TeX input path; packagesZip is a java.nio.file.Path.
3// outputDirectory is an existing output folder; the ZIP includes generic and latex sources.
4TeXJobResult result;
5int pages;
6try (InputStream zipStream = Files.newInputStream(packagesZip)) {
7 TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
8 OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
9 InputZipDirectory packages = new InputZipDirectory(zipStream, "");
10 options.setOutputWorkingDirectory(output);
11 options.setRequiredInputDirectory(packages);
12 PngSaveOptions saving = new PngSaveOptions();
13 saving.setResolution(150);
14 options.setSaveOptions(saving);
15 options.setInteraction(Interaction.NonstopMode);
16 options.setTerminalOut(new OutputMemoryTerminal());
17 ImageDevice device = new ImageDevice();
18 try {
19 result = new TeXJob(inputFile, device, options).run();
20 pages = device.getPageCount();
21 } finally {
22 device.dispose();
23 output.close();
24 packages.close();
25 }
26}NOTA: Il risultato è stato verificato utilizzando il pacchetto
pgfplotsversione 1.18.1. Mentre la versione del pacchettopfginclusa nella libreria Aspose.TeX è la 3.1.9a.
Utilizzo di pacchetti di caratteri esterni
In genere, le distribuzioni in LaTeX sono dotate di una selezione di caratteri predefiniti che possono essere utilizzati per la composizione. Oltre a questi caratteri, Aspose.TeX offre diversi pacchetti di caratteri non standard, come amsfonts, eurosym e wasysym. Come accennato in precedenza, Aspose.TeX supporta anche l’uso di pacchetti esterni, sebbene la nostra attenzione sia stata principalmente su pacchetti che non includono caratteri.
L’estensione del motore Object TeX in Aspose.TeX richiede mappe di font, ovvero file di testo con estensione .map che specificano i font fisici corrispondenti al nome di ciascun font interno di TeX. Queste mappe di font devono essere caricate nella memoria di TeX durante la fase di inizializzazione e devono essere incluse nei file del pacchetto. Poiché il motore non conosce i nomi di tutte le mappe di font, cerca tutti i file con estensione .map. Pertanto, l’implementazione dell’interfaccia
IInputWorkingDirectory utilizzata come valore dell’opzione
RequiredInputDirectory deve fornire un modo per accedere a raccolte di nomi di file in base alla loro estensione. Nello specifico, questa implementazione deve implementare anche l’interfaccia
IFileCollector. Le implementazioni standard,
InputFileSystemDirectory e
InputZipDirectory, soddisfano già questo requisito.
Il RequiredInputDirectory personalizzato seguente implementa entrambe le interfacce e legge file locali registrati esplicitamente. Salvarlo come RequiredInputDirectory.java con gli import inclusi. Registrare ogni file con storeFileName(...), assegnare l’istanza con options.setRequiredInputDirectory(...) e chiuderla dopo il lavoro. È un registro piatto: i nomi dei file devono essere univoci quando richiesti senza un percorso completo. Le estensioni vengono confrontate senza distinguere maiuscole e minuscole; il percorso di raccolta facoltativo seleziona una directory del file system. Registrare tutti i file necessari di pacchetti, mappe dei font, metriche e font fisici. La raccolta rende individuabili le mappe, ma non fornisce dati dei font mancanti.
1import com.aspose.tex.IInputWorkingDirectory;
2import com.aspose.tex.IFileCollector;
3import com.aspose.tex.TeXInputStream;
4import java.io.IOException;
5import java.io.UncheckedIOException;
6import java.nio.file.Files;
7import java.nio.file.Path;
8import java.nio.file.Paths;
9import java.util.ArrayList;
10import java.util.LinkedHashSet;
11import java.util.List;
12import java.util.Locale;
13import java.util.Set;
14
15// Register local package files explicitly, including font maps and their dependencies.
16// Save this class as RequiredInputDirectory.java and close it after the TeX job.
17public class RequiredInputDirectory implements IInputWorkingDirectory, IFileCollector {
18 private final Set<Path> files = new LinkedHashSet<Path>();
19 private final List<TeXInputStream> streams = new ArrayList<TeXInputStream>();
20
21 public void storeFileName(String fileName) {
22 Path file = Paths.get(fileName).toAbsolutePath().normalize();
23 if (!Files.isRegularFile(file)) {
24 throw new IllegalArgumentException("Package file does not exist: " + file);
25 }
26 files.add(file);
27 }
28
29 @Override
30 public TeXInputStream getFile(String fileName, boolean searchSubdirectories) {
31 // This registry is a flat virtual directory; only registered files are accessible.
32 for (Path file : files) {
33 if (file.toString().equals(fileName) || file.getFileName().toString().equals(fileName)) {
34 try {
35 TeXInputStream stream = new TeXInputStream(Files.newInputStream(file), file.toString());
36 streams.add(stream);
37 return stream;
38 } catch (IOException exception) {
39 throw new UncheckedIOException(exception);
40 }
41 }
42 }
43 return new TeXInputStream(null, fileName);
44 }
45
46 @Override
47 public String[] getFileNamesByExtension(String extension) {
48 return getFileNamesByExtension(extension, null);
49 }
50
51 @Override
52 public String[] getFileNamesByExtension(String extension, String path) {
53 String requested = extension.toLowerCase(Locale.ROOT);
54 if (!requested.isEmpty() && !requested.startsWith(".")) {
55 requested = "." + requested;
56 }
57 Path directory = path == null ? null : Paths.get(path).toAbsolutePath().normalize();
58 List<String> matches = new ArrayList<String>();
59 for (Path file : files) {
60 String name = file.getFileName().toString();
61 int dot = name.lastIndexOf('.');
62 String actual = dot < 0 ? "" : name.substring(dot).toLowerCase(Locale.ROOT);
63 if (actual.equals(requested) && (directory == null || file.getParent().equals(directory))) {
64 matches.add(file.toString());
65 }
66 }
67 return matches.toArray(new String[0]);
68 }
69
70 @Override
71 public void close() throws IOException {
72 IOException failure = null;
73 for (TeXInputStream stream : streams) {
74 try {
75 stream.close();
76 } catch (IOException exception) {
77 if (failure == null) { failure = exception; }
78 else { failure.addSuppressed(exception); }
79 }
80 }
81 streams.clear();
82 files.clear();
83 if (failure != null) { throw failure; }
84 }
85}Restrizioni
Un pacchetto richiesto dal file LaTex può essere sviluppato sotto il kernel LaTeX3e. Molto probabilmente tale pacchetto non funzionerà con la libreria aspose.tex poiché quest’ultima si basa sul kernelLaTeX2e.
Inoltre, un pacchetto richiesto dal file Latex può chiamare direttamente comandi primitivi dipendenti dal dispositivo che non sono supportati dal motoreoggettodella libreria*della libreria **. Tale pacchetto, sfortunatamente, non funzionerà sicuramente.