martes, 31 de marzo de 2009

HAL y abcde

abcde no es otra cosa que un guión escrito en lengua de HAL para establecer comunicación con los expertos del estilo de los citados el día pasado, sin necesidad de que nosotros mismos tengamos que tratar personalmente con cada uno de ellos.

El uso básico de abcde es tan simple que da casi apuro referirlo:

  • Instalar abcde, que instalará de paso todos los expertos a los va a recurrir y que no estén ya integrados en nuestro sistema:

        aptitude install abcde

  • Introducir el CD de audio en el lector de CDs.

  • Teclear en el terminal simplemente:

        abcde

Por defecto, abcde se ejecutará en modo interactivo. Es decir, nos hará ciertas preguntas sobre el contenido del CD. Veamos cómo funciona sobre un disco del célebre saxofonista Ben Webster.

Tras introducir el CD en el lector de CDs y ejecutar abcde veremos el siguiente mensaje, en el que se muestra información sobre el número de pistas del CD que se grabarán:

Grabbing entire CD - tracks: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

Inmediatamente después, abcde realiza una búsqueda sobre la base de datos de FreeDB y devuelve la información allí contenida sobre nuestro CD:

Retrieving 1 CDDB match...done.
---- Ben Webster / Jazz & Blues 26 ----
1: Randle's Island
2: Old Folks
3: King's Riff
4: You're my Thrill
5: Jive at Six
6: Tenderly
7: Don't get around much any more
8: Pennies from heaven
9: That's all
10: Cotton tail
11: Danny boy
12: Bouce blues
13: Hoot
14: Pouting
15: The iron Man
16: Honeysuckle rose
17: Blue skies
18: Kat's fur

Tras ello nos pregunta si queremos editar dicha información o nos basta con la que FreeDB proporciona:

Edit selected CDDB data? [y/n] (n):

Como no hace falta editar nada, respondemos "no", esto es, pulsamos 'Enter' o 'n' y seguimos adelante.

abcde nos pregunta a continuación si son varios los artistas (en este caso, intérpretes) de la música grabada:

Is the CD multi-artist? [y/n] (n):

El artista principal es Ben Webster y así lo dejaremos, luego seguimos adelante, pulsando 'Enter' o 'n'.

A partir de este momento comienza el proceso de extracción de las pistas por medio de cdparanoia. Para cada pista extraída abcde nos devuelve un mensaje de este tipo:

Grabbing track 01: Randle's Island...
cdparanoia III release 10.2 (September 11, 2008)

Ripping from sector 0 (track 1 [0:00.00])
to sector 14534 (track 1 [3:13.59])

outputting to /home/luis/abcde.170dd912/track01.wav

(== PROGRESS == [ | 014534 00 ] == :^D * ==)

Done.

Aquí, simplemente, abcde nos notifica la extracción de la primera pista que se guardará temporalmente en disco en formato WAV en el directorio /home/luis/abcde.170dd912. Este directorio se crea bajo nuestro home y será eliminado al terminar el proceso. Para la operación de extracción, abcde recurre a cdparanoia. De hecho, los mensajes relativos a la extracción los produce cdparanoia. Especialmente interesante es el mensaje de progreso. A la derecha de dicho mensaje van apareciendo indicaciones semejantes a los smileys o emoticones que se usan en comunicaciones electrónicas. La lista de los smylies que utiliza cdparanoia y de sus significados se puede consultar en la sección 'Output Smilies' de la página de manual de cdparanoia. Puede ser necesario acudir a ella en el caso infrecuente de que surjan problemas en el proceso.

Simultáneamente y para cada pista, abcde codifica, por defecto en formato OGG vía oggenc, los ficheros WAV extraídos, los etiqueta y los guarda en un directorio con un nombre adecuado, en el caso presente Ben_Webster-Jazz_&_Blues_26. El nombre de los ficheros OGG coincide con el nombre de cada pista en la información obtenida por FreeDB. Por ejemplo, el primer fichero, que corresponde a la primera pista del CD de Ben Webster, quedó guardado con el nombre 01.Randles_Island.ogg.

El mensaje final es el informe que devuelve oggenc sobre el proceso de codificación, encubierto hasta ese momento por los mensajes devueltos por cdparanoia, donde consta la calidad, por defecto 3.00 ---a mayor número, mayor calidad y menor compresión---, del fichero OGG resultante y algunos datos estadísticos sobre el proceso de codificación. A ello se añade la notificación de la operación de etiquetado:

Encoding track 18 of 18: Kat's fur...
Opening with wav module: WAV file reader
Encoding "/home/luis/abcde.170dd912/track18.wav" to
"/home/luis/abcde.170dd912/track18.ogg"
at quality 3,00
[ 99,8%] [ 0m00s remaining] -

Done encoding file "/home/luis/abcde.170dd912/track18.ogg"

File length: 2m 59,0s
Elapsed time: 0m 09,6s
Rate: 18,7143
Average bitrate: 97,3 kb/s

Tagging track 18 of 18: Kat's fur...

La ventaja de una sesión interactiva como la descrita es que podemos intervenir en la edición de las etiquetas del CD y sus pistas. Si queremos lo contrario, es decir, que abcde acepte las respuestas por defecto (los "no" anteriores) y actúe sin nuestra intervención, basta añadir la opción -N:

abcde -N

Si en lugar de un fichero OGG, deseamos un fichero FLAC como resultado del proceso, se utiliza la opción -o:

abcde -o flac

Si queremos grabar sólo algunas pistas y no todas, por ejemplo las tres primeras y la última:

abcde 1-3,18

En general, abcde, como casi toda orden de HAL, permite modificar su comportamiento por defecto o especificar más claramente nuestros intereses del momento a través de una amplia gama de opciones. Cuando estas opciones van a ser siempre las mismas, también permite definir variables de configuración a nivel de todo el sistema o para cada usuario en particular. En el primer caso el valor de las variables afectadas se especifica en el fichero de configuración /etc/abcde.conf; en el segundo, en el fichero de configuración de usuario ~/.abcde.conf. Tanto las opciones de línea de órdenes como las variables de configuración vienen suficientemente explicadas en la página de manual de abcde.

Pongamos, para terminar, un ejemplo de fichero de configuración de usuario (~/.abcde.conf), donde consten unas pocas de esas variables. El lector puede indagar y experimentar por su cuenta con otras.

# El formato de recuperación de la información de FreeDB sera UTF-8
CDDBPROTO=6

# Los números de las pistas serán 01, 02, ..., en lugar de 1, 2, ...
PADTRACKS="y"

# La calidad del fichero ogg resultante será de 4 (ver man oggenc)
OGGENCOPTS="-q 4"

# La compresión del fichero flac será la máxima posible (ver man flac)
FLACOPTS="--best"

# El resultado de la extracción se guardará en mi directorio de musica de CDs
# [Cada usuario debe poner aquí su nombre de usuario después de home]
OUTPUTDIR="/home/luis/musica/CDs/abcde"

# El CD se expulsará automáticamente cuando el proceso termine
EJECTCD="y"

lunes, 30 de marzo de 2009

HAL y mis CDs

