Cuaderno de GNUtas

Evaluar bloques de código LaTeX en Org como una imagen PNG

A menudo necesito probar pequeños fragmentos de código LATEX, y para ello he encontrado tremendamente útiles (una vez más) los bloques de código de Org Mode. Mi rutina en estos procedimientos viene a ser la siguiente y con este orden:

  1. Evaluar el contenido del bloque de código LATEX de forma que el resultado de la compilación no sea un PDF sino una imagen *.png*
  2. Esa imagen *.png*, por supuesto, se incluirá justo debajo del bloque evaluado

Esto me permite almacenar en un único documento de Org gran cantidad de fragmentos de código LaTeX, cada uno con su correspondiente resultado en imagen. Y poder exportar a cualquier formato (por ejemplo LATEX o HTML) tanto el código como su salida. Algo muy práctico y útil también para generar rápidamente ejemplos o para tomar notas de la documentación de algún paquete. Por último, cuando el código se exporta a LATEX usamos siempre el paquete minted, del cual ya hablamos en esta otra gnuta.

Org nos permite de fábrica poder evaluar un bloque LATEX como PNG, por medio de la biblioteca imagemacick, pero encuentro la configuración por defecto un tanto limitada y, además, prefiero usar como clase por defecto standalone, que nos compilará sólo el contenido con una anchura variable y adaptada a éste (algo esencial) gracias a la opción varwidth. Lo que viene a hacer Org cuando evaluamos el bloque de código es generar un archivo LATEX temporal, luego lo compila y produce el PDF. Como ese PDF lo queremos en PNG, tendremos que añadir a nuestro bloque de código el argumento de encabezado (header argument) :imagemagick yes.

Pero vayamos por partes. Primero queremos un preámbulo personalizado a nuestro gusto en los documentos LATEX que nos generará Org en la evaluación del código. Y, sobre todo, que use la clase standalone y no article. Para lograrlo, tenemos que dar un nuevo valor a la variable org-format-latex-header, por ejemplo así (escogemos un formato minimalista):

(setq org-format-latex-header "\\documentclass[varwidth]{standalone}
   \n\\usepackage{xcolor}
   \n\\pagecolor[RGB]{255,255,254}
   \[PACKAGES]
    \[DEFAULT-PACKAGES]
    \\pagestyle{empty})

Es decir, que incluimos la clase standalone con la opción que nos interesa (varwidth), cargamos el paquete xcolor y cambiamos el color de la página para que no nos salga transparente el *.png (esto tampoco es necesario, pero cuando uso un tema oscuro en Emacs el resultado me resulta algo incómodo). Si necesitamos luego añadir más paquetes o configuración al preámbulo, usaremos el argumento de encabezado :headers, del que hablaremos más abajo.

A continuación, para insertar cómodamente nuestros bloques de LATEX especiales, se me ocurrió escribir esta función que automatiza dos cosas: la inclusión de los varios argumentos de encabezado que necesitamos añadir (sería un poco pesado ponerlos a mano cada vez) y el nombre del archivo *.png resultante, que será un número aleatorio (igualmente, para evitarme el tener que nombrarlo manualmente una y otra vez):

(defun inserta-mi-bloque-latex ()
  (interactive)
  (org-insert-structure-template "src")
  (save-excursion
    (end-of-line)
    (insert (concat ":exports both latex :imagemagick yes :iminoptions -density 600 :results raw :results file :file " (number-to-string (random)) ".png"))))

Imaginemos que queremos evaluar un poco de código del paquete pgfornament. Nuestro bloque de código LATEX quedaría entonces tal que así (cargando antes el paquete pgfornament con el argumento de encabezado :header):

#+header: :headers '("\\usepackage{pgfornament}")
#+begin_src latex :exports both :imagemagick yes :iminoptions -density 600 :results raw :results file :file -2113881425392262803.png

\pgfornament[opacity=0.4,width=4cm]{88}

\bigskip

\pgfornament[width=5cm]{77}

\bigskip

\pgfornament[color=MidnightBlue,width=2cm,ydelta=-10pt]{25}%
\pgfornament[color=PineGreen,width=2cm]{25}%
\pgfornament[color=Periwinkle,width=2cm,ydelta=+10pt]{25}%

#+end_src

Y, una vez evaluado nuestro bloque1:

latex-org-png.png

Figura 1: Evaluando un bloque de código LATEX como PNG

Este breve vídeo ilustra algo más el proceso en acción:

Evaluar un bloque de código LaTeX en Org con salida a PNG from Juan Manuel Macías Chaín on Vimeo.

Publicado: 08/07/20

Última actualización: 08/07/20


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

Notas:

1

Para poder ver la imagen dentro del documento, es necesario evaluar org-toggle-inline-images, asociado al atajo C-c C-x C-v. Y para que las imágenes no se desplieguen con su ancho real, podemos también forzar un ancho fijo en todos los documentos, con esta variable: (setq org-image-actual-width 500)

© Juan Manuel Macías
Creado con esmero en
GNU Emacs