Actualizacion automática de tablas en documentos de Latex (I)

Enviado por pvaldes el 15 Noviembre, 2011 - 02:01.

Muchos usuarios de LaTeX tendrán probablemente una sensación familiar de fastidio ante ésta situación; una tabla grande y compleja, con decenas de columnas y filas de valores numéricos dentro de un documento extenso que debe de ser actualizada frecuentemente a medida que van llegando nuevos datos.

Se entenderá mejor la situación con un ejemplo hipotético, supongamos que estamos realizando un análisis cladístico de varias familias de plantas y queremos mostrar una tabla con un montón de características ausentes o presentes en cada familia. Un fragmento del código de nuestra tabla antes de ser compilado tendría el siguiente aspecto:

Fabaceae      &0&1&1&1&1&1&1&0&1&0&0&0&1&0&1&1&1&1&0&0&2&0&1&0&0&0&1&0&0&0&1&0&\\
Boraginaceae  &0&0&0&0&-&1&1&0&0&0&1&0&1&0&0&0&1&1&1&0&2&0&1&0&0&0&1&0&0&0&1&0&\\
Primulaceae   &0&0&1&0&1&1&0&0&0&-&-&0&1&2&0&0&1&0&0&0&2&1&1&0&1&0&0&0&0&0&0&0&\\
Cariofilaceae &0&0&1&0&1&1&0&&0&0&0&0&0&0&0&0&0&1&1&0&2&1&1&0&1&1&1&0&0&0&0&0&&\\

Para actualizar por ejemplo el valor del campo 23 para las plantas boragináceas hay que encontrarlo primero, y eso implica contar los signos "&" uno a uno hasta llegar al 23 y luego cambiar el 0 inmediatamente anterior por otro valor, y así con el resto de filas. Es un proceso no solo muy pesado visualmente sino también bastante propenso a traspapelar columnas e introducir errores. De hecho el código mostrado tiene un error fatal y nunca compilaría, que dejo deliberadamente como ejemplo práctico, a ver quien es el primero en cazarlo.

Así que tengo que admitirlo, las tablas de latex antes de ser compiladas son más bien feas y aún os lo parecerán mucho mas si tenéis que rehacerlas a mano una y otra vez. Tratar de evitaros ese dolor de cabeza es precisamente el propósito de la entrada de hoy.

¿Qué es esto del Latex y para qué sirve?

Llegados a este punto me siento obligado a parar y justificar semejante alarde de masoquismo: ¿dejarse la vista contando signos "and" en los tiempos de la hoja de cálculo? ¿es una broma?

LaTeX no es otra cosa que un conjunto de macros creado a mediados de los 80 por éste señor para simplificar la escritura de archivos de TeX; el cual a su vez es un lenguaje creado por éste otro caballero para tipografiar documentos, orientado especialmente a crear documentos científicos y técnicos. TeX ha sido desde hace décadas un estándar de calidad en el ambiente académico en ése sentido, mimando el detalle final hasta aspectos realmente obsesivos, y a pesar de ser un programa anterior al primer Windows, sigue manteniendo una comunidad importante de usuarios en la actualidad (TUG, o CervanTeX para los castellano-parlantes). Latex por su parte ocultó al usuario gran parte de la complejidad de los a menudo enrevesados comandos y algoritmos de Knuth facilitando mucho la popularidad del sistema. En las bibliotecas de todo el mundo podréis encontrar decenas de libros técnicos y centenares o miles de artículos científicos que se han escrito y formateado en tex o latex desde la primera a la última página.

Dicho ésto, seguramente no os sorprenda si digo que Latex es uno de mis programas imprescindibles de software libre, desde hace un montón de años, y tampoco os sorprenderá saber que las principales hojas de cálculo (con la honrosa excepción de Gnumeric por ejemplo) carecen de la posibilidad de exportar a LaTeX, que a fin de cuentas era un serio competidor de sus propios procesadores de texto, de hecho Lamport fue fichado posteriormente por Microsoft para ayudar a mejorar el Word.

