Making Of: Libro de Lenguajes y Procesadores

Como comenté en esta otra entrada, el libro de Lenguajes de Programación y Procesadores lo hemos creado con LaTeX. LaTeX es un sistema de composición de textos que a mí me vendieron (teóricamente) como “céntrate en el contenido, y olvídate del aspecto”. Y digo teóricamente entre paréntesis porque la realidad nunca es tan idílica. Al final las imágenes se te van unas páginas más allá de lo que querrías, conseguir que las palabras se corten bien es un problema aparte, hay que configurar un montón de cosas para que el tamaño de página, encabezados, etc queden como tú quieres…

Además, un libro como el que nos ocupa contiene diferentes recursos: listados de código, diagramas en forma de árbol, figuras… Cada uno de estos recursos requiere importar uno o varios paquetes LaTeX y, en ocasiones, configurarlos adecuadamente. Al final, el proceso se parece bastante a programar. De hecho, utilicé Eclipse para escribir mi parte del libro, utilizando para ello el plugin Texlipse, y todo el libro se encuentra en el correspondiente proyecto de SidelabCode.

Total, que al final dejar el libro como quieres es una tarea en la que a veces hay que hilar muy fino. La parte positiva de todo esto es que me he encontrado con algunos paquetes de LaTeX que son extremadamente útiles y versátiles, y quería dejarlos aquí anotados para uso y disfrute de la comunidad.

Código fuente

La inclusión de código fuente en un libro no es algo que se pueda tomar a la ligera. Los siguientes aspectos me parecían fundamentales a la hora de insertar código en el libro:

  • La tipografía del código fuente debe ser diferente de la del resto del libro y monoespaciada.
  • Las líneas deben ir numeradas para poder hacer referencia a una línea concreta del código o a un bloque.
  • Preferiblemente el código debe tener resaltado de sintaxis.
  • A mi personalmente me gusta que el fragmento del código se separe del texto “normal” de alguna manera (por ejemplo recuadrando el código).

Evalué diferentes formas de hacer esto hasta que di con el paquete perfecto: Listings. Añadir código fuente con Listings es tan fácil como esto:


\begin{lstlisting}[style=Haskell]
suma :: Integer -> Integer -> Integer
suma x y = x + y
\end{lstlisting}

Y el resultado queda como en la imagen:

Aspecto de código Haskell usando Listings

Las palabras reservadas aparecen en negrita, el fondo es de un gris claro para distinguirlo fácilmente del resto del texto, la fuente es monoespaciada y las líneas están numeradas.

Listings trae un montón de lenguajes predefinidos y es sumamente versátil. Es posible cambiar el aspecto de prácticamente todo: comentarios, fondo, números de línea, palabras reservadas… Nosotros lo hemos utilizado para código Java, Haskell, C, Ruby, Pascal, XML, PHP, Awk, bash, Prolog y Perl. Puedes usarlo para un lenguaje que Listings no conozca. Evidentemente no reconocerá las palabras reservadas, pero al menos se mostrará con estilo de código fuente.

Árboles

En un libro donde hay un capítulo dedicado a los compiladores, abundan los árboles de análisis sintáctico. Habíamos pensado hacer estos árboles con algún programa externo, generar la imagen correspondiente y después insertar la imagen en el documento. El problema de este enfoque es que la tipografía de la imagen puede variar mucho respecto a la del texto del libro. Además, hay que tener mucho cuidado con el escalado, para que el tamaño del texto de unas figuras no difiera del de otras.

Buceando un poco por la web, vi el paquete qtree. Con este paquete es sumamente sencillo definir árboles, siempre que se tenga un poco de cuidado con el balanceado de los corchetes que sirven para delimitar los diferentes niveles. El punto indica cuál es la raiz del subárbol correspondiente:

\Tree [.S [.A a b ] [.B a b a ] ]

La sintaxis es sencilla, pero desagradable a la vista. Ahora bien los resultados son espectaculares:

Un árbol generado con Qtree

Diagramas sintácticos

Otro de los recursos que contiene el libro son diagramas sintácticos. Estos diagramas se utilizan en el Capítulo 1 y para generarlos utilizamos el paquete syntax. Syntax forma parte de mdwtools, que incluye también paquetes para formatear gramáticas BNF. He aquí un ejemplo de definición de diagrama sintáctico con syntax:

\begin{figure}
\begin{syntdiag}
<termino>
\begin{stack}\\
\begin{rep}
\begin{stack}
'+'\\
'-'
\end{stack}
<termino>
\end{rep}
\end{stack}
\end{syntdiag}
\caption{\small \emph{Diagrama sintáctico correspondiente a la gramática \ref{gram:termino}}}
\label{fig:diagrama-sintactico-termino}
\end{figure}

Y el resultado (en nuestro caso escogimos diagramas con bordes cuadrados en lugar de redondeados):

Resultado de syntax

Encabezados en versales

Esta es una de las cosas que más fastidiosa resultó. Una vez que teníamos terminado el libro, el editor, con buen criterio, nos señaló que los encabezados de los índices aparecían en mayúsculas, mientras que en el resto del libro los encabezados de las páginas aparecen en versales.

Estuve intentando cambiar el estilo de las páginas de los índices, pero no era capaz. El estilo por defecto para los capítulos no se aplicaba a los índices. Al final opté por particularizar el estilo de los capítulos para cada uno de los índices (hay un índice general, un índice de figuras y un índice de tablas):

\newcommand{\ps@indexheadings}{%
\renewcommand{\@oddhead}{% encabezamiento páginas impares %
\parbox{\textwidth}{
\hfill \textsc{Índice} \hfill \thepage}}
\renewcommand{\@evenhead}{% encabezamiento páginas pares %
\parbox{\textwidth}{
\thepage \hfill \textsc{Índice} \hspace*{\fill}}}}

Ahora, poniendo lo siguiente:

\pagestyle{indexheadings}
\tableofcontents

El encabezado del índice aparece correctamente en versales.

Bibliografía

El último de los temas (que yo recuerde) de interés en la composición del libro fue el estilo de la bibliografía. El estilo bibliográfico normal añade un and entre el penúltimo autor y el último en las publicaciones. Queríamos que apareciera un y. Intentamos cambiar al estilo castellano (con el fichero de estilo spain.bst), pero el estilo era muy diferente y no nos gustaba.

Al final opté por modificar a mano el fichero plain.bst con el estilo normal (renombrándolo) y cambiar el and por y. Sólo hay que cambiar la línea 201:

{ " y " * t * }

Os dejo el diff:

201c201
< { " and " * t * }
---
> { " y " * t * }

Y este es el resultado:

Bibliografía en castellano

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s