martes, 24 de marzo de 2009

HAL y las marcas (Markdown y Pandoc)

No es improbable que el lector impaciente se canse de tanta marca y decida seguir trabajando con los medios que ya conoce, que no son otros que los omnipresentes procesadores de textos. Dirá que ya le costó lo suyo desenvolverse en los complejos menús del procesador como para ponerse ahora a cambiar toda su forma de escritura por unos enigmáticos "códigos" más que difíciles de teclear y peores de aprender. Insistirá en que para la Web le bastan los formularios de su plataforma de blogging, con sus perfectas barras de herramientas, tan estupendamente semejantes a las de los procesadores de texto. Concederá, finalmente, con inconfesada ironía, que el resultado con LaTeX es sorprendentemente bonito, pero total, para la cuatro cosas que va a escribir...

Estos son los argumentos habituales que esgrimen los usuarios que podríamos calificar propiamente y sin intención ofensiva alguna como usuarios "esclavos", pues es esclavo quien permanece completamente atado a la tecnología que, de un modo un otro, le es impuesta, ya porque constituye la corriente dominante, ya porque es la primera que aprendió o, tal vez con mayor probabilidad, por ambas cosas juntas. Tales argumentos no son, en el fondo, más que racionalizaciones pergeñadas con el único fin de continuar encastillado en una posición inamovible.

Ni HTML ni LaTeX son más difíciles de aprender que las innumerables opciones de menú de los procesadores de textos. En realidad, es mucho más natural plantear la tarea de escribir un documento electrónico cuando se establece de antemano una separación clara entre la estructura de su contenido y su forma de presentación.

Podríamos llegar a aceptar que la introducción de las marcas, particularmente en el caso de HTML, mucho más prolijo en esto que LaTeX, puede llegar a ser bastante pesada, si no se dispone de las herramientas que para esta tarea proporcionan editores como Vim o Emacs. Pero, como vamos a ver hoy, hasta este último baluarte de la recalcitrante defensa del procesador de textos, cae ante la presencia de los lenguajes de marcas "ligeros" como Markdown, que es el representante que hemos escogido de entre los muchos existentes.

No hay forma de sostener racionalmente la indiferencia displicente ante los lenguajes de marcas cuando nos hallamos ante caso tan natural como el siguiente:

% Un ejemplo de Markdown
% átopos
% 25 de Marzo de 2009

# Navegación gráfica
Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:

1. Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).
2. Crear en _Vim_ una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden `:new ruta_fichero`.

# Navegación desde consola
Si navegamos con _w3m_, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio _Vim_, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.

Con _w3m_ el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción `-dump`. Por ejemplo:

    w3m -dump http://www.w3.org/TR/html401/struct/lists.html

nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.

Esto ya parece dar gato por libre. ¿Dónde están las marcas? ¿No es éste el texto tal cual lo hubiéramos escrito, de no existir el maravilloso procesador de textos? ¡Menudo avance! ¡Un regreso a las cavernas!

Fíjese bien el lector incrédulo, porque las marcas siguen estando, pero reducidas a su más mínima expresión [El signo indica un espacio]:

% Un ejemplo de Markdown
% átopos
% 25 de Marzo de 2009

# Navegación gráfica
Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:

1.¶Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).
2.¶Crear en _Vim_ una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden `:new ruta_fichero`.

# Navegación desde consola
Si navegamos con _w3m_, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio _Vim_, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.

Con _w3m_ el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción `-dump`. Por ejemplo:

¶¶¶¶w3m -dump http://www.w3.org/TR/html401/struct/lists.html

nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.

Las equivalencias con nuestras marcas informales, (incluidos los añadidos de los últimos días), que frente a tal simplicidad resultan terriblemente embarazosas, son transparentes como la luz de un día radiante. Hagásmolas explícitas, por si alguien sigue todavía encerrado entre cuatro paredes:

TÍTULO, AUTOR y FECHA:
%

INICIO TÍTULO SECCIÓN:
#

