martes, 2 de noviembre de 2010

Tablas con LaTeX (1)

A continuación, mostraré una pequeña introducción para dibujar tablas sencillas en LaTeX. En primer lugar, nuestro archivo .tex tendrá que ser algo parecido a lo siguiente. Además de los paquetes habituales {babel} y inputenc}, se carga el paquete {multirow}, necesario para poder combinar celdas.

\documentclass[a4paper,openright,10pt]{report}
\usepackage[spanish]{babel} 
\usepackage[utf8]{inputenc} 
\usepackage{multirow} % para las tablas

\begin{document}

\end{document}

LaTeX, cuando trabaja con el paquete [spanish] llama a las tablas "Cuadros". Para que mejor las llame "Tablas", tenemos que indicarlo escribiendo:

\usepackage[spanish,es-tabla]{babel}



Una tabla muy sencilla puede ser la siguiente:

Por ejemplo, la tabla (\ref{tabla:sencilla}):

\begin{table}[htbp]
\begin{center}
\begin{tabular}{|l|l|}
\hline
País & Ciudad \\
\hline \hline
España & Madrid \\ \hline
España & Sevilla \\ \hline
Francia & París \\ \hline
\end{tabular}
\caption{Tabla muy sencilla.}
\label{tabla:sencilla}
\end{center}
\end{table}

Cuyo resultado sería:


Básicamente, utilizamos "&" para pasar a la siguiente celda, "\\" para saltar de línea, y "\hline" para hacer una línea horizontal.
Cuando en la tercera línea ponemos \begin{tabular}{|l|l|}, las "l" (letra ele) indican alineación a la izquierda (left). También podríamos haber puesto "c" o "r", para alineación en el centro o a la derecha. Los "|" (palitos verticales) significan separación con línea vertical.
Por último, en la primera línea hemos puesto [htbp]. Esto indica el orden en que queremos que LaTeX trate de colocar la tabla.
  • h (here) aquí.
  • t (top) arriba.
  • b (bottom) abajo.
  • p (page) en esta página.
Es decir, si ponemos [htbp], LaTeX probará primero de poner la tabla aquí. Si no le convence, probará arriba de la página. Luego abajo. Y luego en cualquier parte de esta página. De todos modos, LaTeX es bastante especial para colocar las tablas e imágenes. Si queremos obligar a LaTeX que situe la tabla exactamente donde hemos dicho, hay que poner [H] y usar el paquete {float}.



Se pueden fusionar celdas de la misma fila, mediante el comando \multicolumn.

\begin{table}[htb]
\centering
\begin{tabular}{|l|l|}
\hline
\multicolumn{2}{|c|}{Europa} \\ \hline
País & Ciudad \\
\hline \hline
España & Madrid \\ \hline
España & Sevilla \\ \hline
Francia & París \\ \hline
\end{tabular}
\caption{Tabla muy sencilla.}
\label{tabla:sencilla2}
\end{table}
En este caso \multicolumn{2}{|c|}{Europa}: {2} = 2 celdas fusionadas (contando de izquierda a derecha), {|c|} = texto centrado. (Por cierto, este comando también nos puede valer para alinear de una manera diferente, una única celda de una columna. Por ejemplo, con \multicolumn{1}{|r|}{xxx})

El resultado sería:




LaTeX se encarga de seleccionar el ancho de las celdas que él considera "mejor". Sin embargo, utilizando el comando p{...cm} en vez de "l", "c" o "r", podemos fijar el ancho que queramos.

\begin{table}[htb]
\centering
\begin{tabular}{| p{2.2cm}| p{2.2cm} |}
\hline
\multicolumn{2}{|c|}{Europa} \\
\hline
País & Ciudad \\
\hline \hline
España & Madrid \\ \hline
España & Sevilla \\ \hline
Francia & París \\ \hline
\end{tabular}
\caption{Tabla de ancho fijo.}
\label{tabla:anchofijo}
\end{table}

Cuyo resultado sería:






También podemos fusionar celdas de una misma columna. Para ello utilizamos el comando "\multirow", que está en el paquete {mutlirow}.

\usepackage{multirow}

\begin{table}[htb]
\centering
\begin{tabular}{|l|c|}
\hline
\multicolumn{2}{|c|}{Europa} \\
\hline
País & Ciudad \\
\hline \hline
\multirow{2}{1cm}{España} & Madrid \\ \cline{2-2}
& Sevilla \\ \hline

Francia & París \\ \hline
\end{tabular}
\caption{Fusionando celdas.}
\label{tabla:fusionandoceldas}
\end{table}

