viernes, diciembre 23, 2005

Declaración de intenciones

Desde aquí muestro lo que me gustaría hacer. Esperemos que gustar = conseguir.

Escribir una clase de LaTeX.
Puede ser que mi proyecto acabe en una clase de LaTeX. Puede ser que mi proyecto no tenga un preproceso a la creación del documento TeX. Puede ser que no utilice LaTeX sino el más primitivo TeX.

Se me ha ocurrido el crear una nueva clase de documento (\documentclass) a la que podría llamar "autolayout" o algo así. También podría tratarse de un paquete (\usepackage) pero no quiero estar sujeto a ninguna clase ya definida. No quiero márgenes, no quiero tamaños por defecto...

La clase se compondría de páginas (\begin{Page}) y de bloques (\begin{Block}). Cada página indica eso, una página. Dentro de ella se declaran una seríe de bloques, cada bloque es como una "minipage"; tienen su "mundo" en el que se fijan sus parámetros. Cada bloque, tabién tiene un ancho especificado. Si no se indicara, el ancho será el de la própia página. La altura viene calculada dependiendo del contenido del bloque.

Las páginas tienen el tamaño especificado al indicar la clase: a4, a5, etc. En la página podemos incluir tantos bloques como deseemos pero el sistema se encargará de decidir que bloques entran en la página. El objetivo es el de conseguir una página lo más bien maquetada posible.

Los siguientes puntos se tienen en cuenta:
  • un bloque no se incluye en una página si su altura es superior a la misma.
  • se pueden indicar bloques "continuadores" (\begin{Block}[continue]{refBlock}) en los que se incluye el contenido del bloque indicado. Versión ancla de QuarkXpress.
  • un bloque no se incluye en la página si su anchura es superior a la misma.
  • un bloque no puede aparecer más de una vez en la página. cuando un bloque ha sido incluido se marca para que no vuelva a ser considerado.
  • un bloque descartado por anchura o altura (son o es mayor/es que la de la página) no puede ser incluido.
  • los bloques pueden ser marcados para ser incluidos obligatoriamente por el sistema.
  • se pueden marcar varios bloques para formar un grupo. Un grupo es un conjunto de maquetaciones para el mismo contenido. Así por ejemplo nos puede interesar dar distintas versiones de un mismo contenido para que, si no se incluye en formato una columna, aparezca en formato 3 columnas apaisado. (\begin{Block}[group:group_a]). Una vez se ha incluido una noticia del grupo, el resto se marcan como incluidos también.
  • uno de los objetivos es el dejar el menor espacio posible, respetando siempre los márgenes.
  • se pueden introducir bloques fijos (\begin{block}[fixed](posx,posy)), los cuales aparecen en la posición indicada sin que el sistema los considere en su maquetación.
  • una posición ocupada por un bloque no podrá ser ocupada por otro bloque. De lo contrario, se sobrepondrían algunos objetos a otros.
  • dentro de un bloque se pueden incluir imágenes.
  • si hay pocos bloques o los bloques on muy grandes, el sistema no ofrecerá soluciones muy vistosas.
  • un bloque no puede estar en blanco.
  • a los bloques se les añade automáticamente márgenes dependiendo en que posición se encuentran. Por ejemplo, si un bloque se encuentra en la posición superior izquierda no deberá tener margen superior e izquierdo ya que ya posee los de la página. Un bloque en el medio de la página, a su vez, deberá incluir márgenes en todos sus lados para poder separarse de los otros bloques y no parecer que están adjuntos.
  • los márgenes podrán tener distintos tamaños para obtener la mejor maquetación posible.
  • si sobra espacio en uno de los laterales, se desplazará todo el contenido hacia el centro de la página para no dar la sensación de que todo el contenido está apelotonado en una esquina.
  • cuantos más elementos incluyamos mejor será la maquetación
  • se podrá indicar la posibilidad de variar la separación entre lineas, o el tamaño de la fuente para poder acoplar mejor a la página.

miércoles, diciembre 21, 2005

La solución puede estar en el Tetris