... Y aquí es cuando un Postgresql sin complejos entra en escena.

Extraer una tabla Latex desde Postgresql

Al grano, supongamos que tenemos una base de datos de Postgresql a la que voy a llamar MIBASE y supongamos que queremos volcar el contenido de dos campos concretos de una tabla llamada errr.. mitabla?... (Asumimos que hemos instalado previamente un cliente de postgresql y un sistema funcional con Tex y Latex), pues bien, obtener una tabla de latex desde "mibase" de datos es tan sencillo como escribir ésto en una terminal:

psql -P format=l -P border=0 -c'SELECT campo1, campo2 FROM mitabla ORDER BY campo2' MIBASE -o latabla.tex

¡No podemos entrar en nuestra base de datos!. El comando psql (modo estándar de acceder a una base de datos de postgresql) nos ha dejado de nuevo tirados en la shell sin imprimir una sola línea en la pantalla (igual que si pulsamos intro en una shell vacía)... ¿Que ha pasado aquí?

Lo explico: Esto se debe al tipo de petición que hemos hecho. En primer lugar hemos invocado un par de meta-comandos de psql para indicarle de antemano que queremos que la salida sea una tabla en formato latex y sin bordes (prefiero las tablas sin líneas verticales), luego hemos invocado una clásica consulta de sql para pedirle que devuelva los campos campo1 y campo2 y los ordene por el valor del segundo campo y finalmente le hemos pedido que envie la salida al fichero latabla.tex.

En realidad el comando se ha ejecutado correctamente, ha hecho exactamente lo que le hemos pedido y luego se ha cerrado.

Adjuntar la tabla al documento principal.

Ahora tenemos un pequeño archivo con un fragmento de código latex que queremos invocar desde nuestro documento principal, el archivo no es compilable directamente lo cual facilita precisamente ese proceso. Para ello usaremos como clip el comando input, añadiendo la siguiente línea a nuestro documento principal:

\begin{table} \input(latabla) \caption{Caracteres morfológicos utilizados en el análisis. (O ausencia, 1 presente ocasionalmente, 2 presente en todas las especies de la familia, - sin datos)} \end{table}

He envuelto el input en un entorno tabla, con lo que podemos añadir un pie de tabla explicativo. Asumiendo que ambos archivos estén en el mismo directorio, al compilar el documento principal tendremos nuestra tabla justo en lugar del input. En caso contrario tendremos que añadir la ruta completa al archivo latabla.tex dentro del input

Actualización de la tabla

Bien, ahora supongamos que ha pasado algún tiempo, hemos seguido añadiendo datos a nuestra base y decidimos que es hora de actualizar la tabla, algo tan sencillo como volver a lanzar el mismo comando psql de arriba y el contenido de nuestra tabla será modificado. Podemos lanzar el mismo comando siempre que sea necesario poner al día la tabla. Si queremos olvidarnos de lanzar el comando a mano simplemente crearemos un script de bash con ese comando, le damos permisos de ejecución y luego añadimos la correspondiente línea a /etc/crontab para que incorpore los nuevos datos a la tabla, por ejemplo todos los días a la una y media de la tarde sin requerir más intervención por nuestra parte:

30 13   *   *    *   $HOME/refrescar_tabla.sh



Y eso es todo, la solución en sí es bastante simple, sin embargo aún queda mucho margen para complicar el problema y hacerlo más interesante, ganando con ello una mayor flexibilidad y mayor control sobre la salida; pero eso es algo que dejaremos para la segunda parte, con la incorporación de Perl al equipo.

Imagen de damian_sima
Enviado por damian_sima el 15 Noviembre, 2011 - 04:16.

me encanto! voy a ver cuando lo pongo en práctica...
El error es fácil: &&
saludos

Imagen de pvaldes
Enviado por pvaldes el 15 Noviembre, 2011 - 13:04.

Ha durado poco mrgreen, efectivamente era ese

Me alegra que te haya gustado Damian, un saludo