FIN TÍTULO SECCIÓN
[No necesario]

INICIO SECCIÓN
[No necesario]

FIN SECCIÓN
[No necesario]

INICIO PÁRRAFO
Línea en blanco

FIN PÁRRAFO
[No necesario]

INICIO LISTA NUMERADA
[No necesario]

FIN LISTA NUMERADA
[No necesario]

INICIO ELEMENTO LISTA
1.¶ [y 2. , etc, para los siguientes elementos]

FIN ELEMENTO LISTA
[No necesario]

INICIO NOMBRE PROGRAMA
_ [guión bajo]

FIN NOMBRE PROGRAMA
_

INICIO OPCIÓN
` [acento grave]

FIN OPCIÓN
`

INICIO ORDEN
`

FIN ORDEN
`

INICIO BLOQUE ORDEN
¶¶¶¶

FIN BLOQUE ORDEN
[No necesario]


Estas marcas, excepto la primera, pertenecen al lenguaje de marcas ligero conocido como Markdown. Su sintaxis completa se explica aquí. La única precaución que hay que tomar es, como cabe esperar, la de escapar las marcas de Markdown cuando se van a introducir como caracteres literales en el texto corriente. Por ejemplo, para introducir literalmente un asterisco (*) tendremos que escribir \*. Quedan excluidos los casos en que esos signos aparecen dentro de un fragmento de código (entre acentos graves) o en los bloques de código (que se identifican, como hemos visto, por su sangría de cuatro espacios). A las marcas de Markdown se pueden añadir algunas otras, por ejemplo, la barra (|) para señalar una celda de una tabla. Este conjunto de extensiones se conoce como Markdown Extra.

Bien, las marcas fáciles, facilísimas, están ahí. ¿Qué podemos hacer con ellas? Los enterados saben que son la base, por ejemplo, de muchos sistemas de wikis. Pero nosotros no tenemos un wiki, todavía. No hace falta pensar, sin embargo, en aplicaciones especializadas. Los lenguajes de marcas ligeros pueden servir para escribir nuestros documentos y para que ayudantes especiales de HAL nos los devuelvan en un formato apto para su presentación, ya sea en la web o, incluso, en bella versión imprimible.

Pandoc es uno de estos eficientes colaboradores de HAL. Se trata de un conversor universal de un lenguaje de marcas a otro. Emplea las mismas marcas de Markdown y Markdown Extra con algunas extensiones y mejoras, como la marca % para elementos del encabezado. Las variantes de Pandoc en relación con Markdown / Markdown Extra se pueden consultar aquí.

Pandoc está disponible en Debian y se puede instalar como cualquier paquete:

aptitude install pandoc

Con Pandoc la conversión de nuestro texto a HTML, LaTeX y otros muchos lenguajes de marcas es cosa de niños, basta con pedírselo a HAL.

Supongamos que el texto anterior lo guardamos en el fichero texto_etiquetado-pandoc.mdml (la extensión mdml, que es opcional, es una abreviatura de MarkDown Markup Language). En tal caso, podríamos solicitar a HAL lo siguiente:

HAL, llama a tu ayudante en conversión de marcas para que convierta 'texto_etiquetado-pandoc.mdml' de [from] Markdown a [to] HTML.

Que se puede expresar así:

pandoc -f markdown -t html texto_etiquetado-pandoc.mdml

HAL nos devolverá el texto marcado con HTML, un HTML muy parecido al que obtuvimos hace unos días, aunque con un formato distinto, que en ningún caso afecta a la interpretación que un navegador hará de él. De hecho, la salida de pandoc se puede enviar directamente a w3m mediante una tubería:

pandoc -f markdown -t html texto_etiquetado-pandoc.mdml | w3m -T text/html

