martes, 28 de octubre de 2014

Cómo girar 90 grados una sola celda en una tabla en LaTeX

Una de las asignaturas pendientes de LaTeX son las tablas. Hay que reconocer que, por ejemplo con Word, es inmensamente más fácil girar un texto de una celda, alinearlo, centrarlo vertical y horizontalmente, etc. ¿Cuál es mi consejo entonces? Bueno, cuando trabajo con LaTeX siempre trato de hacer las tablas lo más sencillitas posibles.

En esta entrada explicaré un poco cómo se puede girar verticalmente un texto. Las tablas se empiezan a complicar un poco, así que, es algo que recomendaría hacer solo en casos sencillos, como los siguientes.

En primer lugar, parto del siguiente ejemplo. Es una tabla normal, excepto quizás, en que en la primera columna fusiono las primeras 5 filas, y luego las 2 siguientes. Para lo que necesito el paquete {multirow}. Ahora, la idea sería girar 90º, las palabras Cretácico y Jurásico.

\usepackage{multirow}

\begin{table}[htb]
\centering
\begin{tabular}{|l|l|}
\hline
\multirow{5}{2cm}{Cretácico} & Tiranosaurio\\ \cline{2-2}
& Triceratops \\ \cline{2-2}
& Velociraptor \\ \cline{2-2}
& Anquilosaurio \\ \cline{2-2}
& Hadrosaurio \\ \hline
\multirow{2}{2cm}{Jurásico} & Alosaurio\\ \cline{2-2}
& Estegosaurio \\ \hline
\end{tabular}
\caption{Dinosaurios.}
\label{ta:dino}
\end{table}


Esto se puede hacer con el paquete {rotating}, que entre otras funciones, tiene la funcion "\rotatebox{xx}{yyy}", que nos gira la palabra yyy, el ángulo xx en grados (cuyo valor puede ser positivo o negativo). El resultado lo muestro a continuación. Por cierto, fíjate que ahora, la primera columna va a ser más estrechita. Y en vez de los 2cm de antes, pongo solo 0.5 cm.

\usepackage{multirow}
\usepackage{rotating}

\begin{table}[htb]
\centering
\begin{tabular}{|l|l|}
\hline
\multirow{5}{0.5cm}{\rotatebox{90}{Cretácico}} & Tiranosaurio\\ \cline{2-2}
& Triceratops \\ \cline{2-2}
& Velociraptor \\ \cline{2-2}
& Anquilosaurio \\ \cline{2-2}
& Hadrosaurio \\ \hline
\multirow{2}{0.5cm}{\rotatebox{90}{Jurásico}} & Alosaurio\\ \cline{2-2}
& Estegosaurio \\ \hline
\end{tabular}
\caption{Dinosaurios.}
\label{ta:dino}
\end{table}


Crétacico ha quedado bien, pero Jurásico es demasiado largo. Aquí empiezan los problemas que mencionaba con LaTeX... Bueno, esto se puede solucionar, por ejemplo, añadiendo un cierto espacio extra en las dos últimas filas. Esto se puede hacer añadiendo justo después del salto de línea, [ZZex] donde ZZ corresponde al espacio añadido, como se ve a continuación:

\usepackage{multirow}
\usepackage{rotating}

\begin{table}[htb]
\centering
\begin{tabular}{|l|l|}
\hline
\multirow{5}{0.5cm}{\rotatebox{90}{Cretácico}} & Tiranosaurio\\ \cline{2-2}
& Triceratops \\ \cline{2-2}
& Velociraptor \\ \cline{2-2}
& Anquilosaurio \\ \cline{2-2}
& Hadrosaurio \\ \hline
\multirow{2}{0.5cm}{\rotatebox{90}{Jurásico }} & Alosaurio\\[1.8ex] \cline{2-2}
& Estegosaurio \\[1.8ex] \hline
\end{tabular}
\caption{Dinosaurios.}
\label{ta:dino}
\end{table}


Un último pequeño problema es que ahora las palabras Alosaurio y Estegosaurio quedan muy arriba de sus respectivas celdas. Quedaría más bonito si estuvieran centradas verticalmente. Para solucionarlo, he añadido 2 filas extra (ahora con Jurásico fusiono 4 columnas, no solo 2), y añado al final de cada salto de línea los espacios extra con [ZZex]

\usepackage{multirow}
\usepackage{rotating}

\begin{table}[htb]
\centering
\begin{tabular}{|l|l|}
\hline
\multirow{5}{0.5cm}{\rotatebox{90}{Cretácico}} & Tiranosaurio\\ \cline{2-2}
& Triceratops \\ \cline{2-2}
& Velociraptor \\ \cline{2-2}
& Anquilosaurio \\ \cline{2-2}
& Hadrosaurio \\ \hline
\multirow{4}{0.5cm}{\rotatebox{90}{Jurásico }} & \\[-1ex]
& Alosaurio\\[0.9ex] \cline{2-2}
& \\[-1ex]
& Estegosaurio \\[0.9ex] \hline
\end{tabular}
\caption{Dinosaurios.}
\label{ta:dino}
\end{table}

4 comentarios:

Luis dijo...

Es bastante interesante, y engorroso ni se diga!! Pero, ¿no sería más fácil aprovechar las 4 celdas de "Jurásico" y la orden \multirow para unir las 2 de arriba en "Alosaurio" y las 2 de abajo en "Estegosaurio"? Así ya no habría forma de liarse con longitudes. Intenté hacer eso y el resultado es más o menos el mismo, salvo que los dinosaurios quedan perfectamente centrados en sus celdas. Aquí esa parte del código :)

\multirow{4}{0.5cm}{\rotatebox{90}{Jurásico}} & \multirow{2}{0cm}{Alosaurio}\\
& \\ \cline{2-2}
&\multirow{2}{0cm}{Estegosaurio}\\
& \\ \hline
\end{tabular}
\caption{Dinosaurios.}
\label{ta:dino}
\end{table}

Son necesarias las filas "en blanco" porque representan la segunda fila a fusionar de cada dinosaurio. Si se fusionaran más de ellas, habría que poner entonces las filas en blanco correspondientes. Espero no haber liado más el asunto, que de por sí ya es bastante difícil, jaja. Saludos desde México! :)

Unknown 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

TheGuapo dijo...

una pregunta, como tendría que hacerle si quiero eliminar la palabra capitulo de una hoja, pero sin dejar de usar el \chapter?

Vicente Santana dijo...

Hola,
He visto un comentario en el que alguien solicita que en el índice, al inicio, aparezca la palabra «Página» pero centrada con respecto a los números de página que siguen. esto se consigue de la siguiente forma:

\hsize es el comando que define el tamaño de la línea de la escritura, lo que tenemos que hacer es simplemente aumentar momentáneamente el tamaño de la línea donde aparece «Página» y luego volver a restaurar el tamaño que teníamos. Lo hacemos así:

\addtocontents{toc}{\advance\hsize by1ex\hfill\textbf{Página}\par\advance\hsize by-1ex}

En este caso he utilizado 1ex pero podemos poner cualquier otra dimensión que nos venga bien.
Un saludo,
Vicente Santana