Exportar figuras de TikZ para la web (de pdf a png o svg)

Etiquetas: Tikz , LaTeX , conversión de pdf a png

(English: TikZ Web Export (pdf to png or svg))

TikZ es un lenguaje de programación para producir imágenes que funciona a partir de LaTeX. Uno ejecuta PdfLateX en un archivo fuente de TikZ (un archivo de texto sin formato) y obtiene como resultado un pdf de la imagen que describe el código.

Para ver un ejemplo detallado, puede ver esta entrada en la que muestro el código TikZ de la siguiente imagen, o esta otra entrada en la que discuto en más detalle la sintaxis de TikZ para crear la gráfica de una función con etiquetas matemáticas en LaTeX.

Figura TikZ con código fuente en archivo .tex. Este es el pdf que produce.

Figura TikZ con código fuente en archivo .tex. Este es el pdf que produce.

TikZ juega un papel importante en este blog porque disfruto explicar cosas gráficamente y disfruto el proceso mismo de crear el código TikZ de las imágenes. Cuando le dedico tiempo a hacer una buena figura de TikZ, a menudo puedo reutilizar el código con ajustes menores para generar fácilmente muchas más imágenes y poder explicar las ideas que estoy tratando de transmitir. TikZ se convierte en una herramienta muy eficiente cuando esto sucede. Esto es parte del beneficio de “programar” una imagen en lugar de crearla con software gráfico.

Una de las cosas que tuve que descifrar para poder usar TikZ para este blog fue una forma de transformar los archivos gráficos en formato pdf que genera TikZ en formatos más amigables para la web (las páginas web no permiten el uso de imágenes en formato pdf). Hay dos caminos posibles que uno puede tomar para lograr esto:

Lo que uno espera al hacer estas conversiones es:

  1. Mantener la alta calidad (que no se produzca “pixelación”).
  2. Mantener tamaños de archivo pequeños para que las entradas de blog no sean lentas al cargar.

Los png (imágenes de mapa de bits) a menudo son más útiles que los gráficos vectoriales svg porque, a diferencia de los svg, uno puede usarlos fácilmente en otros contextos como:

  • Incluir en correos electrónicos.
  • Importar a LibreOffice, documentos de Google, o archivos de Word.
  • Compartir en Slack.

La desventaja de las imágenes de mapa de bits es que (1) y (2) son condiciones relativamente contradictorias. Uno necesita encontrar un buen punto medio entre las dos de acuerdo a sus necesidades.

Encontré varios sitios web afirmando que (1) y (2) no se pueden lograr juntos en una conversión de pdf a png y después de varios experimentos fallidos estaba empezando a creerles. Pero finalmente encontré una estrategia que me permite obtener buenos png de tamaño relativamente pequeño.

En esta entrada de blog explico cómo hago estas conversiones.

Primero, algo sobre los formatos de gráficos vectoriales y de mapa de bits

La diferencia entre las imágenes de mapa de bits y vectoriales se resume en la siguiente figura.

Demostración de diferencias entre imágenes de mapa de bits y svg. Imagen por Yug, modificaciones de cfaerber et al. De Wikipedia. CC-BY 2.5 license.

Demostración de diferencias entre imágenes de mapa de bits y svg. Imagen por Yug, modificaciones de cfaerber et al. De Wikipedia. CC-BY 2.5 license.

Las imágenes de mapa de bits (ráster) son imágenes construidas a partir de pixeles. Cada pixel tiene un color específico. Entre más pixeles tenga la imagen, mayor calidad tiene, pero también corresponde a un archivo que ocupa más memoria.

Por ejemplo, mi MacBook guarda capturas de pantalla utilizando el formato de mapa de bits png: este archivo especifica el color de cada pixel que mostraba la pantalla. Dado que mi MacBook tiene una pantalla de alta resolución, estas capturas de pantalla suelen ser innecesariamente grandes (tamaño del archivo), por lo que a menudo no son tan apropiadas para la web o para compartir en correos email.

Las imágenes vectoriales son diferentes pues tienen “instrucciones de trazo” en algún código interno en vez de información sobre cada pixel. Esto tiene dos ventajas principales para imágenes esquemáticas (tipo diagrama de matemáticas):

  • Los tamaños de archivo pueden ser muy pequeños (ya que describir las “instrucciones de trazo” para generar un diagrama suele ser mucho más eficiente que decir el color de cada pixel).

  • Las imágenes son infinitamente escalables sin reducción de calidad: no se agrandan los pixeles al hacer zoom, pues los trazos siguen siendo trazos en cualquier escala. Así, no se produce pixelación.

Un ejemplo que muestra los pdf vectoriales que produce TikZ

Esta figura que hice con TikZ para esta entrada:

Si abro el pdf, y hago zoom, ¡siempre se ve muy nítido! Esta es la parte superior izquierda:

