Cuaderno de GNUtas

Convertir de Org a LaTeX con versos numerados

Desde hace un tiempo vengo trabajando en la traducción de la Odisea, empresa que supone ya una odisea en sí misma, empezando (cómo no) por el formato textual con que realizar la traducción. Después de mucho vagar, finalmente he encontrado mi Ítaca particular en el Org Mode de Emacs. Las razones son diversas, pero algo de eso ya lo expliqué (creo) aquí.

El caso es que, de vez en cuando, necesito contar con una salida limpia y simple a PDF de mi trabajo en curso, que incluya una numeración al margen de los versos de cada canto, un índice previo y poco más. La salida impecable a PDF nos la proporciona LATEX, y para la conversión desde el formato Org (y en este caso concreto) lo más sencillo que he encontrado es echar mano de los propios conversores nativos de Org Mode en Emacs, ya que con Pandoc necesitaba dos pasos para obtener el PDF con el contenido tal y como quería.

El proceso de conversión de Org a LATEX desde Emacs es muy sencillo y rápido, pero primero necesitaba hacer unos cuantos ajustes. Lo más importante era conseguir que el archivo *.tex resultante tuviese un preámbulo personalizado, algo similar a lo que supone usar una plantilla de LATEX en Pandoc. Dicho preámbulo no sería demasiado extenso, pues casi todo lo que necesito lo cargo llamando a un archivo *.sty creado por mí (normal-lua.sty) con una serie de macros y paquetes. A continuación se incluirían un par de definiciones de títulos, estilos de página e índice de contenidos (con los paquetes titlesec y titletoc, cargados ya en mi archivo *.sty) y un par de comandos para numerar los versos. Sobre esto, hay que tener en cuenta lo siguiente.

En Org Mode, una serie de versos se representa dentro de un bloque llamado VERSE:

#+BEGIN_VERSE
La princesa está triste... ¿Qué tendrá la princesa?
Los suspiros se escapan de su boca de fresa,
que ha perdido la risa, que ha perdido el color.
La princesa está pálida en su silla de oro,
está mudo el teclado de su clave sonoro,
y en un vaso, olvidada, se desmaya una flor.
#+END_VERSE

Tras convertirlo a LATEX, el resultado sería éste, con el entorno verse estándar:

\begin{verse}
La princesa está triste... ¿Qué tendrá la princesa?\\
Los suspiros se escapan de su boca de fresa,\\
que ha perdido la risa, que ha perdido el color.\\
La princesa está pálida en su silla de oro,\\
está mudo el teclado de su clave sonoro,\\
y en un vaso, olvidada, se desmaya una flor.\\
\end{verse}

Para que esos versos se numeren al margen, se puede echar mano del paquete verse, que ofrece el comando \poemlines{<SECUENCIA DE LA NUMERACIÓN>} para ser incluído dentro del entorno verse. A fin de no tener que hacerlo a mano luego en cada canto, dentro del archivo *.tex resultante, podemos redefinir antes el entorno verse así:

\let\oldverse\verse
\renewenvironment{verse}
{\begin{oldverse}\poemlines{5}}
{\end{oldverse}\par}

Ya tenemos decidido todo lo que incluirá nuestro preámbulo. Ahora falta crear una plantilla. Para ello añadiremos a nuestro archivo ~/.emacs una nueva clase org-latex que pueda entender el exportador. La sintaxis se explica prolijamente en este tutorial, pero la estructura básica vendría a ser así (cuidado con la barra invertida de los comandos LATEX: debe escribirse en lisp con su carácter de escape \\):

;; Clase personalizada para exportar la Odisea de Org a LaTeX

