Cuaderno de GNUtas

Evaluar código LaTeX en Org Mode

La verdad es que no había usado demasiado hasta ahora la función incluida en Org Mode para evaluar código, entre otras cosas porque no me dedico profesionalmente a programar. Pero estos días en que ando trabajando en la composición tipográfica de un libro enorme, con un preámbulo (para LuaLaTeX) descomunal, resulta que me viene de perlas para ir haciendo (muchas) pruebas de diseño, e ir trasteando aquí y allá con pequeños tramos de código. La forma con que lo hago, y la que me parece más efectiva, es la siguiente.

Lo primero de todo, copio el larguísimo preámbulo del libro y lo guardo en un documento *.tex. Nombrándolo, por ejemplo, como preámbulo.tex. Este preámbulo se cargará cada vez que evalúe código nuevo, por tanto las pruebas siempre serán coherentes con el libro donde quiero introducir ese código. Si es algún macro paquete, me aseguro también de que no interfiera con otros en el preámbulo, ya de por sí muy cargado de paquetes y de comandos personalizados.

A continuación, necesito definir una clase de LaTeX nueva para el exportador de Org a LaTeX. Estas clases vienen a ser como plantillas de exportación. La que necesito crear es muy simple: sólo va a cargar el preámbulo por medio de un \input{}. Quedaría así (ojo con los caracteres de escape para la barra invertida de los comandos LaTeX). La clase podemos llamarla prueba-org:

(add-to-list 'org-latex-classes
      '("prueba-org"
         "\\input{/ruta/hacia/preámbulo.tex} ;; aquí cargamos el preámbulo
         [NO-DEFAULT-PACKAGES]
         [PACKAGES]
         [EXTRA]"
         ("\\section{%s}" . "\\section*{%s}")
         ("\\subsection{%s}" . "\\subsection*{%s}")
         ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
         ("\\paragraph{%s}" . "\\paragraph*{%s}")
         ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

Esta clase la podemos incluir en algún lugar de nuestro archivo de inicio o (mejor) crear un archivo específico para las clases de exportación de Org a LaTeX (por ejemplo, orglatexclases.el) y guardarlo en una ruta conocida por Emacs, como ~/.emacs.d/lisp

Y en realidad ya está (casi) todo. Ahora, en mi documento de org donde voy anotando cosas e incidencias sobre el libro que estoy componiendo, puedo ir creando bloques de código LaTeX para evaluar. Por ejemplo, uno muy sencillo:

#+begin_src latex
\section{Hola mundo.}
#+end_src

Ah, pero necesitamos primero añadir el lenguaje LaTeX a la lista de códigos a evaluar. En nuestro ~/.emacs escribimos:

;; para org-babel (evaluar LaTeX)

(org-babel-do-load-languages
  'org-babel-load-languages '((latex . t)))

Cargamos nuestra clase prueba-org en la cebecera del documento:

#+LaTeX_CLASS: prueba-org

Y ahora ya podemos evaluar nuestro bloque de código, que conviene que esté en un sub árbol y aislado en un búfer indirecto, para que sólo se nos exporte a LaTeX esa parte y no el resto de nuestro documento de Org. Así pues, exportamos nuestro búfer a LaTeX (teclas C-e l L) y en el mini búfer veremos que Emacs nos pregunta si queremos que nuestro sistema evalúe el código. Decimos que sí y entonces ya tenemos en un periquete nuestro documento LaTeX preparado con el preámbulo y el código que queremos probar. Por supuesto, podemos exportar también eso directamente a PDF: teclas C-e l o. También podemos añadir más elementos al preámbulo mediante la opción #+LaTeX_header: en la cabecera de nuestro documento Org.

evaluar.png

Estrambote:

¿Y qué hacer si en otro contexto en que queramos exportar nuestro bloque de código a LaTeX no deseamos que se nos pregunte por evaluar el código y que éste se exporte como un simple verbatim de LaTeX? Simple. Basta con añadir a nuestro bloque de código el atributo :exports con el valor code:

#+begin_src latex :exports code
\section{Hola mundo.}
#+end_src

Actualización de [2019-07-03 mié]

Y si queremos evitar la pregunta de confirmación para evaluar los bloques de código de forma global a lo largo de todo un documento, podemos indicarlo mediante una variable local, escribiendo al principio de nuestro documento:

# -*- org-confirm-babel-evaluate: nil -*-

Publicado: 03/03/2019

Última actualización: 03/03/2019


Índice general

Acerca de...

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

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