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.
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}[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}
Nella terza riga, vediamo che il file richiede il pacchetto FancyBox
, che non è" nativo “supportato. Presumiamo anche che abbiamo il file di origine del pacchetto FancyBox
. È un pacchetto semplice, quindi consiste davvero in un solo file. Possiamo posizionare questo file ovunque nel nostro file system e specificare il percorso della directory come segue:
1options.setRequiredInputDirectory(new InputFileSystemDirectory("path-to-directory-where-fancybox.sty-located"));
Dopo aver eseguito un lavoro Tex con questa opzione (non dimenticare di regolare le altre opzioni secondo necessità), otteniamo il documento di output (ovvero un’immagine PNG).
Ecco il codice sorgente completo per l’esempio:
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();
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:
Ed ecco come specifichiamo l’accesso a questi file di origine:
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}
Dopo aver eseguito un lavoro Tex con questa opzione, otteniamo il documento di output:
Ecco il codice sorgente completo per l’esempio:
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}
NOTA: Il risultato è stato verificato utilizzando il pacchetto
pgfplots
versione 1.18.1. Mentre la versione del pacchettopfg
inclusa 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.
Di seguito, presentiamo un esempio di directory di input personalizzata che implementa anche l’interfaccia IFileCollector. Ci concentriamo principalmente sulla raccolta dei nomi dei file in base alla loro estensione e omettiamo intenzionalmente i dettagli relativi all’archiviazione e al recupero dei file.
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}
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.