Como centralizo o texto (horizontal e vertical) em colunas específicas?

Como centralizo o texto (horizontal e vertical) em colunas específicas?

Como posso centralizar verticalmente as três primeiras colunas de forma que todos os valores nessas colunas fiquem no 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}

insira a descrição da imagem aqui

Deveria ficar assim:

insira a descrição da imagem aqui

Editar:

Aqui está o que tentei com as perguntas coladas nos comentários:

\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}

Ainda não funciona.

Responder1

Bem-vindo ao TeX.SE!

Por favor, considere postar um MWE completo na próxima vez. Adicionei algumas partes que faltavam à minha resposta, mas perdi a cor de fundo cinza na linha do título. Considere isso como seu dever de casa ;-)

O LaTeX basicamente conhece dois tipos de colunas. Um tipo, onde o LaTeX calcula a largura da própria coluna. As letras l, ce rrepresentam este tipo de colunas. As colunas “aumentam” em largura sempre que o autor adiciona texto a elas.

Por outro lado, temos o tipo de colunas, onde o autor define uma largura. O identificador para este tipo de coluna é, por exemplo p{<width>}, . Você o usou para sua última coluna e definiu p{5cm}em seu MWE. Esta coluna terá 5 cm de largura. Se o autor (ou seja, você!) adicionar mais texto, com largura superior a 5 cm, o LaTeX quebrará o texto e iniciará uma nova linha. A coluna resultante será formatada em texto justificado, como você pode ver nos seus exemplos.

Para obter os resultados desejados, tudo o que você precisa fazer é

  1. carregue o arraypacote
  2. use o m{<width>}tipo de coluna em vez de cou p{<width>}colunas

Claro, isso é apenas metade da verdade.

Os arraypacotes oferecem os mtipos bde colunas. Eles atuam como a pcoluna em que o usuário deve definir sua largura. O LaTeX quebrará as linhas e produzirá texto justificado. A diferença entre esses tipos de coluna é aAlinhamento vertical. A regra prática é:

  • pestá alinhado emP,
  • mestá alinhado noMocioso e
  • bestá alinhado noBottom.

(Por favor, leia o manual do array para entender o comportamento exato!)

Portanto, usar um mtipo de coluna em sua tabela alinhará todas as linhas centralizadas verticalmente, conforme solicitado.

Mas também temos de abordar o alinhamento horizontal. As mcolunas se comportam da mesma forma que as pcolunas que acabamos de substituir. Na última coluna, esse comportamento está OK. Mas nas primeiras colunas queremos que o texto também fique centralizado horizontalmente.

Aí vem o próximo truque, oferecido pelo arraypacote. Você pode usar o >{cmd}. Visualize o >como uma seta, que empurra o cmdde dentro das chaves para a coluna próxima a ele. Se você definir em sua tabela algo como

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

você obterá um ptipo de coluna de 5 cm de largura no meio entre duas lcolunas usuais como primeira e última coluna dessa tabela.

Mas ele >{\raggedright}empurra o comando \raggedrightpara essa mcoluna, toda vez que você entra nesta segunda coluna. Este comando alterará o alinhamento dessa segunda coluna para ficar nivelado no lado esquerdo e irregular no lado direito.

Em vez da definição acima, você poderia ter digitado

\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}

Mas neste caso, você terá que digitar o \raggedrightcomando toda vez que entrar na segunda coluna, o que pode se tornar irritante muito rapidamente. Em vez de digitá-lo toda vez que você entrar nessa coluna, o >{\raggedright}truque da definição anterior fará isso automaticamente para você. Parece promissor para mim.

Para obter um código LaTeX realmente limpo, você deve adicionar \arraybackslash\hspace{0pt}ao exemplo acima. Mas essa string monstruosa tornará seu código de entrada ilegível. Então apresento o próximo truque.

O arraypacote também oferece o \newcolumntypecomando. Você deve usá-lo no preâmbulo do seu documento (ou seja, antes \begin{document}). Basta escolher uma letra para atuar como um novo tipo de coluna. Você solicitou um tipo de coluna centralizada. Por isso sugiro a letra “C”, que não estava definida anteriormente.

Então a solução mais simples seria

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

e substitua todas as definições de coluna ( ce p{5cm}) por este tipo de coluna totalmente novo e brilhante C.

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

Às vezes, uma solução tão simples tem algumas desvantagens importantes. No seu caso específico, cada coluna da sua tabela agora tem 5 cm de largura. Eu acho que não é exatamente o que você quer, certo? As três primeiras colunas não precisam ter 5 cm de largura. Como poderíamos resolver isso?

Aqui está meu próximo aprimoramento. Na primeira linha, a entrada mais larga parece ser a palavra “quarta-feira”. Então deixe o LaTeX determinar sua largura e usá-la como largura para a primeira coluna. Para fazer isso, você pode usar o comando \settowidthpara medir a largura da palavra. Mas também temos que mudar nossa nova definição de coluna C. Temos que defini-lo de uma forma mais flexível. Através de uma inspeção cuidadosa, deve-se perceber que a Ccoluna deve ter largura variável, como p{<width>}tem. A pcoluna possui um par de colchetes. Então, vamos adicionar isso à nossa Ccoluna.

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

Veja a diferença? Eu adicionei [1]no início da definição. Isso significa que a Ccoluna deve ter um par de colchetes. O valor dado nesse par é indicado #1no final da minha definição. Isso nos dá a flexibilidade desejada.

O MWE completo agora se parece com isto:

\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}

e resulta nesta saída

insira a descrição da imagem aqui

Pessoalmente, eu também definiria um novo Rtipo de coluna, o que facilita uma coluna alinhada à esquerda, já que essas colunas pequenas não ficam bem quando justificadas. Vou adicioná-lo à sua pilha de trabalhos de casa. :-)


EDITAR

\arraybackslashpermite que você use novamente para \\encerrar a linha da tabela e iniciar uma nova linha. \hspace{0pt}permite que o LaTeX comece a quebrar na primeira palavra, o que é importante em colunas muito pequenas.

informação relacionada