Cuaderno de GNUtas

Macros de sustitución en Org Mode para Babel (LaTeX)

Cuando se trabaja en un documento de LaTeX desde el Org Mode de Emacs, desearemos en ocasiones que ciertos pasajes cortos en lenguas extranjeras pasen a LaTeX formados con el comando típico de Babel \foreignlanguage{<lengua>}{<pasaje>}. Podemos introducir este comando directamente en Org, pero si exportásemos a otros formatos perderíamos el pasaje (o nos aparecería explícitamente el \foreignlanguage{}{}) y tendríamos que andar retocando el documento, lo cual es una lata. Para salir del paso, he descubierto que aquí son muy útiles las macros de sustitución de Org, que permiten sustituir una cadena por «comodines» y evaluar, además, algo de código elisp en la parte que sustituye. Ya tratamos aquí algún que otro ejemplo de estas macros en una pasada gnuta. Veamos ahora un par de ejemplos más para la salida a LaTeX con Babel.

Podemos definir, en principio, una macro de sustitución que incluye un simple condicional: si el pasaje extranjero se exporta a LaTeX, entonces se forma con Babel. Si es a cualquier otro formato (HTML, ODT, EPUB, etc.), se exporta tal cual. Esta primera macro admitiría dos argumentos: el nombre de la lengua, según Babel, y el pasaje en esa lengua.

#+TITLE:Prueba con macros de sustitución para idiomas
#+LaTeX_Header: \usepackage[greek.ancient,spanish]{babel}

#+MACRO: lg (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) (concat "@@latex:\\foreignlanguage{@@" $1 "@@latex:}{@@" $2 "@@latex:}@@") $2))

Esto es una prueba de texto griego con la primera macro: {{{lg(greek,ἄνθρωπος)}}}

Si exportamos a LaTeX obtendremos, entonces, \foreignlanguage{greek}{ἄνθρωπος}. Así nos aseguramos de que TeX cortará por guiones (si se presentase el contexto) correctamente esta palabra, según los patrones de guionado y silabación para griego antiguo, tal y como hemos definido en las opciones de Babel al cargar greek con el atributo ancient1.

Otra posible macro a definir tendría sólo un argumento (la palabra o pasaje en lengua extranjera). Eso sí, tendríamos que definir tantas macros como lenguas quisiésemos cargar en nuestro documento.

#+MACRO: gr (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) (concat "@@latex:\\foreignlanguage{greek}{@@" $1 "@@latex:}@@") $1))

... Y esto es otro ejemplo con la segunda macro: {{{gr(ἄνθρωπος)}}}

Así, si hubiesemos cargado (pongo por caso) también latín y alemán, definiríamos estas dos más:

#+TITLE:Prueba con macros de sustitución para idiomas
#+LaTeX_Header: \usepackage[greek.ancient,latin,german,spanish]{babel}

#+MACRO: lat (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) (concat "@@latex:\\foreignlanguage{latin}{@@" $1 "@@latex:}@@") $1))
#+MACRO: ger (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) (concat "@@latex:\\foreignlanguage{german}{@@" $1 "@@latex:}@@") $1))

... Y otro ejemplo más con un pasaje en latín: {{{lat(Delenda est Cartago)}}}

o en alemán: {{{ger(Goldner Schlaf, nur dessen Herz zufrieden)}}}

Publicado: 27/08/2019

Última actualización: 27/08/2019


Índice general

Acerca de...

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

Notas:

1

Recordemos que Babel ofrece tres posibles atributos para la opción greek: monotónico, politónico y griego antiguo

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