sábado, 21 de abril de 2012

Tablas en LaTeX

Pese a todas sus ventajas y su flexibilidad, hay un aspecto en particular de LaTeX que me a resultado confuso, difícil de usar y en momentos excesivamente rebuscado, esto es la generación de tablas.

Esto es mas que nada por el tener que manejar y vigilar manualmente cosas como el grosor de la tabla con respecto a la pagina, aspecto que si no se vigila puede causar que la tabla se "corte" al extenderse mas halla de la hoja.

Sin embargo, ya que es casi imposible hacer un documento de investigación sin tener que presentar datos tabulares en algún momento es conveniente realizar un pequeño tutorial que cubra al menos las características que requerí al escribir mi tesis de licenciatura.

El entorno Tabular

Para realizar las tablas en LaTeX es necesario acceder al entorno "tabular" para hacer esto basta utilizar los comandos \begin{tabular}{<opciones>} y \end{tabular} estos delimitan los comandos que generaran la tabla.

Notara que al comando \begin{tabular} se le pueden pasar opciones, estas no son opcionales puesto que indican el numero de columnas que tendrá la tabla, el formato es relativamente sencillo para cada columna que se desee utilizar se coloca una letra que indica como se posicionara el texto (centrado, ubicado a la derecha o a la izquierda), su se desea que halla lineas que delimiten las columnas se indican con caracteres |.

Una vez que a hecho esto puede proseguir a ingresar los datos, esto sigue un sencillo formato de la forma

<dato> &

donde el carácter & delimita la columna, solo recuerde no excederse del numero de columnas definido.

Al acabar esa columna escriba el carácter \\ para saltar a la siguiente, si además desea una linea dividiendo las filas utilice el comando \hline.

Como es esto no podría ser mas obtuso, abstracto y antagonista al usuario se presenta un pequeño ejemplo, en el cual se desea hacer una tabla con nueve columnas que tengan centrado el texto con excepción de la primera.

\begin{tabular}{|l|c|c|c|c|c|c|c|c|}
\hline
Octetos  & 7         & 1   & 6 & 6 & 2 & 0-1500 & 0-46 & 4 \\ \hline
Elemento & Preámbulo & SoF & Destino & Origen & Tamaño & Datos & Relleno & Verificación \\ \hline
\end{tabular}


Ahora podría presentarse el caso en que desee que una celda abarque varias columnas para hacer esto se usa la instrucción

\multicolumn{<numero de celdas>}{<contenido>}

Esta es un poco mas clara que las anteriores, con numero de celdas indicando cuantas celdas se desea abarcar y contenido se explica solo.

El entorno table

Si utilizara el entorno tabular directamente en un documento encontrara una serie de dificultades las cuales son

  1. La tabla aparece justo donde se le llamo, interrumpiendo el flujo de texto sin ningún tipo de margen.
  2. Si se llega al final de la pagina la tabla se "corta" quedando una parte en una pagina y el resto en otra.
  3. No se puede colocar un texto descriptivo o caption.
  4. No se numera automáticamente.
  5. No hay forma de hace referencia a dicha tabla desde otro punto del documento.
  6. No aparecerá en la lista de tablas generada por el comando \listoftables
Estas no son dificultades menores ya que afectan la presentación del documento de forma grave y dificultan consultar la tabla de manera eficiente, sin embargo hay una solución sencilla a esto, el entorno table.

Mediante el uso de este se le indica al compilador que debe tratar a la tabla de forma diferente al texto, ubicándola de modo que no interrumpa el flujo del texto y tampoco sea cortada por el cambio de pagina, a su vez que permite agregar texto descriptivo, etiquetas de referencia y llevar la numeración de la tabla de forma automática

El uso de este es muy simple, como muestra el ejemplo a continuación:

\begin{table}