En este caso \multirow{2}{1cm}{España}: {2} = 2 celdas fusionadas (contando de arriba abajo), {1cm} = ancho de la celda.
Además, ahora ya no se puede utilizar siempre el comando \hline, pues crea una línea horizontal de longitud toda la tabla. Hay que usar el comando \cline{n1-n2}, que crea una línea horizontal entre la columna n1 y la columna n2.




Por último, un ejemplo de una tabla un poco más grande. (Fíjate que la rayita está centrada en el centro, no a la izquierda.)

\usepackage{multirow}

\begin{table}[htb]
\centering
\begin{tabular}{|l|l|l|l|}
\hline
& \multicolumn{3}{c|}{Europa} \\
\cline{2-4}
& Ciudad & Río & Símbolo\\
\hline \hline
\multirow{3}{1cm}{España} & Madrid & Manzanares & Cibeles\\ \cline{2-4}
& Sevilla & Guadalquivir & Giralda\\ \cline{2-4}
& Zaragoza & Ebro & Pilar\\ \cline{1-4}
Francia & París & Sena & Torre Eiffel\\ \cline{1-4}
\multirow{2}{1cm}{Italia} & Roma & Tíber & San Pedro\\ \cline{2-4}
& Milán & \multicolumn{1}{c|}{-} & Duomo\\ \cline{1-4}
\end{tabular}
\caption{Tabla muy bonita.}
\label{tabla:final}
\end{table}



Una última cosa. La etiqueta de las tablas, aparece debajo de cada tabla. Para que vaya arriba, basta con escribir la etiqueta "\caption{}" antes de "\begin{tabular}".

25 comentarios:

Unknown dijo...

Me gustaría saber si se puede girar una tabla para que quepa en una página en la que ya haya texto.
Se que puedo girar una pagina entera e insertarla entre dos páginas y ahí introducir el texto, pero no como insertar dos tablas giradas.

Gracias!

Luis dijo...

Hola,
ese gran mundo de las tablas en LaTeX... :-)

Sí que se puede hacer perfectamente. En el siguiente manual encontrás cómo:

http://www.tug.org/pracjourn/2007-1/mori/mori.pdf

Hasta luego

Mateo Ballesta dijo...

Muy buen blog, tango una duda, es que al realizar varias tablas seguidas queda mucho espacio entre una y otra, te agradeceria si me pudieras ayudar.

Luis dijo...

Hola Mateo,

hace tiempo escribí una entrada donde solucionaba ese problema

http://minisconlatex.blogspot.fr/2012/01/como-evitar-que-latex-distribuya-los.html

También tienes otra opción. Con las siguientes líneas, podrás poner la tabla exactamente donde quieras.

\usepackage{float}
\begin{table}[H]
\end{table}

Hasta luego

Mateo Ballesta dijo...

Muchas gracias, me funcionó de maravilla.

Mar dijo...

Hola Luis,

Hace un par de semanas te escribí por un problema que tenía cuando empecé con Latex y tu ayuda me sirvió muchísimo.

Ahora necesito hacer una tabla que contiene números con decimales, pero cada vez que quiero compilar me tira el siguiente error, tanto si pongo el decimal con coma como si lo pongo con punto:

! Package inputenc Error: Unicode char \u8:��� not set up for use with LaTeX.
See the inputenc package documentation for explanation.

Yo estoy usando
\usepackage[utf8]{inputenc}
y la tabla que quiero hacer es la siguiente:

\begin{table}[htb]
\begin{center}
\begin{tabular}{|l|l|}
\hline
Bomba & Paso de selección de nivel basal \\
\hline \hline
OmniPod & 0,05  U/h \\ \hline
MiniMed 530G & 0,025; 0,05; 0,1 U/h \\ \hline
Animas 2020 & 0,025 U/h \\ \hline
ACCU-CHEK Spirit Insulin Pump & 0,1 U/h \\ \hline
\end{tabular}
\caption{Ejemplos de incrementos de basal programables para varias bombas}
\label{tab.pasobasal}
\end{center}
\end{table}


¿Alguna idea de por qué puede estar pasando esto, o alguna sugerencia para tratar de solucionarlo?

Desde ya muchas gracias.

Luis dijo...

Hola Mar,

el error es muy chungo de ver. De hecho, es invisible. :D

El problema está en la línea de OmniPod. Entre 0,05 y U/h hay una tabulación. Bórrala y sustitúyela por un espacio.

