Grafica incorporata in LaTeX | Java
Un modo alternativo per includere immagini
Alcuni sistemi TEX/LaTex consentono l’inclusione di immagini che non sono archiviate esternamente rispetto al file in LaTeX stesso; Invece, queste immagini sono incorporate direttamente all’interno del file LaTeX. Tuttavia, poiché i file TEX/Latex sono un testo semplice e non possono contenere dati binari, abbiamo bisogno di un metodo per rappresentare i dati binari in un formato di testo. Ciò significa che i dati binari devono essere codificati in una rappresentazione testuale. La sfida è che un motore TEX non può interpretare direttamente queste immagini codificate. Alla fine, le immagini sono incluse utilizzando il noto comando \includegraphics ‘dal pacchetto graphicx, ma questo comando è limitato alla gestione di file di immagini esterni. Pertanto, un file di immagine esterno (insieme a un file intermedio aggiuntivo) deve ancora essere creato al di fuori del file LaTeX, ma ciò avverrà solo durante la composizione. Il vantaggio è che devi solo distribuire il file LaTeX stesso, piuttosto che una serie di file.
Va bene, supponiamo che abbiamo in qualche modo incorporato un’immagine codificata nel file LaTeX. Come decodifichiamo questa immagine? Sfortunatamente, non possiamo decodificarlo direttamente leggendolo dal file LaTeX e scrivendolo in un file di immagine esterno. Invece, la stringa di testo che rappresenta l’immagine codificata deve prima essere scritta su un file di testo esterno, che può quindi essere decodificato per generare il file di immagine.
A questo punto, possiamo delineare i seguenti passaggi per ottenere il risultato desiderato:
- Codificare l’immagine.
- Inserire la stringa di testo che rappresenta i dati dell’immagine nel file latex.
- Scrivi la stringa di testo che rappresenta i dati dell’immagine in un file esterno.
- Decodifica il file esterno creato nel passaggio 3.
- Includi l’immagine decodificata.
I primi due passaggi vengono eseguiti dall’autore del file LaTeX. Il motore Tex gestirà i passaggi rimanenti, purché sia adeguatamente istruito, ovviamente.
Passiamo al Passaggio 1. Come possiamo codificare la nostra immagine per ottenere una stringa di caratteri? Uno dei metodi per farlo (e probabilmente il più popolare) è Base64.
Codifica dati binari utilizzando Base64
Base64 è un gruppo di schemi di codifica binaria-text che trasforma i dati binari in una sequenza di caratteri stampabili, usando un set di 64 caratteri unici. In particolare, i dati binari di origine vengono elaborati in gruppi di 6 bit, con ciascun gruppo mappato a uno dei 64 caratteri unici. Come tutti gli schemi di codifica binaria-text, Base64 ha lo scopo di facilitare la trasmissione di dati memorizzati in formati binari su canali che supportano prevalentemente il contenuto di testo.
Questa breve spiegazione mostra che Base64 è esattamente ciò di cui abbiamo bisogno. Per codificare un file di immagine su Base64, è possibile utilizzare un’utilità della riga di comando (se disponibile sul sistema operativo), caratteristiche standard o di terze parti di quasi tutti i linguaggi di programmazione o strumenti online come Base64.guru o simili.
Incorporare l’immagine codificata nel file LaTeX
La stringa di caratteri generati dal processo di codifica deve essere inserita nell’ambiente standard “FileContents” all’interno del preambolo di un file LaTeX, come segue:
1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6...
7\end{document}Ecco qui! Passaggio 2 è completo. Abbiamo incorporato con successo l’immagine all’interno del file LaTex! Ma cosa succederà quando eseguirà la composizione di questo file con LaTeX? "
Un processore in LaTeX scriverà la stringa di caratteri dall’ambiente a un file esterno chiamato campione-immagine.64. A causa dell’opzione Overwrite, il file verrà sovrascritto se esiste già (ad esempio, se è stato creato durante una esecuzione precedente). Ecco come viene realizzato anche il passaggio 3 **!
Decodifica una stringa di base64
Passaggio 4 del nostro piano è dove entrano in gioco le differenze nelle implementazioni di Tex. La decodifica di una stringa di caratteri Base64 viene eseguita mediante una cosa più comune nota come funzione \write18.
\write18
Nei motori Classic Tex, \write<number>(<token list>) è la primitiva usata per scrivere un elenco di token. Se usato, questo primitivo è seguito da un numero intero. Se l’intero è negativo, i token vengono scritti nel file Transcript (log). Se l’intero è maggiore di 15, i token vengono inviati al terminale. Se l’intero rientra nell’intervallo di 0..15, i token sono scritti in un file il cui nome è specificato da un precedente verificarsi della primitiva \openout. La primitiva \openout<4-bit integer>=<file name> associa un nome file con un numero.
Le nuove implementazioni Tex, come PDF Tex, consentono l’uso di \write18. In questo caso, interpretano l’elenco <token> come riga di comando da eseguire nella shell del sistema operativo. Poiché questa funzione ovviamente rappresenta un potenziale rischio per la sicurezza, potresti percepire un pizzico di mistero ogni volta che si fa riferimento nella documentazione relativa a Tex o su Internet. Per questo motivo, gli esecutibili TEX/latex PDF offrono opzioni di comando per controllare ACESS a questa funzione.
In genere, ci sono tre livelli di accessibilità: disabili, abilitati con restrizioni e completamente abilitato.
In aspose.tex, esiste un’opzione di lavoro tex chiamata shellmode, che può prendere uno dei due possibili valori:noshellescape e shellrestricted. Il valore NoshelleScape indica che la funzione è disabilitata. Quest’ultimo valore significa che qualsiasi comando che richiede l’esecuzione deve essere implementato dall’utente come estensione della classe eseguibile. Non entreremo nei dettagli di tali implementazioni qui, ma è importante notare che l’emulazione del comando Base64 è già implementata in Aspose.TeX ed è inclusa per impostazione predefinita nella proprietà della raccolta eseguibili ‘dell’istanza di classeTexoptions'. L’emulazione integrata dibase64` viene eseguita all’interno di Aspose.TeX e non richiede un programma Base64 del sistema operativo.
Decodifica dati codificati da base64
Per decodificare il contenuto di un file che dovrebbe contenere dati codificati da base64, normalmente useremo la seguente riga di comando:
1base64 -d FILE1 > FILE2dove file1 è il file “codificato” e > file2 reindirizza l’output nel filefile2.
Pertanto, dovremmo includere la seguente riga nel corpo del nostro file in LaTeX:
1\immediate\write18{base64 -d sample-image.64 > sample-image.png}Il prefisso
\immediateè necessario per garantire che l’operazione\writevenga eseguita immediatamente quando lo scanner TeX incontra questa primitiva. In caso contrario, verrà elaborata durante l’invio della pagina.
Se eseguiamo ora la composizione del file, scopriremo che è stato creato il file di immagine campione-image.png. Vai avanti e aprilo in uno spettatore per controllare!
Compresa l’immagine decodificata
Come abbiamo notato all’inizio dell’articolo, per includere l’immagine decodificata, utilizziamo il noto comando in LaTeX \includegraphics:
1\includegraphics[options]{sample-image.png}Il seguente esempio illustra la struttura del documento. Sostituire la riga Base64 abbreviata con i dati completi dell’immagine; i punti sono un segnaposto e non possono essere decodificati:
1\documentclass{article}
2\usepackage{graphicx}
3\begin{filecontents*}[overwrite]{sample-image.64}
4iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
5\end{filecontents*}
6\begin{document}
7 \immediate\write18{base64 -d sample-image.64 > sample-image.png}
8 \includegraphics[width=\textwidth]{sample-image.png}
9\end{document}L’esempio Java converte il documento completo embedded-base64-image.tex in PDF. Impostare inputFile sul percorso completo del file e outputDirectory su una cartella di output esistente. Importare le classi utilizzate di com.aspose.tex, com.aspose.tex.rendering.PdfDevice e com.aspose.tex.rendering.PdfSaveOptions. Gestire o dichiarare le eccezioni e applicare una licenza secondo la
guida alle licenze. L’esempio abilita ShellRestricted per il comando Base64 integrato, elabora senza interazione e acquisisce l’output del terminale in memoria. Il dispositivo PDF e la directory di output vengono rilasciati o chiusi al termine del processo. La cartella contiene sample-image.64, l’immagine decodificata sample-image.png, il PDF e il registro TeX:
1// Decode an embedded Base64 image with Aspose.TeX's built-in base64 command and include it in PDF.
2// inputFile is the full LaTeX input path; outputDirectory is an existing output folder.
3TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
4OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
5options.setOutputWorkingDirectory(output);
6options.setSaveOptions(new PdfSaveOptions());
7options.setShellMode(ShellMode.ShellRestricted);
8options.setInteraction(Interaction.NonstopMode);
9options.setTerminalOut(new OutputMemoryTerminal());
10PdfDevice device = new PdfDevice();
11TeXJobResult result;
12try {
13 result = new TeXJob(inputFile, device, options).run();
14} finally {
15 device.dispose();
16 output.close();
17}E ora il passaggio 5 è completo. Per esempi davvero completi, esplora il nostro esempio di esempio.
Puoi anche controllare la conversione gratuita app Web in base a Aspose.TeX per API .NET.