(add-to-list 'org-latex-classes
      '("odisea-org"  ;; Aquí indicamos el nombre de nuestra clase
         "\\documentclass[11pt]{article}
          \\usepackage{normal-lua}
          \\usepackage{titletoc}
          \\titlecontents{section}[0em]{}{}{}{\\titlerule*[1pc]{.}\\contentspage}
          \\setmainfont[Numbers=OldStyle]{Linux Libertine}
          \\newpagestyle{canto}{\\headrule\\sethead[][\\small\\itshape Odisea -- \\sectiontitle][]{}{\\small\\itshape Odisea -- \\sectiontitle}{}\\setfoot[][\\thepage][]{}{\\thepage}{}}
          \\pagestyle{canto}
          \\newcommand{\\sectionbreak}{\\clearpage}
          \\assignpagestyle{\\section}{canto}
          \\titleformat{\\section}{\\thispagestyle{plain}\\addfontfeature{Letters=Uppercase,Kerning=Uppercase,LetterSpace=2.0}\\centering\\fontsize{11pt}{13.2pt}\\selectfont\\mdseries}{}{0em}{}
          \\titlespacing{\\section}{0pt}{0pt}{26.4pt}
          \\let\\oldverse\\verse
          \\renewenvironment{verse}{\\begin{oldverse}\\poemlines{5}}{\\end{oldverse}\\par}
          [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}")))

Ya sólo queda añadir #+LaTeX_CLASS: odisea-org al principio de nuestro documento *.org para que el exportador lea la nueva clase. Así, de hecho, se encabeza mi traducción de la Odisea:

#+TITLE: Odisea
#+AUTHOR: Traducción: Juan Manuel Macías
#+DATE: En algún lugar de vuelta a Ítaca -- \today
#+LaTeX_CLASS: odisea-org

Y ya podemos exportar nuestro Org a LATEX cuando queramos. Podemos, por ejemplo, introducir la orden básica para abrir el exportador: C-c C-e, y teclear a continuación l-L, si queremos que se nos abra un nuevo buffer con el archivo *.tex generado. Una de las cosas gratas, por cierto, que tiene este procedimiento es que podemos exportar todo el documento Org o, simplemente, uno de los árboles secundarios. Por ejemplo, si queremos exportar el sub-árbol que incluye el canto 7, nos situamos en éste, tecleamos C-c C-x b, y se nos mandaría a un buffer nuevo para poder exportarlo desde allí, con las opciones del encabezado del documento padre, o incluso con otro encabezado distinto que deseáramos añadirle ad hoc.

orglatex1.png

Podemos también, por último, exportar directamente a PDF y hacer que éste se abra dentro de Emacs. Volvemos a abrir el exportador con C-c C-e, pero esta vez tecleamos l-o. Ahora bien, como yo quiero que use LuaTeX para compilar, en lugar de pdfTeX, añado estas líneas a mi ~/.emacs:

;; exportar de Org a PDF con LuaLaTeX por defecto

(setq org-latex-pdf-process
      '("lualatex -shell-escape -interaction nonstopmode %f"
        "lualatex -shell-escape -interaction nonstopmode %f"))

orglatex2.png

Actualización de 2019-06-12

Si queremos que nuestra salida de exportación a LATEX numere los versos, hay otra opción más sencilla, por lo que tiene de «org-céntrica». la idea es definir un filtro mediante una función que habrá de anclarse a un contexto específico o un paso concreto del post-proceso. Dicha función, además, podemos incluirla dentro de nuestro documento Org (en un bloque de código) a fin de que sea evaluada al ejecutar la exportación. Algo así como esto:

#+begin_src emacs-lisp :exports results :results none
(defun mi-filtro-versos (canto backend info)
  "añade números de línea"
(when (org-export-derived-backend-p backend 'latex)
(replace-regexp-in-string "\\\\begin{verse}"  "\\\\begin{verse}\\\\poemlines{5}" canto)))
#+end_src

Y justo antes de este bloque, añadimos:

#+BIND: org-export-filter-verse-block-functions (mi-filtro-versos)

Para que la función se ejecute sólo dentro del contexto de un bloque VERSE, y sólo si se exporta a LATEX. También es necesario añadir, al final de nuestro documento:

# Local Variables:
# org-export-allow-bind-keywords: t
# End:

si queremos que esa variable sea local. De lo contrario, en nuestro /.emacs, añadiremos:

(setq org-export-allow-bind-keywords t)

Publicado: 16/08/2018

Última actualización: 21/01/22


Í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