\begin{tabular}{|l|c|c|c|c|c|c|c|c|}
\hline
Octetos  & 7         & 1   & 6 & 6 & 2 & 0-1500 & 0-46 & 4 \\ \hline
Elemento & Preámbulo & SoF & Destino & Origen & Tamaño & Datos & Relleno & Verificación \\ \hline
\end{tabular}

\caption{Trama Ethernet.}
\label{c2_estructura_ethernet}
\end{table}

Notara que los unicos cambios fue agregar las instruciones \begin{table}, \caption, \label y \end{table}

donde \caption contiene el texto descriptivo y  \label la etiqueta identificadora, con esto LaTeX posicionara y numerara la tabla de forma correcta.

Ya para terminar se presenta un ejemplo completo de lo presentado aquí, solo copielo a un archivo .tex y compilelo, le dará como resultado las tablas y lista de figuras mostradas en las siguientes imágenes

Figura 1: Entorno tabular solo

Figura 2: Entorno table

Figura 3: Multicolumn

Figura 4: Lista de tablas.


Ejemplo

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{hyperref}

\begin{document}

Ejemplo de una tabla sencilla

\begin{tabular}{|l|c|c|c|c|c|c|c|c|}
\hline
Octetos  & 7         & 1   & 6 & 6 & 2 & 0-1500 & 0-46 & 4 \\ \hline
Elemento & Preámbulo & SoF & Destino & Origen & Tamaño & Datos & Relleno & Verificación \\ \hline
\end{tabular}

Notara que no se le coloco ningun tipo de texto descriptivo y que carece de numeración, a la vez que queda justo en el
flujo de texto, lo cual puede resultar incomodo de leer, a su vez esta tabla no aparecera en la lista de tablas al final
del documento y no hay forma de referenciarla desde otro punto del documento.


\newpage

Misma tabla sencilla, utilizando el entorno \emph{table}

\begin{table}
%\centering
\begin{tabular}{|l|c|c|c|c|c|c|c|c|}
\hline
Octetos  & 7         & 1   & 6 & 6 & 2 & 0-1500 & 0-46 & 4 \\ \hline
Elemento & Preámbulo & SoF & Destino & Origen & Tamaño & Datos & Relleno & Verificación \\ \hline
\end{tabular}
\caption{Trama Ethernet.}
\label{c2_estructura_ethernet}
\end{table}

Al usar el entorno \emph{table} fue posible agregar las instruciones \emph{caption}, la cual agrega un texto descriptivo a la tabla
y \emph{label} la cual nos permite referenciar la tabla con usar la instrucción \emph{ref}, como se ve aqui \ref{c2_estructura_ethernet}

Notara que la tabla tambien se posiciono automaticamente de modo que no corte el flujo del texto.

\newpage

En el caso que se desee que una de las celdas de la tabla abarque mas comunas, esto se puede lograr por medio del comando
\emph{multicolum} este toma como argumento cuantas columnas abarcara la celda, como se ubicara el texto y el contenido, un ejemplo
de esto se ve en la Tabla \ref{c2_tabla_cabecera_wifi}.


\begin{table}
\centering
\begin{tabular}{|p{1.3cm}|p{1.3cm}|p{1.3cm}|p{1.3cm}|p{1.3cm}|p{1.3cm}|p{1.3cm}|p{1.3cm}|c|}
\hline
\multicolumn{7}{|c|}{Cabecera MAC} & & \\ \hline
2 bytes & 2 bytes & 6 bytes & 6 bytes & 6 bytes & 2 bytes & 6 bytes & 0-2312 bytes & 4 bytes \\ \hline
Frame Control & Duration ID & Address 1 & Address 2 & Address 3 & Secuence Control & Address 4 & Frame Body & CRC \\ \hline
\end{tabular}

\caption{Trama IEEE 802.11.}
\label{c2_tabla_cabecera_wifi}
\end{table}


\newpage

Siempre que las tablas se realizen con el entorno \emph{table} podra listarlas con solo usar el comando \emph{listoftables}
\listoftables

\end{document}