Y esto es acercándose aún más. Cero pixelación.

En comparación, si se hace un zoom en un png, se pixela la imagen (se agrandan los pixeles) y se ve así:

Cómo hago las conversiones: conversión de pdf a png

El método de conversión de pdf a png que actualmente uso involucra usar la terminal de MacOS e ImageMagick.

Requisitos previos: instalar ImageMagick

  • Instale el fantástico Homebrew para la Terminal.App si todavía no lo tiene. Instrucciones en su sitio web.

  • Instale el también el fantástico ImageMagick desde la terminal usando Homebrew ejecutando el comando:

    brew install imagemagick
    

Una forma de asegurarse que los pasos anteriores se ejecutaron de manera correcta es escribir el siguiente comando en la terminal:

convert --version

Si todo está bien, la terminal debe responder con información sobre ImageMagick y su versión, en lugar de un mensaje de error.

Conversión de pdf a png con ImageMagick

  • Navegue dentro del terminal a la carpeta que contiene el archivo pdf que fue creado por TikZ (digamos fileName.pdf) .
  • Ejecute el siguiente comando en el terminal:
    convert -density 600 filename.pdf filename.png
    

¡Eso es todo! Ahora debería tener una imagen png filename.png en la misma carpeta, con una resolución muy alta y un tamaño de archivo razonablemente pequeño. La parte densidad 600 del comando especifica que el png debe tener una resolución de 600 píxeles/pulgadas.

Ajustes adicionales - Color de fondo

Las conversiones a png con ImageMagick tienen fondo transparente por defecto. Si desea que su imagen tenga un color (blanco, por ejemplo), entonces debe agregar -background white -flatten al comando. Así:

convert -density 600 -background white -flatten filename.pdf filename.png

Ajustes adicionales …

ImageMagick tiene muchas opciones. Pruebe algunas búsquedas en Internet sobre las opciones, o escriba el siguiente comando directamente en el terminal:

convert --help

Nota: Uso de herramientas incluidas en MacOS

La aplicación de vista previa de MacOS (Preview.app) puede exportar cualquier pdf en formato png en cualquier resolución (Archivo> Exportar ..., y seleccione png como formato de salida). La desventaja es que estas conversiones son algo grandes en comparación con el método que describí anteriormente, y es difícil “automatizar”. Sin embargo, ¡puede ser más fácil para muchas personas!

Conversión de pdf a svg

Como mencioné anteriormente, decidí usar archivos png en este blog porque podía usarlos en diferentes contextos aparte de este sitio web. En todo caso, probé varios métodos para producir svg a partir de los pdf de TikZ y encontré al menos un método que produce tamaños de archivo similares que los png de 600 pixeles/pulgada.

La ruta TikZ -> pdf -> svg

Se puede generar un svg directamente desde el pdf de TikZ con el programa pdf2svg de David Barton ( código fuente).

Instalar pdf2svg es muy fácil con Homebrew (ejecute el comando en la terminal):

brew install pdf2svg

Una vez instalado, la conversión se realiza con el comando:

pdf2svg input_filename.pdf output_filename.svg

La ruta TikZ -> dvi -> svg

Esta es una ruta alterna que no logré hacer que funcionara con mis imágenes. Usa dvisvgm. No sé si es mejor que la otra opción svg que describí anteriormente. Mi computador se quejaba de los especiales de PostScript. Estos son dos enlaces que pueden ayudar a alguien que quiere tratar con esta ruta en MacOS: uno y dos.

Ejemplo completo

Esta es una imagen que utilicé en esta entrada en la cual usar TikZ me ahorró mucho tiempo pues pude generar con facilidad gráficas para diferentes períodos de tiempo simplemente cambiando un número en el código TikZ.

Estos son los tamaños de archivo de varios formatos asociados con esta imagen.

Formato Tamaño de archivo
TikZ source file (¡diminuto!) 3kb
Gráfica vectorial pdf de TikZ output 42kb
Conversión a svg con pdf2svg 128kb
Conversión a png con ImageMagick y 600 pixeles/pulgada 156kb
Conversión a png con Preview.app de MacOS a 600 pixeles/pulgada 309kb

En mi pantalla no alcanzo a notar muchas diferencias entre cada versión. Ver las imágenes a continuación.

Versión svg creada con pdf2svg:

Versión png creada con ImageMagick:

Versión png creada con Preview.app:

Resumen

Si desea generar un png de alta resolución de tamaño relativamente pequeño para una imagen TikZ, solo asegúrese de tener ImageMagick instalado y en la Terminal correr:

convert -density 600 filename.pdf filename.png

o (si desea un fondo blanco en lugar de uno transparente)

convert -density 600 -background white -flatten filename.pdf filename.png

Suscríbase

¿Quiere recibir un email cuando haya una nueva entrada de blog? Suscríbase acá.