Cuaderno de GNUtas

Notas en Org no exportables

Una funcionalidad muy interesante que echo en falta en Org Mode es la de poder ignorar de manera arbitraria algunas notas al pie durante el proceso de exportación. Podemos, por supuesto, ignorarlas o activarlas todas en bloque, si añadimos a nuestra cabecera las opciones #+OPTIONS: fn:nil / #+OPTIONS: fn:t, respectivamente. Pero lo que yo quiero es ser capaz de dejar algunas en concreto de lado, mientras que el resto sean exportadas de manera normal. Creo que es una forma más y muy efectiva de gestionar un corpus marginal para mi consumo privado. Bien es cierto que en Org tenemos para ese fin opciones muy útiles, como los meros comentarios o los drawers («cajones») desplegables que sirven para un roto como para un descosido. Pero hay contextos donde una nota al pie con carácter secreto se vuelve indispensable, entre otras cosas por la gran agilidad de navegación correlativa entre marca de nota y referencia. O porque no queremos alterar una determinada sucesión de líneas al insertar un bloque de comentario o un cajón. Un ejemplo que me viene muy a mano es el de un poema largo, como en mi traducción de la Odisea (work in progress).

Así las cosas, ¿qué podemos hacer? Se imponen tres posibles soluciones:

  1. Esperar a que los desarrolladores de Org implementen la funcionalidad, cosa poco probable, pues no parece que sea algo muy demandado.
  2. Echarse al monte y ponerse a hacer código duro, como San Ignucio manda, e implementarla nosotros mismos.
  3. No echarse al monte sino salir a pasear por el solar de la esquina, y probar un remiendo chapucero pero que, sin embargo (y ante nuestra sorpresa), funcione.

Naturalmente, yo he seguido la tercera vía, y aquí resumo un poco por encima los pormenores. Se basa en dos cosas que tienen Emacs y Org, tremendamente útiles: su potente sistema (aunque también doloroso y muchas veces arcano) de expresiones regulares y la posibilidad de ejecutar funciones de elisp en la exportación desde Org, y hacerlo en los momentos tempranos, antes de que se expandan los comandos, y sólo si el formato de salida es uno determinado. Sobre esto último ya hablamos aquí.

Empezamos, primero, por definir una sencilla función que nos inserte una nota al pie con unas marcas especiales, tanto en la llamada de la nota como en su referencia. Será, pues, reconocida como una nota no exportable.

(defun nota-org-no-exportable ()
  (interactive)
  (insert "[email protected]!")
  (org-footnote-action)
  (insert "⁜no-exp⁜:")
  (newline 1)
  (save-excursion
    (insert "
#+end_comment")))

Como se ve, la marca de esta nota comenzará por los caracteres [email protected]!, y el cuerpo de la nota estará delimitado por las cadenas ⁜no-exp⁜: y = #+endcomment=, ambos encerrados entre sendos símbolos que Unicode denomina DOTTED CROSS. En la fig. 1 se muestra el aspecto que tendría nuestra nueva nota. Dado que ya tenemos todo convenientemente delimitado y marcado, no es difícil definir una función que efectúe las correspondientes sustituciones mediante expresiones regulares, a fin de «anularnos» las notas así marcadas, y anclar nuestra función al pre-proceso de exportación. Coser y cantar. El cuerpo de la nota es fácil de eliminar. Basta con convertirlo a un bloque de comentario. Pero no podemos hacer lo mismo con la marca de la nota, ya que los comentarios de Org no pueden añadirse en medio de un texto. Pero podríamos encerrar ese texto en algo que Org no entienda como exportable a un formato determinado y sí a otro. Por ejemplo, si exportamos a HTML, se encerraría entre la secuencia @@latex: ... @@, que es un apaño que se emplea en Org para indicar que un pasaje determinado sólo ha de ser exportado a LaTeX, ODT, HTML, etc. Según lo que se escriba tras las primeras dos arrobas. Y aquí es donde está la parte chapuza de nuestra solución: que tendremos que ir cambiando esa parte (por suerte, sólo es eso) para engañar a Org en los distintos contextos de exportación.

nota_no_exp.png

Figura 1: Ejemplo de nuestra nota «no exportable»

Nuestra función, entonces, luciría tal que así para ignorar las notas no exportables en la salida a HTML:

(defun no-exportar-notas-html (backend)
  "evita exportar las notas marcadas a html"
  (when  (eq backend 'html)
    (org-occur "[email protected]!\\[fn:\\([[:digit:]]+\\)\\]")
    (save-excursion
      (goto-char (point-min))
      (replace-regexp "[email protected]!\\[fn:\\([[:digit:]]+\\)\\]" "@@latex:[fn:\1]@@" nil))
    (org-occur "^\\[fn:\\(.+\\)\\]⁜no-exp⁜:")
    (save-excursion
      (goto-char (point-min))
      (replace-regexp "^\\[fn:\\(.+\\)\\]⁜no-exp⁜:" "#+begin_comment\n" nil))
    (org-occur "
#+end_comment")
    (save-excursion
      (goto-char (point-min))
      (replace-regexp "
#+end_comment" "\n#+end_comment" nil))))

Y para anclarla al pre-proceso de exportación, añadimos también lo siguiente a nuestro /.emacs:

(add-hook 'org-export-before-processing-hook #'no-exportar-notas-html)

Así, cada vez que exportemos a HTML, nuestras notas no exportables quedarán en la más absoluta ignorancia. Para reconocer bien en nuestro texto las marcas que añadimos a dichas notas, podemos también definir un resaltado por color:

(defvar nota-muda (make-face 'nota-muda))
(set-face-foreground 'nota-muda "chocolate")

(font-lock-add-keywords
 'org-mode
 '(("⁜\\(.+\\)⁜" 0 nota-muda) ; esto para el cuerpo de la nota
   ("[email protected]!\\[fn:[[:digit:]]+\\]" 0 nota-muda) ; y esto para la marca de la nota
 ))

Publicado: 11/07/2019

Última actualización: 11/07/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