Gráficos integrados LaTeX | Incluir gráficos en el código LaTeX

Una forma alternativa de incluir imágenes

Algunos sistemas TeX/LaTeX permiten la inclusión de imágenes que no se almacenan externamente en relación con el archivo LaTeX; en cambio, estas imágenes se incrustan directamente en el archivo LaTeX. Sin embargo, dado que los archivos TeX/LaTeX son texto sin formato y no pueden contener datos binarios, necesitamos un método para representar datos binarios en formato de texto. Esto significa que los datos binarios deben codificarse en una representación textual. El desafío es que un motor TeX no puede interpretar directamente estas imágenes codificadas. Al final, las imágenes se incluyen usando el conocido comando \includegraphics del paquete graphicx, pero este comando se limita a manejar archivos de imágenes externos. Por lo tanto, aún se debe crear un archivo de imagen externo (junto con un archivo intermediario adicional) fuera del archivo LaTeX, pero eso solo ocurrirá durante la composición tipográfica. La ventaja es que sólo necesita distribuir el archivo LaTeX en sí, en lugar de un conjunto de archivos.

Muy bien, supongamos que de alguna manera hemos incrustado una imagen codificada en el archivo LaTeX. ¿Cómo decodificamos esta imagen? Desafortunadamente, no podemos decodificarlo directamente leyéndolo del archivo LaTeX y escribiéndolo en un archivo de imagen externo. En cambio, la cadena de texto que representa la imagen codificada debe escribirse primero en un archivo de texto externo, que luego se puede decodificar para generar el archivo de imagen.

En este punto, podemos delinear los siguientes pasos para lograr el resultado deseado:

  1. Codifique la imagen.
  2. Inserte la cadena de texto que representa los datos de la imagen en el archivo LaTeX.
  3. Escriba la cadena de texto que representa los datos de la imagen en un archivo externo.
  4. Decodifica el archivo externo creado en el Paso 3.
  5. Incluya la imagen decodificada.

Los dos primeros pasos los lleva a cabo el autor del archivo LaTeX. El motor TeX se encargará de los pasos restantes, siempre que reciba las instrucciones adecuadas, por supuesto.

Pasemos al Paso 1. ¿Cómo podemos codificar nuestra imagen para obtener una cadena de caracteres? Uno de los métodos para hacer esto (y probablemente el más popular) es Base64.

Codificación de datos binarios usando Base64

Base64 es un grupo de esquemas de codificación de binario a texto que transforma datos binarios en una secuencia de caracteres imprimibles, utilizando un conjunto de 64 caracteres únicos. Específicamente, los datos binarios de origen se procesan en grupos de 6 bits, y cada grupo se asigna a uno de los 64 caracteres únicos. Como todos los esquemas de codificación de binario a texto, Base64 está destinado a facilitar la transmisión de datos almacenados en formatos binarios a través de canales que admiten predominantemente contenido de texto.

Esta breve explicación muestra que Base64 es exactamente lo que necesitamos. Para codificar un archivo de imagen en Base64, puede utilizar una utilidad de línea de comandos (si está disponible en su sistema operativo), funciones estándar o de terceros de casi todos los lenguajes de programación o herramientas en línea como Base64.guru o similar.

Incrustar la imagen codificada en el archivo LaTeX

La cadena de caracteres generada a partir del proceso de codificación debe colocarse en el entorno estándar filecontents* de LaTeX dentro del preámbulo de un archivo LaTeX, de la siguiente manera:

1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6...
7\end{document}

¡Aquí lo tienes! El paso 2 está completo. ¡Hemos incrustado con éxito la imagen dentro del archivo LaTeX! ¿Pero qué pasará cuando ejecutemos la composición tipográfica de este archivo con LaTeX?" Un procesador LaTeX escribirá la cadena de caracteres del entorno en un archivo externo llamado sample-image.64. Debido a la opción “sobrescribir”, el archivo se sobrescribirá si ya existe (por ejemplo, si se creó durante una ejecución anterior). ¡Así es como también se logra el Paso 3!

Decodificando una cadena base64