Se advertirá que en el HTML resultante no hay rastro de lo marcado con %, esto es, título, autor y fecha. Esta información se debería integrar en la cabecera de HTML (la etiqueta HEAD), pero pandoc la descarta por defecto, a menos que le indiquemos lo contrario con la opción --standalone (= autónomo), o -s, en versión abreviada. Con esta opción activada, pandoc crea un documento autónomo, un HTML completo con su declaración de documento y su oportuna cabecera. Podemos volver a ejecutar la orden, redirigir el resultado a w3m y, por medio de la orden v de w3m, inspeccionar el HTML.

pandoc -s -f markdown -t html texto_etiquetado-pandoc.mdml | w3m -T text/html

La conversión a LaTeX sigue los mismos derroteros:

pandoc -f markdown -t latex texto_etiquetado-pandoc.mdml

Y la versión autónoma se obtiene mediante el mismo procedimiento:

pandoc -s -f markdown -t latex texto_etiquetado-pandoc.mdml

El resultado es prácticamente idéntico a uno de los nuestros. La única diferencia reseñable está en el preámbulo del documento, una diferencia que sí afectaría al resultado final del procesamiento con pdflatex. La razón es que pandoc no tiene en cuenta, porque no puede saberlo de antemano, que nuestro texto está escrito en castellano. Tenemos que decírselo explícitamente. La forma de hacerlo es bien simple. Creamos, para empezar, un fichero, llamémoslo preambulo-latex, que contenga nuestro preámbulo, por ejemplo, éste:

\documentclass[a4paper]{article}
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{bera}

Después, se informa a pandoc de nuestro preámbulo para que lo aplique en lugar del que él utliza por defecto. Para ello recurrimos a la opción --custom-header (= cabecera personalizada) o, su versión abreviada, -C:

pandoc -s -C preamulo_latex -f markdown -t latex texto_etiquetado-pandoc.mdml

El resultado se podría redirigir a un fichero para procesarlo más tarde con pdflatex.

Con el fin de evitarnos los pasos intermedios en la generación del PDF, Pandoc proporciona como alternativa rápida el guión markdown2pdf, que generaría un fichero con extensión pdf y el mismo nombre de nuestro fichero original:

markdown2pdf -C preambulo_latex texto_etiquetado-pandoc.mdml

Pandoc, aparte de su facultad para convertir a otros muchos formatos, permite usos más sofisticados, como, por ejemplo, introducir directamente marcas LaTeX en el documento marcado con Markdown que se mantendrán literalmente en el documento resultante, lo que facilita la construcción de documentos LaTeX más elaborados. Todo esta documentado en la página web citada y en el fichero README, que se encuentra en la documentación del paquete Debian: /usr/share/doc/pandoc/README.gz.

Con Markdown y Pandoc finalizamos, de momento, este primer contacto con los lenguajes de marcas. Mucho queda en el tintero. Es casi vergonzoso no haber presentado, en particular, el metalenguaje XML y algunos de los lenguajes de marcas construidos a partir de él. Otra vez será.


Resumen

  • Los lenguajes de marcas ligeros facilitan el tecleado de las marcas y pueden aprenderse en pocos minutos.

  • Markdown es un lenguaje ligero de marcas.

  • Pandoc es un sistema de conversión de lenguajes de marcas, especialmente apropiado para producir documentos LaTeX sencillos a partir de lenguajes de marcas ligeros. Ofrece una interfaz de línea de comandos a través de la orden pandoc y de algún guión, como markdown2pdf, para facilitar la generación de documentos típicos.

2 comentarios:

  1. Amigo Àtopos
    Los pájaros se reencuentran cuando el pienso es apetecible
    http://www.xtec.cat/~jqueralt/2009_06_01_arxiubitacola.html#836933887877485913
    Un saludo.

    ResponderEliminar
  2. Gracias, Joan. Espero que los lectores de este blog sigan el enlace que das a tu comentario sobre pandoc y amplíen, gracias a él, las breves indicaciones dadas aquí.

    Me alegra volver a oírte, después de aquellas primeras charlas sobre lplh, ya hace unos cuantos años ;-)

    ResponderEliminar