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.
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
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
Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.