¿Cómo puedo centrar el texto (tanto horizontal como vertical) en columnas particulares?

¿Cómo puedo centrar el texto (tanto horizontal como vertical) en columnas particulares?

¿Cómo puedo centrar verticalmente las primeras tres columnas de modo que todos los valores de estas columnas estén en el centro?

\begin{center}
\begin{tabular}{|c| c |c| p{5cm}|}
\hline

\rowcolor[gray]{.8}Day & Min Temp & Max Temp & \multicolumn{1}{c|}{ Summary} \\ \hline

Monday & 11C & 22C & A clear day with lots of sunshine. 
However, the strong breeze will bring down the temperatures \\ \hline 

Tuesday & 9C & 19C & Cloudy with rain, across many northern regions. 
Clear spells across most of Scotland and Northern Ireland, but rain 
reaching the far northwest \\ \hline

Wednesday & 10C & 21C & Rain will still linger for the morning. 
Conditions will improve by early afternoon and continue throughout the evening.                        \\ \hline

\end{tabular}
\end{center}

ingrese la descripción de la imagen aquí

Debe tener un aspecto como este:

ingrese la descripción de la imagen aquí

Editar:

Esto es lo que probé a partir de las preguntas pegadas en los comentarios:

\begin{center}
\renewcommand{\tabularxcolumn}[1]{m{#1}}
\begin{tabularx}{|m{1in}|c|c| p{5cm}|}
\hline

\rowcolor[gray]{.8}Day & Min Temp & Max Temp & \multicolumn{1}{c|}{ Summary} \\ \hline

Monday                     & 11C                             & 22C                             & A clear day with lots of sunshine. However, the strong breeze will bring down the temperatures                                                 \\ \hline
Tuesday                    & 9C                              & 19C                             & Cloudy with rain, across many northern regions. Clear spells across most of Scotland and Northern Ireland, but rain reaching the far northwest \\ \hline
Wednesday                  & 10C                             & 21C                             & Rain will still linger for the morning. Conditions will improve by early afternoon and continue throughout the evening.                        \\ \hline
\end{tabularx}
\end{center}

Todavía no funciona.

Respuesta1

¡Bienvenido a TeX.SE!

Considere publicar un MWE completo la próxima vez. Agregué algunas partes faltantes a mi respuesta, pero omití el color de fondo gris en la línea del título. Considera esto como tu tarea ;-)

LaTeX básicamente conoce dos tipos de columnas. Un tipo, donde LaTeX calcula el ancho de la propia columna. Las letras l, cy rrepresentan este tipo de columnas. Las columnas "crecen" en ancho cada vez que el autor les agrega texto.

Por otro lado si tenemos el tipo de columnas, donde el autor define un ancho. El identificador de este tipo de columna es, por ejemplo p{<width>}. Lo usó para su última columna y lo definió p{5cm}en su MWE. Esta columna tendrá 5 cm de ancho. Si el autor (¡es decir, usted!) agrega más texto, que tenga más de 5 cm de ancho, LaTeX dividirá el texto y comenzará una nueva línea. La columna resultante tendrá formato de texto justificado, como puede ver en sus ejemplos.

Para obtener los resultados deseados, todo lo que tienes que hacer es

  1. cargar el arraypaquete
  2. use el m{<width>}tipo de columna en lugar de columnas cop{<width>}

Por supuesto, esto es sólo la mitad de la verdad.

Los arraypaquetes le ofrecen los tipos de columnas my b. Actúan como la pcolumna en la que el usuario tiene que definir su ancho. LaTeX luego romperá líneas y producirá texto justificado. La diferencia entre esos tipos de columnas es laalineamiento vertical. La regla general es:

  • pestá alineado en elPAG,
  • mestá alineado en elMETROinactivo y
  • bestá alineado en elBotomano.

(¡Lea el manual de la matriz para comprender el comportamiento exacto!)

Entonces, usar un mtipo de columna en su tabla alineará todas las líneas verticalmente centradas, como lo solicitó.

Pero también tenemos que abordar la alineación horizontal. Las mcolumnas se comportan igual que las pcolumnas que acabamos de reemplazar. En la última columna, este comportamiento está bien. Pero en las primeras columnas queremos que el texto también esté centrado horizontalmente.

Aquí viene el siguiente truco, que ofrece el arraypaquete. Puedes usar el >{cmd}. Visualice el >como una flecha, que empuja el cmddesde el interior de las llaves hacia la columna al lado. Si defines en tu tabla algo como

\begin{tabular}{ l >{\raggedright}p{5cm} l }

Obtendrá un ptipo de columna de 5 cm de ancho en el medio entre dos lcolumnas habituales como primera y última columna de esa tabla.

Pero >{\raggedright}empuja el comando \raggedrighta esa mcolumna, cada vez que ingresa a esta segunda columna. Este comando cambiará la alineación en esa segunda columna para que quede nivelada en el lado izquierdo y irregular en el lado derecho.

En lugar de la definición anterior, podría haber escrito

\begin{tabular}{l p{5cm} l}
first cell & \raggedright lots of text in the second cell, which is flush left & third cell \\
next line, first cell & \raggedright again lots of text ... & third cell \\
new line first cell & \raggedright ... & ... \\
once again & \raggedright ... & end \\
\end{tabular}

Pero en este caso, debe ingresar el \raggedrightcomando cada vez que ingresa a la segunda columna, lo que puede resultar molesto muy rápidamente. En lugar de escribirlo cada vez que ingresas a esa columna, el >{\raggedright}truco de la definición anterior lo hará automáticamente por ti. Me parece prometedor.

Para obtener un código LaTeX realmente limpio, debe agregar \arraybackslash\hspace{0pt}al ejemplo anterior. Pero esta monstruosa cadena hará que su código de entrada sea ilegible. Entonces te presento el siguiente truco.

El arraypaquete también ofrece el \newcolumntypecomando. Debe usarlo en el preámbulo de su documento (es decir, antes \begin{document}). Simplemente elija una letra para que actúe como un nuevo tipo de columna. Solicitaste un tipo de columna centrada. Por eso sugiero la letra "C", que no estaba definida antes.

Entonces la solución más simple sería

\newcolumntype{C}{>{\raggedright\arraybackslash\hspace{0pt}}m{5cm}}

y reemplace todas sus definiciones de columna ( cy p{5cm}) con este nuevo y brillante Ctipo de columna.

\begin{tabular}{|C|C|C|C|}

A veces, una solución tan sencilla tiene algunos inconvenientes importantes. En su caso particular, cada columna de su tabla ahora tiene 5 cm de ancho. Supongo que no es exactamente lo que quieres, ¿verdad? Las primeras tres columnas no necesitan tener 5 cm de ancho. ¿Cómo podríamos solucionar eso?

Aquí está mi próxima mejora. En la primera fila, la entrada más amplia parece ser la palabra "miércoles". Dejemos que LaTeX determine su ancho y utilícelo como ancho para la primera columna. Para hacerlo, puede usar el comando \settowidthpara medir el ancho de la palabra. Pero también tenemos que cambiar nuestra nueva definición de columna C. Tenemos que definirlo de una manera más flexible. Tras una inspección cuidadosa, se debe dar cuenta de que la Ccolumna debe tener un ancho variable, como p{<width>}lo tiene. La pcolumna tiene un par de tirantes. Así que agreguemos esto a nuestra Ccolumna.

\newcolumntype{C}[1]{>{\raggedright\arraybackslash\hspace{0pt}}m{#1}}

¿Ver la diferencia? Agregué [1]al comienzo de la definición. Esto significa que la Ccolumna debe tener un par de tirantes. El valor dado en ese par se indica con #1al final de mi definición. Esto nos da la flexibilidad deseada.

El MWE completo ahora se ve así:

\documentclass{article}
\usepackage{array}                  % better control for tabular

%% Define the length of the longest day name
\newlength{\daylength}
\settowidth{\daylength}{Wednesday}

%% Create a new columntype, where the text is vertically and
%% horizontally centered.  The new identifier should be "C".
\newcolumntype{C}[1]{%
  >{\centering\arraybackslash\hspace{0pt}}m{#1}}


\begin{document}
\begin{center}
   \begin{tabular}{|C{\daylength}| C{2cm} | C{2cm} | m{5cm} |}
    \hline
    Day & Min Temp & Max Temp & \multicolumn{1}{c|}{ Summary} \\
    \hline
    Monday & 11C & 22C & A clear day with lots of sunshine. 
    However, the strong breeze will bring down the temperatures \\ 
    \hline 
    Tuesday & 9C & 19C & Cloudy with rain, across many northern regions. 
    Clear spells across most of Scotland and Northern Ireland, but rain 
    reaching the far northwest \\ 
    \hline
    Wednesday & 10C & 21C & Rain will still linger for the morning. 
    Conditions will improve by early afternoon and continue throughout the evening. \\ 
    \hline
  \end{tabular}
\end{center}
\end{document}

y da como resultado esta salida

ingrese la descripción de la imagen aquí

Personalmente, también definiría un nuevo Rtipo de columna, que facilita una columna alineada a la izquierda, ya que estas columnas pequeñas no se ven bien cuando están justificadas. Lo agregaré a tu montón de tareas. :-)


EDITAR

\arraybackslashle permite nuevamente usarlo \\para finalizar la línea de la tabla y comenzar una nueva línea. \hspace{0pt}permite que LaTeX comience a dividirse en la primera palabra, lo cual es importante en columnas muy pequeñas.

información relacionada