El paso 4 de nuestro plan es donde entran en juego las diferencias en las implementaciones de TeX. La decodificación de una cadena de caracteres Base64 se realiza mediante algo más común conocido como función \write18.

\escribir18

En los motores TeX clásicos, \write<número>(<lista de tokens>) es la primitiva utilizada para escribir una lista de tokens. Cuando se utiliza, esta primitiva va seguida de un número entero. Si el número entero es negativo, los tokens se escriben en el archivo de transcripción (registro). Si el número entero es mayor que “15”, los tokens se envían al terminal. Si el número entero está dentro del rango de 0..15, los tokens se escriben en un archivo cuyo nombre se especifica mediante una aparición anterior de la primitiva \openout. La primitiva \openout<entero de 4 bits>=<nombre de archivo> asocia un nombre de archivo con un número.

Las implementaciones TeX más nuevas, como PDF TeX, permiten el uso de \write18. En este caso, interpretan la <lista de tokens> como una línea de comando que se ejecutará en el shell del sistema operativo. Dado que esta característica obviamente plantea un riesgo potencial de seguridad, es posible que sienta un atisbo de misterio cada vez que se hace referencia a ella en documentación relacionada con TeX o en Internet. Por esta razón, los ejecutables PDF TeX/LaTeX ofrecen opciones de comando para controlar el acceso a esta función.

Normalmente, hay tres niveles de accesibilidad: deshabilitado, habilitado con restricciones y completamente habilitado.

En Aspose.TeX, hay una opción de trabajo TeX llamada ShellMode, que puede tomar uno de dos valores posibles: NoShellEscape y ShellRestricted. El valor NoShellEscape indica que la función está deshabilitada. El último valor significa que cualquier comando que requiera ejecución debe ser implementado por el usuario como una extensión de la clase “Ejecutable”. No entraremos aquí en los detalles de dichas implementaciones, pero es importante tener en cuenta que la emulación del comando base64 ya está implementada en Aspose.TeX y está incluida de forma predeterminada en la propiedad de colección Executables de la clase TeXOptions. instancia.

Decodificación de datos codificados en Base64

Para decodificar el contenido de un archivo que se espera que contenga datos codificados en Base64, normalmente usaríamos la siguiente línea de comando:

1base64 -d  FILE1 > FILE2

donde ARCHIVO1 es el archivo “codificado” y > ARCHIVO2 redirige la salida al archivo FILE2.

Por tanto, deberíamos incluir la siguiente línea en el cuerpo de nuestro archivo LaTeX:

1\immediate\write18{base64 -d  sample-image.64 > sample-image.png}

El prefijo \immediate es necesario para garantizar que la operación \write se ejecute inmediatamente cuando el escáner TeX encuentre este primitivo. De lo contrario, se procesará durante el envío de la página.

Si ejecutamos la composición tipográfica del archivo ahora, encontraremos que se ha creado el archivo de imagen sample-image.png. ¡Continúe y ábralo en un visor para comprobarlo!

Incluyendo la imagen decodificada.

Como señalamos al principio del artículo, para incluir la imagen decodificada utilizamos el conocido comando LaTeX \includegraphics:

1\includegraphics[options]{sample-image.png}

Por lo tanto, el archivo LaTeX completo (casi) podría verse de la siguiente manera:

1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6  \write18{base64 -d  sample-image.64 > sample-image.png}
7  \includegraphics[options]{sample-image.png}
8\end{document}

Y el código Java que utiliza la API Aspose.TeX es similar a lo que se puede encontrar en otros artículos, con la excepción de especificar la opción del modo shell:

 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 PDF format.
 6options.setSaveOptions(new PdfSaveOptions());
 7// Enable the shell command execution.
 8options.setShellMode(ShellMode.ShellRestricted);
 9// Run LaTeX to PDF conversion.
10new TeXJob(Utils.getInputDirectory() + "embedded-base64-image.tex", new PdfDevice(), options).run();

Y ahora el Paso 5 está completo. Para ver ejemplos verdaderamente completos, explore nuestro Proyecto de ejemplo.

También puede consultar la aplicación web de conversión gratuita creada en base a Aspose.TeX para .NET API.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.