Pues eso es lo que parece!
Buscando por la Wikipedia he encontrado que el problema de resolver un puzzle llamado Pentomino.Este algoritmo se basa el lo siguiente:
  • El espacio se divide en una rejilla n x n.
  • Existen unas piezas formadas por cuadrados adjuntos, cuyo tamaño coincide con el de las celdas de la rejilla.
  • La misión es la de llenar el espacio con los distintos tipos de piezas de manera que no quede ninguna celda vacía.
Parece ser que el famoso juego del Tetris se basó en este algoritmo para su creación.
Aquí hay un applet de Java en el que se puede ver su funcionamiento.

El algoritmo me resulta interesante porque podría ser utilizado para disponer los elementos en la cuadrícula de cada página. Una vez se generan minipages, boxes... y se conocen sus dimensiones, se podría aplicar para que llenara las páginas utilizando las noticias que mejor acoplaran, dejando al final, el menor espacio en blanco posible.

Parece interesante...

martes, diciembre 20, 2005

Segunda aproximación

LaTeX utiliza un sistema de emplazamiento de elementos flotantes. En principio, los elementos flotantes son las tablas y las imágenes, pero existe un paquete que permite crear un environment con cualquier cosa. El paquete se llama float.
La idea trataría en disponer las noticias, bloques, etc. como elementos flotantes; cada uno con sus características (3 columnas, imagen y texto...), y dejar que LaTeX se encargara del resto, es decir, de disponer todos los elementos flotantes en el espacio.
Al hacer pruebas he detectado los siguientes inconvenientes:
  • El paquete float crea siempre un elemento flotante que ocupa todo el ancho del documento. No existe posibilidad de indicarle el ancho y por tanto los elementos se disponen uno debajo del otro.
  • Falta comprobarlo, pero no sé si es posible que LaTeX disponga los elementos en paralelo. De manera que aparezcan dos/tres bloques en paralelo.
  • ¿Hasta dónde llega el sistema de disposición de elementos flotantes de LaTeX? ¿Es capaz de maquetar un hoja con sólo imágenes, aprovechando el máximo espacio?
Aunque creo que la idea es buena, me supondría modificar el paquete float para poder dar anchura.
...

lunes, diciembre 19, 2005

Creando una rejilla

El paquete textpos, que me ayuda a situar los elementos en posiciones absolutas del documento, permite crear una rejilla invisible sobre la que emplazar los elementos. Cada texto, imagen, etc. se sitúa dentro de un textblock, de la siguiente manera:
\begin{textblock}{4}(1,1)
Bla bla bla bla bla.
\end{textblock}
Esto significa que el texto empezará a aparecer desde la casilla que está en la posición (1,1) y se extenderá (en ancho) a través de 4 casillas. (El alto no se especifica.)

Pues bien, yo quería que esa rejilla invisible fuera visible alguna vez, y busqué algun comando que me ayudara. Como no encontré nada, me cree un comando yo mismo para poder visualizar la rejilla y así poder hacerme una idea de cómo maquetaría la información.

A continuación incluyo el código:
%CREANDO UNA REJILLA
\documentclass[a4paper]{article}
\usepackage[absolute]{textpos} %Incluir paquete textpos con opción absolute.
\usepackage{multido} %Para los bucles
\usepackage{ifthen}
\usepackage[margin=2cm]{geometry}

