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