Las tabulaciones dependen del sistema de codificación usado (utf8, latin1, cp1252...) Hay veces que una tabulación puede ser un espacio, o cuatro espacios, u otra cosa. Una tabulación no es algo estandar. En cualquier caso, lo que creo que pasó es lo siguiente. Esa tabulación la hiciste en otro programa (que usaba un tipo de codificación), luego copiaste y pegaste en LaTeX (que usaba utf8), y LaTeX no entendía qué era esa tabulación.

En LaTeX puedes poner tabulaciones. El problema viene que la tabulación estaba copiada desde otro programa.

Ya me dirás si te funciona. :)

André dijo...

Hola Luis. Enhorabuena nuevamente por el trabajo que estás haciendo mi pregunta es la siguiente. Estoy haciendo una tabla muy sencilla pero quiero que todos los bordes sean con guiones, no quiero una línea continua. Se puede hacer? ( La tabla ya la he creado)

Luis dijo...

Hola André,

gracias. :-)

si se puede, no sé cómo hacerlo. Vaya, las tablas en LaTeX realmente no funcionan nada bien. Si un día lo descubres, dímelo. :-)

Mar dijo...

Hola Luis!! Ya pasó bastante tiempo desde mi pregunta y tu respuesta. Sólo quería decirte que TENÍAS RAZÓN y pude solucionar mi problema con la tabla como me dijiste.

Perdón por tardar tanto en dar mi feedback, con tu ayuda terminé la tesis y obtuve mi título de grado en el medio :D

Felicitaciones renovadas por tu excelente blog y gracias por atender a las preguntas, dudas y perdidas de nosotros los principiantes!!!

David Rom dijo...

Buenas Luis, me han servido mucho tus publicaciones sobre las tablas, pero me siguen quedando dudas que me vuelven loco; principalmente por tener que combinar muchas características

¿Cómo hacer cuando en las tablas diversas celdas tienen distintas alineaciones? ¿Y si además incluye texto y no se quiere que el texto se parta de formas raras? ¿Y si además el largo de celda está prefijado? ... No consigo combinarlas satisfactoriamente.

Como añadir imágenes no se puede (que yo sepa), pongo un enlace a una hoja de cálculo en GDrive que refleja la intención de la tabla perfectamente:
https://docs.google.com/spreadsheets/d/1UMaqVAY8OrHXzW6PTzoZ8a867BJzAaqCY0H3QKc9kMM/edit?usp=sharing

Ahora voy señalando los muchos problemas que me van surgiendo:




1-. Tabla de 8 filas y 5 columnas. Los largos están prefijados entre 2 y 3.5cm
--> Hasta aquí todo perfecto.


2-. La primera fila debe tener su contenido centrado (tanto en largo como en alto) y algunas celdas tendrán texto que deberán separarse en dos líneas.
--> Me llega a dar fallos hasta el comando \textbf{}, así que imagínate... El texto siempre hace cosas raras: algunas celdas se centran, otras se alinean a la izquierda, otras hacen particiones muy raras ocupando 3 filas a pesar de estar usando el comando \multirow{2}, en otras el texto se centra tanto a izquierda como a derecha...


3-. La primera columna --salvo el elemento que pertenece también a la primera fila-- debe tener su contenido alineado a la izquierda pero debe estar centrado a lo alto.
--> Tres cuartas de lo mismo... El código y yo nos estamos entendiendo con una total libre interpretación xDD


4-. El resto de celdas deben estar también doblemente centradas (tanto en alto como en largo).
--> No me atrevo ni a comentarlo hasta que no resuelva la primera fila y la primera columna porque está claro que soy un desastre.



O es normal que surjan tantos problemas por estar intentando combinar demasiados comandos en una misma tabla o le estoy metiendo una paliza increíble al código y ni me cosco... A ver si me ilustras el caso.

David Rom dijo...

Incluyo también una captura de lo más cercano al resultado que busco que he podido conseguir:

https://drive.google.com/open?id=0B0LCQyuou8kFbTJQLXlLWXluYjg


He evitado algunos de los fallos que me aparecían usando comandos \array; pero aún aspectos que resolver...

Luis dijo...

Hola David,
ays, el mundo de las tablas de LaTeX... pues tienes toda la razón, funciona muy mal. Hay que reconocer que las tablas se hacen mucho mejor en Word. Yo a veces, hasta he tenido que añadir una imagen en las celdas, que fuera un rectangulito blanco (e invisible en el pdf), solo para conseguir que la celda tuviera la altura que yo quería. :D

Lo único que te puedo recomendar, es que yo trato de hacerlas lo más sencillas posibles. :-S