\thispagestyle{empty} %Sin número de página
\setlength{\parindent}{0pt} %Sin sangrado
\textblockorigin{2cm}{2cm} %Origen de los "textblocks" y por lo tanto de la malla
%Variables que utilizo
\newdimen\dx
\newdimen\dy
\newcount\cx
\newcount\cy
% Instrucción que dibuja una rejilla: \grid[num]{nfilas}{ncolumnas}
% - "num": si se indica esta opción, se muestran los pares (x,y) para cada celda
\newcommand{\grid}[3][]{
\dx=\textwidth% %ancho total del documento
\dy=\textheight% %alto total del documento
\cx=#3% %número de columnas
\cy=#2% %número de filas

\count1=#3% %guardo en \count1 el número de columnas + 1
\advance\count1 by 1%

\count2=#2% %guardo en \count2 el número de filas + 1
\advance\count2 by 1

\divide\dx by #3 %ancho total / número de columnas
\divide\dy by #2 %alto total / número de filas

\setlength{\TPHorizModule}{\dx} % dar valores a los parámetros de textpos. ancho celda = \dx
\setlength{\TPVertModule}{\dy} % alto celda = \dx

%Dibujar filas
\multido{\nFila=0+1}{\count2}{
\begin{textblock}{\cx}(0,\nFila)
\rule[0pt]{\textwidth}{.1pt}
\end{textblock}
}

%Dibujar columnas
\multido{\nColumna=0+1}{\count1}{
\begin{textblock}{\cy}(\nColumna,0)
\rule[0pt]{.1pt}{\textheight}
\end{textblock}
}

\ifthenelse{\equal{#1}{num}}{ % si se quieren visualizar las posiciones de cada casilla
%Escribir posición
\multido{\nFila=0+1}{\cx}{
\multido{\nColumna=0+1}{\cy}{
\begin{textblock}{1}(\nFila,\nColumna)
\begin{center}
(\nFila,\nColumna )
\end{center}
\end{textblock}
}
}
}{}
}

\begin{document}
\grid[num]{5}{10} %Dibujar rejilla
\end{document}

sábado, diciembre 17, 2005

Primera aproximación

Por fin, empiezo en serio!
El próximo lunes empezaré a crear lo que será mi proyecto. Hace tiempo que estoy buscando información, capturando ideas, tomando decisiones... Pero, hasta este fin de semana, no había creado ningún esquema general de lo que será el sistema.
Una cosa está clara: lo que se pretende es que un sistema "inteligente" tome una serie de noticias desde una base de datos y genere un documento pdf con aspecto de periódico incluyendo tales noticias. El documento pdf se generará desde un documento escrito en LaTeX.

Pues bien, mi primera aproximación del sistema consiste en crear un documento por cada una de las noticias. Cada noticia podrá tener un aspecto distinto (tres columnas, 2 columnas y destacado, 1 sóla columna...). De momento este aspecto no lo tengo muy claro qué o quién lo elegirá.


Una vez generadas todas las noticias, gracias a conocer su tamaño, se podrá (mediante algún algoritmo) ordenar todos los elementos en el espacio (páginas) del periódico. El máximo objetivo será el de tener menos espacios en blanco.

De momento, esto es sólo una aproximación. No incluyo detalles ni especificaciones, pero se me había ocurrido y he estado investigando.

Paquetes LaTeX que seguro me ayudarán:
  • textpos: permite dar posiciones absolutas a los elementos de un documento LaTeX. Permite la creación de una rejilla para mejor maquetación.
Ahora busco la manera de saber cuál es el tamaño que ocupa cada una de las cajas que incluye una noticia. Puedo especificar el ancho pero el alto es automático...

Sigo pensando...

sábado, diciembre 03, 2005

Transparencias con LaTeX

Hola! Por casualidad, he estado mirando estilos y extensiones para LaTeX que me permitieran crear transparencias.



Por lo que he leido hasta ahora, esto funciona como si de una película se tratara: las transparencias (slides) se dividen en fotogramas (frames) y así se genera un presentación.
He encontrado un par de cosillas:
  • Prosper: es una clase para LaTeX que facilita la creación de transparencias. Hay varios estilos predefinidos a elegir (plantillas) y no requiere ningún postproceso.
  • PPower4 (P^4, Pdf Presentation Post Processor): Incluimos una serie de etiquetas especiales cuando estamos generando nuestras transparencias (por ejemplo con prosper, foiltex, etc.). Una vez generamos el pdf con pdfLaTeX, llamamos al programa y éste se encarga de generar los efectos dinámicos gracias al postproceso. Está escrito en Java y es gratuito. Muchos de los efectos generados sólo funcionan en Adobe Reader, por lo que recomiendan su uso. Aquí podéis ver una demo (pdf). Y aquí está el manual.