Si tuviéramos que citar los ámbitos donde el uso de los ordenadores ha transformado nuestro paisaje cotidiano, no podríamos dejar de mencionar el de las aplicaciones de audio y, en concreto, la disponibilidad en formatos de tamaño reducido de la información que anteriormente se distribuía en CDs y que ha permitido la eclosión de los reproductores portátiles de audio, ésos que el lego conoce con el equívoco nombre de "Mp3".

HAL cuenta con un vasto equipo de colaboradores dispuestos a devorar nuestros CDs y convertir la información musical allí guardada en otra más manejable y transportable, así como para reproducirla a nuestro antojo. Durante unos días vamos a dedicarnos a descubrir alguno de ellos. No vaya a ser que luego nos recriminen que HAL está bien para las cosas de la Edad de Piedra, pero no para las innovaciones que el pegadizo ritmo del presente impone. De hecho, alguno de tales colaboradores, en particular, los que bregan en la zona más profunda e ingrata de la fábrica musical, son los auténticos responsables de que nuestras aplicaciones, también las del entorno gráfico, funcionen como lo hacen.

¿Por dónde empezar? Quizá lo primero de todo es aclararse con algunos términos y algunos conceptos en boga, que están en boca de todos y que no pocas veces se utilizan sin saber lo que significan, aunque sea aproximadamente. Los procesos implicados en el procesamiento del audio digital son complejos y es absurdo tratar de comprenderlos sin poseer un bagaje técnico y científico importante. Pero sí es posible, al menos, descender hasta un nivel de abstracción suficientemente alto como para no tener que detenerse en las minucias.

Las típicas aplicaciones para guardar el contenido de un CD de audio en la zona de almacenamiento de un dispositivo como un ordenador personal o un reproductor de audio portátil se denominan aplicaciones de ripping, palabra inglesa que popularmente se ha españolizado como "ripeo". En este proceso están implicadas normalmente varias operaciones diferentes:

  • La extracción del contenido del CD (el "ripeo" en sentido estricto).

    Este contenido, que en el CD se distribuye en bloques de datos, las conocidas "pistas" (tracks), se convierte en un formato lo más fiel posible al del propio CD, esto es, sin pérdida de datos y sin compresión. El formato habitual en la actualidad es WAV.

  • La codificación de la información extraída.

    Puesto que WAV o similares ocupan mucho espacio, se han creado sistemas (algoritmos) para comprimir la información contenida en ellos. La reducción del tamaño puede o no implicar pérdida de datos respecto del original. Cuando no hay pérdida, la reconstrucción de la información original es exacta; cuando la hay, es sólo aproximada, lo suficientemente aproximada como para que el oyente no profesional apenas perciba diferencia. Los formatos que suponen pérdida tienen la ventaja de ocupar menos espacio y por eso se han impuesto a gran escala con la llegada de los reproductores de audio portátiles. MP3 es uno de estos formatos comprimidos con pérdida de datos, pero no es ni el único ni el mejor. En el universo de HAL se deberían usar formatos abiertos y libres de patentes, como Ogg Vorbis (OGG, para abreviar), que, además y en general, se considera, de mayor calidad que MP3. En el mundo profesional, o cuando el oyente es muy exigente y goza de espacio suficiente en disco, se suelen preferir formatos comprimidos sin pérdida de datos, como FLAC.

  • El etiquetado de la información extraída y codificada.

    Sería muy pesado reconstruir la información del CD al transferir su contenido al ordenador, es decir, restablecer los títulos de las pistas, el intérprete, etc. Con ese fin se han desarrollado, entre otras opciones, bases de datos que contienen esa información y que son accesibles por Internet. Cuando la información no está disponible, el usuario puede rellenarla y enviarla al sitio web que aloja la base de datos para su recuperación posterior por parte de otros usuarios. Hoy en día, las bases de datos que utilizan los usuarios de GNU/Linux ---y deben utilizar, por razones de libertad de la licencia--- son FreeDB y MusicBrainz.


Dando por sentado que el lector va a codificar sus CDs con OGG o FLAC podemos referir algunos de los más conocidos colaboradores de HAL responsables en la actualidad de realizar las tareas antes descritas:

cdparanoia
Extracción de audio

oggenc
Codificación a formato OGG

flac
Codificación a formato FLAC

vorbiscomment
Etiquetado de ficheros OGG

metaflac
Etiquetado de ficheros FLAC

sox, vorbisgain
Otras herramientas para manipulación especializada de ficheros de audio.


No vamos a pararnos a dialogar con estos esforzados expertos, y no por falta de interés ---el autor se ha tenido que morder los labios para no hacerlo---, sino por falta de tiempo, del tiempo del lector que, seguramente, querrá entrar en materia cuanto antes de la mano de interfaces menos austeras o, si se quiere, de mecanismos de comunicación que nos permitan enviar una solicitud única para que los artesanos del sonido intervengan por turnos cuando corresponda. Estas interfaces son lo que popularmente se tiene en mente cuando se habla de aplicaciones de extracción o "ripeo" de CDs.

Tras esta introducción inicial podremos empezar a hablar con alguna de ellas. Comenzaremos por abcde (a better CD encoder = un mejor codificador de CDs) y seguiremos con crip. Eso será el próximo día.

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.

lunes, 23 de marzo de 2009

HAL y las marcas (LaTeX - anexo)

Recurrir al paquete listing para un tarea tan elemental como la que requiere nuestro simplísimo texto de ejemplo es como hablar con HAL únicamente para preguntarle su nombre. No es de recibo dejar ese fleco abierto. Un texto más complejo permitirá apreciar por qué listing es un paquete ampliamente recomendado para la presentación de código.

Vamos a producir un documento que incluya directamente el código de una orden de las primerísimas que vimos en estas conversaciones con HAL. Se trata del código, escrito en C, de la orden hostname. El código mismo no puede distribuirse sino mediante la licencia GPL, como se especifica en su primer comentario. Aquí sólo mostramos el fichero LaTeX para producir el documento y la primera página que resulta de su procesamiento. Las marcas que no se han explicado se señalan en rojo. El lector interesado puede encontrar ayuda completa sobre estas marcas y sobre listings en /usr/share/doc/texlive-doc/latex/listings/listings.pdf, si su distribución está basada en Debian.

El breve fichero LaTeX a partir del que generaremos la versión coloreada del código es éste:

\documentclass[a4paper]{article}
\usepackage{bera}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{listings}
\lstset{%
numbers=left,
basicstyle=\footnotesize\ttfamily,
commentstyle=\color{violet},
stringstyle=\color{magenta},
keywordstyle=\color{purple},
identifierstyle=\color{teal},

}

\begin{document}
\lstinputlisting[language=C]{hostname.c}
\end{document}

Y ésta es una imagen con la primera página del documento generado:



¡Happy Latexing!

HAL y las marcas (LaTeX - VI)

El día pasado acudimos excepcionalmente a una orden de estilo para poder integrar los resultados habituales del paquete listings en nuestro texto. Ya puestos, y como la veda se ha levantado parcialmente, vamos a tolerar otra excepción y sustituir la marca que establecimos para nombres de programas.

Es una convención frecuente presentar estos nombres con una familia de fuente diferente. Puesto que la familia por defecto en LaTeX es Serif y, puesto que la familia Typewritter (Monospace) es la elegida para el código, la opción recomendable es reservar la familia restante de la típica triada, Sans Serif, para nuestros nombres de programas.