De todos modos, si quieres que una única celda tenga una justificación distinta, por ejemplo, centrada, puedes hacer:

\multicolumn{1}{c}{}

En cualquier caso, la tabla que tienes, ¡la veo genial!

Hasta luego y suerte. ;-)

christian lopez dijo...

me pueden ayudar, ya que estoy haciendo una tabla con este ejemplo pero como lleva caracteristicas (son textos largos) adentro de ella no me sale completa, alguien sabe como puedo resolver ese problema.

Luis dijo...

Hola Christian, busca en la categoría de tablas, donde tengo varios ejemplos precisamente para añadir textos largos. Hasta luego

Marikla dijo...

Hola Luis, tengo una duda, en el código para crear una tabla existe el siguiente argumento "[htb]" y al insertar una imagen existe una condición similar "[hbtp]". ¿Cual es la diferencia en ambas? o para que sirve ese argumento?

\begin{table}[htb]

\end{table


\begin{figure}[hbtp]

\end{figure}

Gracias!

Luis dijo...

Hola Marikla,
sirve para indicar dónde queremos a priori que LaTeX ponga la tabla o la imagen.

- h (here) aquí
- b (bottom) abajo
- t (top) arriba
- p (page) en esta página

Es decir, si pongo por ejemplo [htbp], LaTeX probará primero en ponerla aquí. Si no le convence, tratará luego de ponerlo en la parte de arriba de la página. Si tampoco, probará abajo de la página. Si no, en algún lugar cualquiera de esta página.

También tienes la opción [H] (del paquete float), para que LaTeX no prueba nada y lo ponga siempre aquí.

Hasta luego

Nàdia dijo...

Hola,
Muy útil este post ;) Teniendo en cuenta que descubrí ayer todo este mundillo de LaTeX.
Una pregunta, en las tablas, aunque tenga puesto:
\begin{table}[ht]
\caption{List of abbreviations}
\label{tab:fonts}
\begin{center}
\begin{tabular}{|l|l|}

Aunque el caption ponga "List of abbreviations", en el texto final veo Table 1. List of abbreviations. Quiero que me aparezca tal cual List of abbreviations, pero no consigo quitar el Table 1.

Muchas gracias

Luis dijo...

Hola Nàdia, bienvenida a LaTeX :-)

Puedes usar el paquete {caption} y la siguiente instrucción:

\usepackage{caption}
\captionsetup[table]{labelformat=empty}

Hasta luego

JONATHAN MARCELO CELLERE GUAMAN dijo...

Buen día este blog es muy bueno y me ha ayudado mucho para aprender latex.
Me gustaría saber como puedo mover una tabla en latex a una posición que yo quiero por ejemplo si tengo dos tablas y quiero que una de ellas salga a la izquierda de la otra como puedo hacerlo.
Muchas gracias por su ayuda.

Jonatan Garcia dijo...

Hola Luis

Excelente trabajo y me has ayudado mucho pero tengo un problema mis tablas son demasiado largas y se salen de la hoja quisiera saber como arreglar eso

Michelle Rox dijo...

Buenas

me gustaría saber como insertar una tabla, pero que esta no me aparezca en la lista de tablas, ya que forma parte de mis anexos.

marlon xavier dijo...

Hola a todos tengo dos preguntas, la primera me encuentro editando textos en latex necesito en una tabla combinar varias filas pero el texto no respeta la columna este se escribe totalmente en una sola linea, este texto tiene mas de 10 lineas, como puedo hacer esto.?? y la segunda como puedo compilar un documento latex en html.??

Gracias de antemano

Edgar Sandoval dijo...

Hola Luis
Te comento que tengo un problema. Estoy trabajando con la clase {a0poster} ya que necesito realizar un poster para presentarlo, y como sabrás lo ideal es hacerlo en varias columnas, ahora estoy realizándolo con el paquete {multicol}, pero mi problema es que necesito insertar una tabla pero el compilador me regresa un error: no se permiten objetos flotantes en el ambiente de multicols.
¿Hay alguna forma que pueda solucionar esto?
De antemano muchísimas gracias y felicidades por tu blog, me sacado de varios apuros en muchas ocaciones

jaio dijo...

Hola Luis!!

Tengo una duda respecto a Latex... He generado una tabla a través de tablesgenerator.com que te sale directamente el cógido que debes meter en Latex. Lo único, a la hora de visualizar el pdf, sale muy pequeña la tabla y al imprimirla a penas se ve lo que pone... cómo puedo ampliar la tabla para que se vea perfectamente??

Muchas gracias!!!