Pacchetti in LaTeX esterni | .NET

Pacchetti di LaTeX esterni

La libreria aspose.tex include un numero di pacchetti di LaTeX comuni. Quindi non devi preoccuparti di come fornire questi pacchetti al motore Tex della biblioteca. Ma a volte (o abbastanza spesso) il tuo file LaTeX può richiedere un pacchetto oltre il pacchetto “supportato in modo nativo” dei pacchetti. In tal caso, è possibile provare a fornire l’input richiesto, ovvero i file di origine del pacchetto richiesti, tramite l’opzione RebledInputDirectory 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, possiamo vedere che il file richiede il pacchetto FancyBox, che non è" nativo “supportato. Supponiamo anche che abbiamo il file di origine del pacchetto FancyBox. È un pacchetto semplice, quindi consiste davvero in un singolo file. Possiamo posizionare questo file ovunque nel nostro file system e specificare il percorso della directory come mostrato di seguito:

1options.RequiredInputDirectory = 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).

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.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();

Input richiesto archiviato (pacchetto pgfplots)

Diciamo 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, possiamo vedere 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. È un numero piuttosto elevato 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:

Layout dell’archivio

Ed è così che specifichiamo l’accesso a questi file di origine:

1using (Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2{
3    ...
4    options.RequiredInputDirectory = new InputZipDirectory(zipStream);
5    ...
6}

Dopo aver eseguito un lavoro Tex con questa opzione, otteniamo il documento di output:

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.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}

NOTA: Il risultato è stato verificato utilizzando il pacchetto pgfplots versione 1.18.1. Mentre la versione del pacchetto pfg inclusa nella libreria Aspose.TeX è la 3.1.9a.

Impiegando pacchetti di caratteri esterni

Di norma, le distribuzioni in LaTeX forniscono una serie di caratteri predefiniti disponibili per la composizione. Tranne questi caratteri, Aspose.TeX include una serie di pacchetti di carattere non standard. Ad esempio, amsfonts, eurosym e wasysym. Come abbiamo visto sopra, Aspose.TeX consente anche di impiegare pacchetti esterni. Ma soprattutto stavamo parlando di pacchetti che non contengono caratteri. aspose.tex ’sObject texIl motore estensione ha bisogno di mappe dei caratteri (che sono file di testo in un determinato formato con l’estensione .map per convenzione) per determinare quali caratteri fisici corrispondono al nome del carattere interno di ciascun tex. Queste mappe dei caratteri devono essere caricate nella memoria di Tex durante la fase di inizializzazione. E, naturalmente, devono essere presenti tra i file del pacchetto che si sta collegando. Poiché il motore non conosce i nomi di tutte le mappe dei caratteri, cerca tutti i file con l’estensione .map. Pertanto, un’implementazione dell’interfaccia IinputWorkingDirectory che viene utilizzata come valore dell’opzione RecomeInputDirectory deve fornire un modo per accedere alle raccolte di nomi di file per estensione. Più specificamente, questa implementazione deve anche implementare l’interfaccia IFileCollector. Le implementazioni standard - InputFilesystemDirectory e inputZipDirectory - lo fanno già.

Di seguito, forniamo un esempio illustrativo di una directory di input richiesta personalizzata che implementa anche l’interfaccia IFileCollector. Mentre ci concentriamo sulla raccolta dei nomi dei file per estensione, omettiamo intenzionalmente i dettagli di archiviazione e 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
 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}

Restrizioni

Può succedere che un pacchetto richiesto dal tuo file LaTeX sia sviluppato sotto il kernel LaTeX3e. Molto probabilmente tale pacchetto non funzionerà con la libreria aspose.tex poiché quest’ultima si basa sul kernelLaTeX2e.

Può anche succedere che un pacchetto richiesto dal file Latex chiama direttamente comandi primitivi dipendenti dal dispositivo che non sono supportati dal motoreoggettodella libreria*della libreria **. Tale pacchetto, sfortunatamente, non funzionerà sicuramente.

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.