Podríamos etiquetarlos directamente con la marca que define justo esa familia:

\textsf{nombre_programa}

Pero, dado que esta marca no dice nada sobre la función estructural del texto marcado y ante la posibilidad, además, de que cambiemos en el futuro de idea al definir las características de presentación de los nombres de programas, es mucho mejor crear una marca propia, llamémosla \Prog, que permita envolver la citada definición de fuente u otras definiciones futuras.

Para crear marcas propias, lo que en terminología de LaTeX se llamarían órdenes propias, se usa la orden de LaTeX \newcommand. Esta orden tendría, en el caso que nos ocupa el siguiente aspecto:

\newcommand{\Prog}[1]{\textsf{#1}}

La sintaxis indica que, en el lugar en el que nosotros pongamos la marca \Prog{texto}, donde texto es el argumento único (argumento 1 de \Prog), el sistema de procesamiento del documento pondrá \textsf{texto}. El texto en \textsf es el mismo texto de \Prog, que se pasa como valor al primer y único contenedor, #1, que nuestra orden \newcommand ha establecido para \textsf.

Lo único que hay que tener en cuenta a la hora de crear estas marcas propias es que el nombre de la marca elegida no exista ya entre las marcas de LaTeX o entre las de sus paquetes. Si albergamos dudas al respecto, podemos utilizar, en lugar de \newcommand, la orden \providecommand, que tendrá el mismo resultado que \newcommand cuando \Prog no sea una marca de LaTeX o sus paquetes y que no producirá efecto alguno, cuando la marca ya exista:

\providecommand{\Prog}[1]{\textsf{#1}}

Finalmente, para que las órdenes \newcommand o \providecommand sean tenidas en cuenta, se deben incluir en el preámbulo del documento después de las solicitudes de carga de paquetes.

Con este último refinamiento podríamos considerar acabado nuestro trabajo con las marcas de LaTeX, pero aún podemos introducir unas pocas mejoras más.

En primer lugar, vamos a utilizar un tipo de fuente distinta de la que por defecto utiliza LaTeX. La razón es que, aunque la fuente por defecto de LaTeX (Computer Modern) es estupenda para texto impreso, cabe la posibilidad de que nuestro documento se visualice más frecuentemente en pantalla. Una fuente más legible en pantalla puede ser beneficiosa. Seleccionaremos la fuente Bera, que viene incluida en TeX Live y que se activa mediante la carga de un paquete:

\usepackage{bera}

Y ya que asumimos que nuestro documento se verá en pantalla, podríamos también beneficiarnos del uso de colores, especialmente para resaltar los fragmentos de código.

Para disponer de soporte de colores en un documento LaTeX podemos usar el paquete xcolor.

\usepackage{xcolor}

El color para todo el código se puede establecer con la etiqueta \color{nombre_color} en la configuración inicial de listings:

\lstset{basicstyle=\color{teal}\small\ttfamily}

También añadiremos una sección previa con el título del documento, el autor y la fecha (la fecha la introduce por defecto LaTeX). Se debe solicitar explícitamente la generación del título mediante la orden \maketitle. El grupo de marcas adecuadas puede ir todo él justo después de \begin{document}, aunque hay quien prefiere situar \title y \author en el preámbulo.

\title{Un ejemplo juguete de \LaTeX}
\author{átopos}
\maketitle

(Cuando la palabra 'LaTeX' aparece precedida por la barra invertida, tal como acabamos de hacer, el tipógrafo producirá un versión embellecida de esa palabra. Es el ejemplo típico que se espeta a los usuarios de sistemas de preparación de documentos no profesionales: "¡Aficionados, a ver cómo os las apañáis para producir estos nuestros hermosos tipos!".)

Finalmente, estableceremos el tamaño de la página a A4, que es el modelo de página habitual en Europa. Basta para ello una opción en la declaración inicial de la clase de documento:

\documentclass[a4paper]{article}

Hemos terminado de etiquetar con LaTeX nuestro documento. Proponemos como ejercicio para el lector la modificación de los ficheros txt2latex.sed y generar_latex que corresponda a las transformaciones y añadidos que hemos introducido en estos dos últimos capítulos. El fichero txt2latex.tex resultante debería ser el siguiente:

\documentclass[a4paper]{article}
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{bera}
\usepackage{xcolor}
\usepackage{listings}
\lstset{basicstyle=\color{teal}\small\ttfamily}

\newcommand{\Prog}[1]{\textsf{#1}}

\title{Un ejemplo juguete de \LaTeX}
\author{átopos}

\begin{document}
\maketitle


\section{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:

\begin{enumerate}
\item 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).
\item Crear en \Prog{Vim} una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden \lstinline!:new ruta_fichero!.
\end{enumerate}

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

Con \Prog{w3m} el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción \lstinline!-dump!. Por ejemplo:
\begin{lstlisting}
w3m -dump http://www.w3.org/TR/html401/struct/lists.html
\end{lstlisting}
nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.
\end{document}

Tras procesar este fichero con pdflatex, se obtiene texto_etiquetado.pdf, que podrá verse con cualquier lector de PDFs:



Resumen

  • LaTeX permite crear marcas personalizadas con la orden \newcommand o con la orden \providecommand

  • El paquete xcolor proporciona soporte de colores en documentos LaTeX.

  • La creación de una sección previa con el título del documento y de su autor o fecha de escritura es trivial con LaTeX.

HAL y las marcas (LaTeX - V)

Nuestro fichero marcado con LaTeX no es una traducción perfecta de nuestro fichero marcado con marcas informales. Ante el desconocimiento de marcas LaTeX apropiadas para los elementos peculiares y, en principio, exclusivos de nuestro texto original (nombre de programa, opción y orden), llegamos al compromiso provisional de suprimir tales marcas.

No hay nada en LaTeX que obligue a una concesión tan poco justa. De hecho, LaTeX proporciona dos marcas, equivalentes al <EM> y al <CODE> de HMTL, que pueden desempeñar perfectamente el mismo papel:

\emph{texto}
Marca el texto como texto enfatizado.

\verb CAR texto CAR
Marca el texto como código de computador. CAR funciona aquí como delimitador y puede ser cualquier carácter que no forme parte del texto que marca. (Los espacios no deben incluirse y se han escrito sólo para facilitar su comprensión). Así, por ejemplo, el fragmento de texto '-dump' se podría marcar de esta forma: \verb!-dump!.


Por si fuera poco, LaTeX dispone también de un entorno semejante a \verb para marcar bloques independientes de código, como el que constituye la penúltima línea de nuestro texto original. Lo que implica que deberíamos haber utilizado una marca diferente para el bloque de código que constituye esa línea. Por ejemplo:

INICIO BLOQUE ORDEN
w3m -dump http://www.w3.org/TR/html401/struct/lists.html
FIN BLOQUE ORDEN


Si, además, concebimos dicha línea como un bloque de código, resulta innecesario situarla ahora como un párrafo aparte y pensar la línea subsiguiente como otro párrafo más. En realidad, esa forma de escribir no sería estructuralmente correcta, si es que tenemos en cuenta el sentido mismo del texto. La multiplicación de párrafos es una consecuencia indeseable de no haber comprendido que la línea en cuestión debe formar parte del mismo párrafo, lo que en ningún caso significa que no pueda tener un valor estructuralmente especial dentro de él, como bloque de código lógicamente independiente. Es notable como LaTeX nos fuerza, pues, a ser más finos a la hora de estructurar nuestra escritura, gracias a la disponibilidad de marcas distintas para unidades lógicas diferentes.

En consecuencia, la parte afectada de nuestro texto con marcas informales se puede reescribir ahora de una forma más precisa:

INICIO PÁRRAFO
Con INICIO NOMBRE PROGRAMAw3mFIN NOMBRE PROGRAMA el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción INICIO OPCIÓN-dumpFIN OPCIÓN. Por ejemplo:
INICIO BLOQUE ORDEN
w3m -dump http://www.w3.org/TR/html401/struct/lists.html
FIN BLOQUE ORDEN
nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.
FIN PÁRRAFO

Con estas nuevas marcas de LaTeX es casi trivial modificar el fichero txt2latex.sed para que procese estas tres líneas como debe:

s/INICIO NOMBRE FICHERO/\\emph{/g
s/FIN NOMBRE FICHERO/}/g
s/INICIO ORDEN/\\verb!/g
s/FIN ORDEN/\!/g
s/INICIO BLOQUE ORDEN/\n\\begin{verbatim}\n/g
s/FIN BLOQUE ORDEN/\n\\end{verbatim}\n/g

Por otra parte, habría que suprimir, además, la línea de txt2latex.sed que añadía el carácter de escape al guión bajo, puesto que ya no es necesaria: en un fragmento de texto con las marcas LaTeX mentadas los caracteres especiales de LaTeX se interpretan literalmente sin que haya necesidad de escaparlos.

Tras ejecutar el guión generar_latex fichero_etiquetado.txt ---fichero_etiquetado.txt se ha de modificar previamente como acabamos de explicar---, el fichero resultante, fichero_etiquetado.tex tendría el siguiente aspecto:

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

\begin{document}

\section{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:

\begin{enumerate}
\item 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).
\item Crear en \emph{Vim} una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden \verb!:new ruta_fichero!.
\end{enumerate}

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

Con \emph{w3m} el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción \verb!-dump!. Por ejemplo:
\begin{verbatim}
w3m -dump http://www.w3.org/TR/html401/struct/lists.html
\end{verbatim}
nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.
\end{document}

Si el LaTeX básico dispone de marcas suficientes para etiquetar todo nuestro texto original, ¿por que no las comentamos a su debido tiempo? ¿Por qué hemos diferido su explicación hasta ahora?

La razón es que no vamos a utilizar las marcas descritas, sino otras, más elaboradas, que obligan a recurrir a algún paquete que extienda las funcionalidades básicas de LaTeX. Y no las vamos a utilizar, porque, aunque son perfectamente válidas para un texto tan simple como el de nuestro ejemplo, conviene tener noticia de mecanismos más sofisticados y aptos para situaciones más complejas. De paso, veremos tomaremos contacto con el tipo de mecanismos habituales en el uso de paquetes.

Un paquete especialmente indicado para casos en los que hay que introducir código es el paquete listings, que vendrá instalado en cualquier distribución de LaTeX y, por supuesto, en TeX Live. El paquete listings suministra dos marcas parejas al \verb y al entorno verbatim comentados anteriormente. Son las siguientes:

\lstlisting CAR código CAR
Permite marcar fragmentos de código.

\begin{lstlisting}código\end{lstlisting}
Permite marcar bloques de código.


listings, como cualquier paquete, debe cargarse en el preámbulo del documento con la orden:

\usepackage{listings}

Tras ella suele aparecer una orden de configuración de las opciones del paquete. En nuestro caso, es imprescindible, al menos, una opción, la que defina la fuente básica con que se mostrará el código para que se diferencie del texto corriente. \verb y verbatim lo hacían por nosotros, establecían la fuente como perteneciente a la familia Typewriter, pero listings no lo hace por defecto, y no lo hace, porque no presupone por adelantado que nuestro documento pueda contener algo más que código. Debemos pues, excepcionalmente, tocar este aspecto del estilo. La orden que permite refinar la configuración de listings es \lstset{opciones_configuración} y la opción para modificar la familia de la fuente básica de forma que utilice la familia Typewriter es basicstyle=\ttfamily. Por otra parte, listings suele requerir de una disminución del tamaño de la fuente básica cuando las líneas de código son más largas de lo acostumbrado, como la penúltima línea de nuestro texto original. Ahí podemos utilizar la orden \small de LaTeX, que utiliza una fuente más pequeña de la habitual. En nuestro caso concreto, la opción podría aparecer también como parte de la configuración básica, es decir, dentro de \lstset, o bien como opción que matiza un entorno lstlisting en particular. Nosotros vamos a quedarnos con la primera posibilidad, aunque pueda ser discutible desde el punto de vista estético.

Por tanto, y teniendo en cuenta las anteriores explicaciones, deberíamos añadir estas dos líneas al preámbulo de nuestro documento:

\usepackage{listings}
\lstset{basicstyle=\small\ttfamily}


Finalmente sólo falta sustituir los \verb y \verbatim de antes por las marcas equivalentes de listings [Las modificaciones se muestran en azul]:

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

\usepackage{listings}
\lstset{basicstyle=\small\ttfamily}


\begin{document}
\section{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:

\begin{enumerate}
\item 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).
\item Crear en \emph{Vim} una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden \lstinline!:new ruta_fichero!.
\end{enumerate}

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

Con \emph{w3m} el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción \lstinline!-dump!. Por ejemplo:
\begin{lstlisting}
w3m -dump http://www.w3.org/TR/html401/struct/lists.html
\end{lstlisting}
nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.
\end{document}



Resumen

  • LaTeX suele favorecer e, incluso, forzar, al escritor a tomar conciencia plena de la estructura lógica de sus escritos.

  • El paquete listings extiende las funcionalidades básicas de LaTeX para la edición de documentos que contengan cualquier clase de código.

  • La mayoría de los paquetes, como listings, proporcionan marcas u órdenes especializadas que el usuario puede utilizar de acuerdo con sus fines concretos.

  • Las paquetes más versátiles, como listings, proporcionan al usuario la posibilidad de configurar muchos detalles que afectan al resultado final.

sábado, 21 de marzo de 2009

HAL y las marcas (LaTeX - IV)

Vale. Hemos marcado nuestro texto como LaTeX prescribe. Pero ¿cómo podemos ver el resultado?

Para un texto marcado con marcas HTML el navegador hace las veces del experto que lo procesa y del soporte para su visualización. Para un texto marcado con LaTeX, las dos acciones, la de procesar el documento y la de visualizarlo, son, sin embargo, competencia de dos agentes diferentes: el tipógrafo y el "lector" o "visualizador" del documento resultante, normalmente, en nuestros días, un fichero PDF.

El tipógrafo más recomendable en la actualidad para documentos LaTeX se llama pdfTeX, un descendiente del original TeX, que todavía se sigue usando, y mucho. LuaTeX, nieto de TeX e hijo de pdfTeX, podría consolidarse como el noble heredero de ambos en los próximos años.

pdfTeX y todo lo que se requiere para procesar un documento LaTeX viene incluido en todas las distribuciones modernas de GNU/Linux. En Debian, por ejemplo, se empaqueta dentro de los paquetes que incluyen el prefijo texlive-. TeX Live, que es la distribución más completa que existe para procesar documentos con LaTeX, es realmente grande y por eso Debian ofrece la posibilidad de instalar todo TeX Live, mediante el paquete texlive-full, o sólo una parte básica, mediante el paquete texlive y otros posibles añadidos.

Si el lector dispone de una gran cantidad de disco duro puede proceder a instalar texlive-full:

aptitude install texlive-full

En caso de que quiera ahorrar espacio, bastará con que instale, por lo pronto, tres paquetes (de los cuales sólo los dos primeros son imprescindibles):

aptitude install texlive texlive-lang-spanish texlive-doc-es

Tenemos ya a nuestros expertos ahí disponibles para todo lo que les ordenemos. No perdamos más tiempo y hagamos que pongan su imprenta en marcha sobre nuestro documento. Llamaremos a pdflatex que es el ayudante de pdfTeX encargado de procesar los documentos LaTeX:

pdflatex texto_etiquetado.tex

Si no hay ningún error sintáctico en nuestras marcas LaTeX, pdflatex terminará su trabajo rápidamente tras expulsar algunos mensajes sobre el procesamiento. El resultado quedará guardado en el fichero texto_etiquetado.pdf. Cualquier lector de PDF nos mostrará el resultado:



Pero, ¿y si hemos cometido un error sintáctico en las marcas? Lo que sucederá es que pdflatex se detendrá y nos mostrará un mensaje de error. Los mensajes de error de pdflatex pueden ser difícilmente comprensibles; lo peor, sin embargo, es que tendremos que aprender algunos atajos de teclado para salir del procesamiento detenido y, sobre todo, nos veremos obligados a volver a ejecutar pdflatex cuantas veces sea necesario hasta corregir todos los errores. Una opción para evitar, al menos, esto último, es utilizar un corrector de la sintaxis de LaTeX antes de procesar el documento con pdflatex. Podemos recurrir a lacheck, que viene incluido en TeX Live.

Imaginemos, por ejemplo, que nos comimos ---un hambre descuidada produce estos males--- la llave de cierre en la primera sección y el \end{enumerate} al final de la lista. O sea:

...
6 \begin{document}
7 \section{Navegación gráfica <== Falta llave de cierre
8 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:
9
10 \begin{enumerate}
11 \item 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).
12 \item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.
13 <== Falta \end{enumerate}
14
15 \section{Navegación desde consola}
16 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.
17
18 Con w3m el proceso de convertir una página web entexto es absolutamente elemental: añadir la opción -dump. Por ejemplo:
19
20 w3m -dump http://www.w3.org/TR/html401/struct/lists.html
21
22 nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.
23
24 \end{document}

Sobre este texto, que guardamos como el nombre texto_erroneo.tex, ejecutamos ahora lacheck:

lacheck texto_erroneo.tex

Aparecerán los siguientes mensajes:

"texto_erroneo.tex", line 24: <- unmatched "\end{document}"
"texto_erroneo.tex", line 10: -> unmatched "\begin{enumerate}"
"texto_erroneo.tex", line 25: <- unmatched "end of file texto_erroneo.tex"
"texto_erroneo.tex", line 7: -> unmatched "{"
"texto_erroneo.tex", line 25: <- unmatched "end of file texto_erroneo.tex"
"texto_erroneo.tex", line 6: -> unmatched "\begin{document}"

El analizador sintáctico, aunque emite mensajes que no son absolutamente claros, ayuda a localizar rápida y exactamente la línea o líneas que contiene los errores cometidos. Nótese que se muestran mensajes de error para las últimas líneas del fichero, la 24 y la 25, así como para la primera del fragmento, la línea 6. Estos mensajes de error son provocados por nuestros verdaderos errores, los que afectan a las líneas 7 y 13, que, como un efecto en cadena, disparan los mensajes relativos al resto de líneas. Una vez corregidas las líneas defectuosas (la 7 y la 13), el resto de mensajes de error desaparecerá.

La moraleja es que hay que ser cuidadoso a la hora de marcar textos (los buenos editores como Vim o Emacs suelen ayudar ya de entrada en esta tarea) y que conviene utilizar un analizador sintáctico como lacheck antes de procesar el documento con pdflatex.


Resumen:

  • pdflatex es el tipógrafo de documentos LaTeX recomendado en la actualidad. pdflatex forma parte de la máquina tipográfica pdfTeX.

  • pdfTeX es heredero de TeX. LuaTeX, por su parte, es heredero de pdfTeX y se perfila como su futuro sucesor.

  • La distribución actualmente más completa para procesar documentos LaTeX es TeX Live. TeX Live viene empaquetada por Debian en el paquete texlive (que contiene lo básico) y otros paquetes con el prefijo texlive-.

  • lacheck es un analizador de la sintaxis de marcas LaTeX. Es recomendable analizar la corrección de nuestra sintaxis antes de procesar nuestro documento con pdflatex.

HAL y las marcas (LaTeX - III)

Como sucede con HTML, también LaTeX requiere de cierto protocolo para definir aspectos básicos del documento marcado según sus convenciones y para que el experto o expertos que procesen estas marcas sepan cómo hacerlo exactamente. Por fortuna, este formulismo inicial es bastante más fácil de entender y de explicar que el de HTML. Nos limitaremos, no obstante, a comentar los aspectos más importantes de él y a confiar en que lector sabrá encontrar información más detallada en los enlaces propuestos en los primeros párrafos de este otro artículo.

La estructura de un documento LaTeX listo para su procesamiento es básicamente la siguiente:

PREÁMBULO

\begin{document}
[Nuestro texto con las marcas LaTeX]
\end{docuemnt}

Así pues, si retomamos la metáfora aplicada en la exposición de HTML, vemos que también el gabinete de LaTeX precisa que nuestro texto marcado se envíe en un sobre document y que a ese sobre le peguemos una etiqueta que contenga descripciones precisas de lo que va en él (el PREÁMBULO). Un preámbulo típico para documentos en castellano consta de los siguientes enunciados:

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

Veamos qué significa cada uno de ellos:

\documentclass{article}
Define el tipo de documento que creamos. En nuestro caso un artículo.

\usepackage[spanish]{babel}
Define la lengua en la que está escrito nuestro documento.

\usepackage[T1]{fontenc}
Define el tipo de codificación de la fuente empleada por defecto. Es recomendable para lenguas que contienen, como la nuestra, caracteres acentuados.

\usepackage[utf8]{inputenc}
Define el tipo de codificación empleada al escribir el texto. En cualquier máquina moderna será UTF-8.


Más allá de los tecnicismos ---por los que hemos pasado rozando---, lo que salta a la vista en las tres últimas líneas del preámbulo es la marca \usepackage{...}. Se trata de un tipo de orden que le indica a los expertos que procesarán nuestro documento que use un determinado tipo de paquetes LaTeX y que active, en caso necesario, tales o cuales opciones de ese paquete, donde las opciones solicitadas se indican entre corchetes de acuerdo con la sintaxis \usepackage[opciones]{paquete}.

¿Pero qué es un paquete de LaTeX? Un paquete no es sino una extensión para determinados propósitos de las posibilidades básicas de LaTeX. Algunas de estas extensiones actúan sobre los engranajes de las máquinas que procesarán LaTeX y sólo deberemos ser conscientes de ellos a la hora de incluirlos en el preámbulo. Otras pueden poner a disposición del usuario nuevas marcas especializadas a las que éste puede recurrir si lo desea. Así, por citar sólo un caso particular, el paquete babel permite escribir documentos en varias lenguas (las que se indican como opciones suyas) y seleccionar una u otra lengua cuando convenga mediante, por ejemplo, la orden o marca \selectlanguage{lengua}. En el caso de nuestro ejemplo sólo utilizamos una lengua, spanish, y podemos prescindir de estas sofisticaciones. Por lo demás, el recurso a paquetes es especialmente recomendable cuando nuestro texto va a contener elementos característicos propios que requerirán de un tratamiento específico. Veremos un caso de ello en un artículo posterior.

Bien. Nos queda sólo incluir el preámbulo comentado y el envoltorio document en nuestro texto marcado con LaTeX para obtener un documento LaTeX completo listo para su procesamiento. Si seguimos la misma estrategia empleada en la generación del documento HTML a partir de nuestro texto con marcas informales, bastaría con modificar ligeramente el guión generar_html de este modo:

## --* generar_latex - 21/03/09 - átopos *--
## Genera documento LaTeX canónico a partir de un documento de texto
## marcado con mis marcas informales
SED_F=txt2latex.sed # Fichero sed: convierte mis marcas
# informales en marcas LaTeX
ORIG_F=$1 # Fichero de entrada
DEST_F=$(basename $ORIG_F .txt).tex # Fichero LaTeX de salida

tr -d '\n'< $ORIG_F \
| sed -f $SED_F
\
| awk 'BEGIN {
print "\\documentclass{article}";
print "\\usepackage[spanish]{babel}";
print "\\usepackage[T1]{fontenc}";
print "\\usepackage[utf8]{inputenc}\n";
print "\\begin{document}";

}
{ print $0; }
END {
print "\\end{document}";
}' \
> $DEST_F

Las modificaciones, aparte de las que afectan a los comentarios, son las lógicas: cambia el fichero de órdenes para sed, que ahora será el txt2latex.sed que creamos el día pasado; se añade la orden tr, y se modifica el subsiguiente sed como corresponde (también lo comentamos ayer); se modifican mutatis mutandis las líneas que imprimirá awk al principio y al final (nótese que en awk, como en sed, el literal '\' debe escaparse).

El nuevo guión, que llamaremos generar_latex recibe como argumento el fichero con nuestras etiquetas informales y produce el fichero texto_etiquetado.tex. Tras cambiarlo de modo, podemos ejecutarlo:

./generar_latex texto_etiquetado.txt

El resultado, texto_etiquetado.tex, es el esperado:

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

\begin{document}
\section{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:

\begin{enumerate}
\item 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).
\item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.
\end{enumerate}

\section{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.

\end{document}

Si queremos ver coloreada la sintaxis de LaTeX nada mejor que echar mano del propio Vim. Se puede llamar a Vim para ver ficheros, sin intención de editarlos, con la orden view, que es un atajo de vim -R:

view texto_etiquetado.tex

La imagen siguiente muestra el resultado:




Resumen:

  • Un documento LaTeX consta de un preámbulo y un entorno document. El preámbulo incluye, como mínimo, la definición de la clase de documento (artículo, libro, carta, etc.) y, normalmente, también la solicitud de uso de paquetes. El entorno document engloba todo el texto marcado con marcas LaTeX.

  • Un paquete de LaTeX es una extensión de las posibilidades básicas de LaTeX. La inclusión de paquetes se solicita en el preámbulo del documento con la etiqueta u orden \usepackage[opciones]{paquete}, donde cada opción activa un conjunto determinado de las extensiones que el paquete proporciona. Por ejemplo, \usepackage[spanish]{babel} permite usar el paquete para el uso de múltiples lenguas babel y beneficiarse de sus extensiones para el castellano.

viernes, 20 de marzo de 2009

HAL y las marcas (LaTeX - II)

Si quisiéramos acudir a un procedimiento automático para traducir nuestras marcas informales a marcas LaTeX, como hicimos para obtener nuestro documento HTML, deberíamos tener en cuenta la forma típica que adoptan los textos etiquetados con LaTeX, de lo que ayer se dio un brevísimo ejemplo, así como algunas de sus peculiaridades, tales como la manera de entrecomillar en español o la introducción literal de caracteres especiales.

¿Qué queremos decir con esto? La mejor manera de verlo es elaborar un fichero txt2latex.sed semejante al txt2html.sed de entonces. El fichero tendría por lo pronto este aspecto:

# Conversión de caracteres especiales
s/"\([[:alnum:]]\+\)"/<<\1>>/g
s/_/\\_/g

# Conversión de etiquetas
s/INICIO SECCIÓN//g
s/FIN SECCIÓN//g
s/INICIO TÍTULO SECCIÓN/\\section{/g
s/FIN TÍTULO SECCIÓN/}\n/g
s/INICIO PÁRRAFO//g
s/FIN PÁRRAFO/\n\n/g
s/INICIO LISTA NUMERADA/\\begin{enumerate}\n/g
s/FIN LISTA NUMERADA/\\end{enumerate}\n\n/g
s/INICIO ELEMENTO LISTA/\\item /g
s/FIN ELEMENTO LISTA/\n/g
s/INICIO NOMBRE PROGRAMA//g
s/FIN NOMBRE PROGRAMA//g
s/INICIO ORDEN//g
s/FIN ORDEN//g
s/INICIO OPCIÓN//g
s/FIN OPCIÓN//g

Buena parte de este fichero se entiende por sí mismo. Las etiquetas informales que no tienen traducción se sustituyen por nada, es decir, se eliminan. También hemos eliminado provisionalmente las etiquetas para nombre de programa, opción y orden, porque todavía no sabemos sus equivalencias en LaTeX. Allí donde queremos un salto de párrafo sustituimos la marca informal por la marca LaTeX equivalente más dos saltos de línea ---recuérdese que el salto de línea se expresa con '\n'. Estos dos saltos crean precisamente una línea en blanco. Nótese, en particular, que el carácter '\' de LaTeX debe escaparse con otro '\' (el carácter de escape de sed, y de casi todo en HAL), puesto que es un carácter especial de sed, justamente el que sirve para escapar un carácter cualquiera.

En cuanto a la primera sección del fichero, la relativa a la conversión de las comillas rectas por comillas angulares y la secuencia de escape para el carácter '_' explicada ayer, sólo nos puede extrañar la primera orden:

s/"\([[:alnum:]]\+\)"/<<\1>>/g

Entender lo que esta orden de sed significa implica conocer una nueva posibilidad de sed todavía no explicada: las referencias hacia atrás (backreferences). Miremos la expresión minuciosamente, porque casi todo nos debería resultar familiar.

s/RE/remplazo/g

es evidentemente una orden de sustitución de sed. Lo sustituido es todo lo que encaja con la expresión regular (RE) que hay a la izquierda. Analicemos primero esa expresión regular:

"\([[:alnum:]]\+\)"

Se trata de un molde para un texto entrecomillado ("texto"). Lo entrecomillado es un conjunto de caracteres alfanuméricos [[:alnum:]]. Este conjunto contiene uno o más miembros (el signo +), que en sed, frente a lo que ocurre con expresiones regulares extendidas, tiene que escaparse (\+). Además, este conjunto aparece agrupado (los paréntesis (...), que en sed deben también escaparse). Por tanto, la expresión regular designa todo fragmento de texto constituido por uno o más de un carácter alfanuméricos que esté entrecomillado por comillas rectas. En definitiva, esta expresión regular no contiene nada que no sepamos ya, salvo la necesidad de escapar algunos de sus caracteres.

Lo nuevo está en la expresión que se propone como remplazo:

<<\1>>

Las comillas angulares de inicio y cierre son justamente aquellas por las que queremos sustituir las comillas rectas del texto que encaje con la expresión regular. Lo que aparece entre estas comillas angulares es la enigmática expresión \1. Esta expresión simplemente recupera el contenido de lo registrado por sed cuando descubrió una agrupación en la expresión regular, es decir, todo lo que hay entre los paréntesis. (Como sólo se ha registrado una agrupación, la referencia hacia atrás es \1; si en la expresión regular apareciese una segunda agrupación, la referencia de esta segunda agrupación sería \2, etc.). Por tanto, el fragmento de texto constituido por los caracteres alfanuméricos va a aparecer intacto en el remplazo. Esta es la técnica habitual que se utiliza cuando una parte interna del texto que encaja con la expresión (en nuestro caso, lo entrecomillado) se quiere preservar y sólo otra parte (en nuestro caso, las comillas rectas) se quiere modificar.

Diseccionado el sentido de nuestro fichero txt2latex.sed, podemos utilizarlo para efectuar la sustitución de nuestras marcas informales ---que, recuérdese, aparecen en el fichero texto_etiquetado.txt--- por las de LaTeX y guardar el resultado en un fichero con la extensión .tex, que es la forma canónica de identificar ficheros LaTeX:

sed -f txt2latex.sed texto_etiquetado.txt >texto_etiquetado.tex

El resultado deja mucho que desear:

\section{
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:
...

Los espacios en blanco están por doquier y se han generado saltos de línea donde no debía haberlos.

La causa del problema está en que sed, tras realizar cada sustitución, incluye el salto de línea en las líneas modificadas. Este comportamiento es conveniente en la mayoría de los casos ---nadie esperaría que sed se comiese el salto de línea, cuando de lo que se trata es de cambiar sólo una parte de una línea. Sin embargo, este educada manera de obrar es fatal para el caso que nos ocupa.

Hay varias formas de resolver el problema, que pasan por utilizar otro ayudante que no sea sed. Pero quizá la más sencilla para nuestro caso particular, y que no nos obliga a renunciar a sed, sea darle como entrada el mismo fichero pero transformado previamente en una única línea. Las marcas seguirán allí intactas y nada provocará saltos de línea innecesarios, más allá de los que nosotros hemos decidido producir en nuestras sustituciones, puesto que sed trabajará sobre una línea única.

Hacer que las múltiples líneas de un fichero se unan y constituyan una única línea se puede conseguir con distintas órdenes de HAL. Una de las más simples es la orden tr (de translate). Esta orden dispone de una opción adecuada a nuestros fines, la opción -d, que elimina (delete) de la entrada el carácter que demos como argumento a esa opción. Por ejemplo:

tr -d 'a'

eliminaría todas las aes de nuestra entrada.

Para convertir múltiples líneas en una única línea, el carácter que deberemos eliminar es justamente el salto de línea. Por tanto:

tr -d '\n'

es la orden apropiada para lograr nuestro propósito.

Hemos dicho que tr afecta a la "entrada" y no simplemente al "fichero" dado como argumento. ¿Por qué? La razón es que tr es una de esas pocas órdenes que no permite ficheros como argumentos. Dicho de otra forma, tr actúa sólo y directamente sobre el flujo de entrada del que se nutre. Esta característica la hace especialmente apta para integrarse en tuberías. Pero en nuestro caso, sigue siendo un fichero el que queremos darle como alimento.

Existe una forma de dar un fichero de alimento a una orden que trabaja únicamente sobre el flujo de entrada. Es una herramienta más de fontanería, el reverso del famoso embudo (>) que aplicamos para redirigir la salida de una orden a un fichero. Existe otro embudo, <, que realiza la función contraria: redirige un fichero hacia la entrada estándar. Si en el otro lado (el izquierdo) hay una orden que puede alimentarse directamente desde la entrada estándar (cualquiera de los filtros que hemos visto en anteriores artículos: sed, grep, etc.) o que sólo se alimenta de ella, como tr, el fichero redirigido se convertirá en la entrada de la orden.

En consecuencia, para que nuestra anterior orden de supresión de saltos de línea haga su efecto sobre el fichero texto_etiquetado.txt, deberíamos decirle a HAL lo siguiente:

tr -d '\n'< texto_etiquetado.txt

Con este paso previo se puede ya construir la orden completa, puesto que el resultado de la acción de tr se puede enviar sin problemas a sed mediante una tubería y redirigir lo que produce sed al fichero texto_etiquetado.tex:

tr -d '\n'< texto_etiquetado.txt | sed -f txt2latex.sed >texto_etiquetado.tex

Lo cual produce el documento con todas las transformaciones propias de LaTeX que hemos solicitado:

\section{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:

\begin{enumerate}
\item 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).
\item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.
\end{enumerate}

\section{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.



Resumen:

  • Las expresiones regulares para sed no son idénticas a las expresiones regulares extendidas. Ello implica que muchos caracteres típicos de las EREs tengan que escaparse en sed.

  • sed registra las agrupaciones que en los patrones de expresiones regulares aparecen entre paréntesis \(...\) y los guarda para su uso posterior. Para recuperar lo contenido en esos registros se utilizan los signos de referencias hacia atrás (\1, \2, ..., \9), cada uno de los cuales remite a la primera, segunda, ..., novena agrupación de la expresión regular del caso.

  • La orden tr traduce o elimina (con la opción -d) caracteres de la entrada estándar. Por ejemplo tr -d '\n' elimina los saltos de línea del flujo de entrada.

  • Existen órdenes de HAL que se nutren únicamente de la entrada estándar, como tr y no pueden recibir un fichero como argumento.

  • El embudo < permite redirigir un fichero a la entrada estándar y, por extensión, a una orden que se alimente de la entrada estándar. Por ejemplo, tr -d '\n'< mi_fichero, hace que el fichero mi_fichero sea la entrada de la orden tr.

HAL y las marcas (LaTeX - I)

En los artículos anteriores de esta sección hemos entrado en contacto con la noción de marcar un texto y hemos experimentado con el lenguaje de marcas más ampliamente usado y probablemente más conocido, HTML, uno de los pilares de la Internet actual. Es un buen punto de partida, dada su simplicidad y omnipresencia. Pero hay unos cuantos lenguajes de marcas más ahí dentro y hay expertos en las fábricas de HAL cuya pericia indiscutible ha resistido la prueba de los años.

En los próximos artículos conoceremos al que tal vez sea el más conspicuo de estos sistemas. Se trata de LaTeX, de ese mismo LaTeX que tan merecidos elogios viene recibido desde su nacimiento por parte de tipógrafos y diseñadores profesionales y del que nosotros, simples escritores legos en la materia, vamos a poder disfrutar con muy poco esfuerzo.

De la "filosofía" y el sentido de LaTeX hemos hablado ya en varias ocasiones (por ejemplo, en el primer artículo de este TeXemplar). No viene, pues, al caso repetir más de la cuenta lo dicho tantas veces. El lector podrá encontrar información básica en castellano, y enlaces seleccionados a textos introductorios públicamente accesibles, en la sección de manuales de la web de CervanTeX, el grupo de usuarios hispanohablantes de TeX.

Sigamos, pues, un procedimiento semejante al que aplicamos con HTML. Empezaremos viendo cuáles son las marcas de LaTeX equivalentes a aquéllas informales con que etiquetamos nuestro texto:

INICIO TÍTULO SECCIÓN:
\section{

FIN TÍTULO SECCIÓN
}

INICIO SECCIÓN
[No necesario]

FIN SECCIÓN
[No necesario]

INICIO PÁRRAFO
[No necesario]

FIN PÁRRAFO
Línea en blanco

INICIO LISTA NUMERADA
\begin{enumerate}

FIN LISTA NUMERADA
\end{enumerate}

INICIO ELEMENTO LISTA
item¶ [donde '¶' es un espacio en blanco]

FIN ELEMENTO LISTA
[No necesario]

INICIO NOMBRE PROGRAMA
[Depende del paquete LaTeX usado o de la marca personal creada]

FIN NOMBRE PROGRAMA
[Depende del paquete LaTeX usado o de la marca personal creada]

INICIO OPCIÓN
[Depende del paquete LaTeX usado o de la marca personal creada]

FIN OPCIÓN
[Depende del paquete LaTeX usado o de la marca personal creada]

INICIO ORDEN
[Depende del paquete LaTeX usado o de la marca personal creada]

FIN ORDEN
[Depende del paquete LaTeX usado o de la marca personal creada]


La diferencia de las marcas de LaTeX con las de HTML es evidente. La sintaxis de LaTeX es más irregular, pero, a la vez, bastante menos prolija, lo que implica que marcar textos con LaTeX es mucho más fácil que hacerlo con HTML, una vez conocidas las marcas adecuadas.

Echemos un vistazo al primer párrafo de nuestro texto tal como quedaría tras sustituir nuestras marcas informales con las de LaTeX (se omiten las marcas correspondientes a nombres de programas, opciones y órdenes, que se explicarán más adelante):

\section{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:

\begin{enumerate}
\item 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).
\item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.
\end{enumerate}

Describir la razón de la sintaxis de LaTeX rebasa el nivel introductorio de estos artículos. La mayoría de la gente que utiliza LaTeX la aprende sin mayor cuestionamiento, y es realmente fácil de aprender, si nos atenemos a su uso básico, que es válido para el 99% de los casos habituales. Así que no comentaremos nada más que lo evidente. Y lo evidente salta a la vista.

Todas las marcas tienen en común el ir precedidas por el carácter de barra invertida '\'. Los dos tipos de marcas más frecuentes son:

\estructura{texto marcado}
Un texto se define por la estructura lógica o textual que le conviene. Por ejemplo, \section{texto} define el texto englobado como título de una sección. (Nota: lo que hay tras el título de sección hasta una nueva \section{...}, o hasta el comienzo de una estructura de más alto nivel como \chapter{...} o hasta el final del documento, se considera parte de la sección iniciada por el título anterior. Es por esta razón por la que no es necesario indicar expresamente donde comienza o termina el contenido propiamente dicho de la sección).

\begin{entorno}texto\end{entorno}
Un texto puede considerarse un bloque relativamente independiente, textualmente hablando, de lo que le rodea. Un entorno aisla ese texto y lo identifica como perteneciente a una categoría estructural o textual especial. Por ejemplo, \begin{enumerate}texto\end{enumerate} caracteriza el texto englobado como una lista ordenada.


Por su parte la marca \item texto identifica el texto como un elemento de una lista. Se trata de un caso de marca especial para elementos de cualquier lista, donde no se consideran necesarias las llaves delimitadoras. Sería, en efecto, bastante molesto tener que escribir \item{texto} cuando el texto fuera de cierta longitud.

Una marca particularmente significativa es la que corresponde al fin de párrafo, la línea en blanco. Mientras que en HTML las líneas en blanco no existen para el navegador que interpretará el documento, en LaTeX las líneas en blanco tienen un significado fundamental, separan párrafos. Así, en nuestro ejemplo, el primer párrafo se separa del segundo, en este caso de una lista, gracias a la línea en blanco (Nótese que la lista puede constituir un párrafo por sí sola, como en nuestro caso, o formar parte de un párrafo existente. El escritor es quien decide, aunque la diferencia, en nuestro caso concreto, resultará prácticamente inapreciable). Utilizar la línea en blanco para delimitar párrafos es, contra lo que parece, una ventaja que LaTeX proporciona al escritor. Nunca el escritor tuvo que explicitar dónde había una separación de párrafos, le bastaba con introducir una línea en blanco para que todos lo entendiésemos. Disponer de una marca específica para párrafos sólo es necesario con lenguajes de marcas altamente formalizados como HTML. LaTeX, aunque menos riguroso en su forma, es más afín en esto a la práctica habitual de la escritura [Ver, además, mi primer comentario a este artículo].

El lector atento habrá observado que hemos coloreado de azul los signos '<<' y '>>' de comillas angulares y los signos '\_'. En el texto original las comillas aparecían como dobles comillas (") y el guión bajo no venía precedido por la barra. ¿Por qué hemos tenido que cambiarlos? La razón es diferente en cada caso.

Las comillas angulares son las comillas ortotipográficamente correctas en español y LaTeX es muy pulcro con la ortotipografía. No aceptará así como así las dobles comillas. LaTeX nos obliga, pues, a escribir buen español: una ventaja añadida).

Un caso diferente es el del guión bajo. Resulta que este guión tiene un significado especial en LaTeX. Como de costumbre, cuando queremos introducir literalmente un carácter especial debemos encontrar un modo de "escaparlo". Por suerte, el carácter de escape es aquí el de siempre, la barra invertida. Lo mismo vale para estos otros caracteres especiales ('#', '$', '%', '&', '{' y '}'), que también deben escaparse, si se quieren introducir literalmente, con la barra invertida. [Los otros tres caracteres especiales, que raramente escribirá el lector no informático, ('^', '\' y '~') se escapan, respectivamente, con \textasciicircum, \textbackslash y \textasciitilde].


Resumen:

  • LaTeX es un lenguaje de marcas especialmente indicado cuando lo que se desea es producir un documento de calidad profesional destinado a ser impreso.

  • Muchas editoriales científicas, y no científicas, de prestigio utilizan LaTeX como sistema de preparación de sus ediciones.

  • Las marcas de LaTeX empiezan con el carácter '\'.

  • La sintaxis de LaTeX es más irregular que la de otros lenguajes de marcas como HTML. A cambio, suele ser más amigable y menos prolija.

  • La línea en blanco separa párrafos en LaTeX.

  • La forma correcta de entrecomillar en español son las comillas angulares. LaTeX requiere de este tipo de comillas, cuando el texto está en español.

  • Hay que cuidar de no introducir literalmente caracteres especiales de LaTeX sin "escaparlos".