
Несмотря на десятки ответов о вертикальном центрировании ячеек таблицы, я не смог (по своей вине) найти решение, казалось бы, простой проблемы — вертикального центрирования ячеек в одном ряду вручную заполненных многострочных ячеек.
\documentclass[12pt]{article}
\usepackage{xcolor}
\usepackage{array}
\begin{document}
\pagecolor{yellow!10}
\newcommand{\methoda}[1]{{\parbox[c]{\linewidth}{\centering#1}}}
\newcommand{\methodb}[3]{\begin{tabular}[c]{@{}c@{}}#1\\#2\\#3\end{tabular}}
\newcommand{\methodc}[1]{\begin{minipage}[m]{\linewidth}\centering#1\end{minipage}}
\newcommand{\methodd}[1]{{\begin{center}#1\end{center}}}
\newcommand{\methoddfix}[1]{{\setlength{\topsep}{0pt}\begin{center}#1\end{center}}}
\centering\begin{tabular}{>{\raggedright\arraybackslash}m{0.28\linewidth}>{\centering\arraybackslash}m{0.33\linewidth}}
\tabularnewline\hline
\centering Column 1 & Column 2\tabularnewline\hline
2 lines vertically centered & This cell contains more than one line of automatically wrapped text. \tabularnewline\hline
Fail of vertical centering & \methoda{Hand-wrapped\\ multiline\\ method A} \tabularnewline\hline
Vert. center. fail & \methodb{Hand-wrapped}{multiline}{method B} \tabularnewline\hline
Fail of vertical centering & \methodc{Hand-wrapped multiline\\ method C\\ too much padding} \tabularnewline\hline
Vert. center. OK & \methodd{Hand-wrapped multiline\\ method D\\ too much padding} \tabularnewline\hline
Success column 1, fail column 2 & \methoddfix{Hand-wrapped multiline\\ method Dfix\\ cannot remove\\ bottom padding} \tabularnewline\hline
Just a last row & Just a last row \tabularnewline\hline
\end{tabular}
\end{document}
Моя реальная таблица создана longtable
с использованием multirow
и, возможно, tabularx
какого-то другого дополнительного расширенного пакета и скомпилирована с помощью XeLaTeX.
Заранее благодарю за любую помощь.
решение1
С makecell
вложенными tabular
s и p
типом второго столбца:
\documentclass[12pt]{article}
\usepackage{array}
\usepackage{makecell}
\begin{document}
With a multicolumn around the automatically wrapped columns:
\centering\begin{tabular}{>{\raggedright\arraybackslash}m{0.28\linewidth}>{\centering\arraybackslash}p{0.33\linewidth}}
\hline
some automatically wrapped text & \makecell[cc]{Some \\ manually \\ linebroken \\ text \\ over multiple lines}\\ \hline
some automatically wrapped text & \begin{tabular}[c]{@{}c@{}}Some \\ manually \\ linebroken \\ text \\ over multiple lines\end{tabular}\\ \hline
some automatically wrapped text & \multicolumn{1}{>{\centering\arraybackslash}m{0.33\linewidth}}{some longer but also automatically wrapped text}\\ \hline
\end{tabular}
With a multicolumn around the manually wrapped columns:
\begin{tabular}{>{\raggedright\arraybackslash}m{0.28\linewidth}>{\centering\arraybackslash}m{0.33\linewidth}}
\hline
some automatically wrapped text & \multicolumn{1}{>{\centering\arraybackslash}p{0.33\linewidth}}{\makecell[cc]{Some \\ manually \\ linebroken \\ text \\ over multiple lines}}\\ \hline
some automatically wrapped text & \multicolumn{1}{>{\centering\arraybackslash}p{0.33\linewidth}}{\begin{tabular}[c]{@{}c@{}}Some \\ manually \\ linebroken \\ text \\ over multiple lines\end{tabular}}\\ \hline
some automatically wrapped text & some longer but also automatically wrapped text\\ \hline
\end{tabular}
\end{document}
Обновлять:Чтобы объединить ручные и автоматические переносы строк, можно изменить начальное определение столбца, включив \let\newline\\\arraybackslash\hspace{0pt}
вместо просто \arraybackslash
.
\documentclass[12pt]{article}
\usepackage{array}
\usepackage{makecell}
\begin{document}
\begin{tabular}{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{0.28\linewidth}>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{0.33\linewidth}}
\hline
some automatically wrapped text & some longer but also automatically wrapped text\\ \hline
some automatically wrapped text & some\newline automatically wrapped text with a\newline few \newline manual linebreaks\\ \hline
manual \newline linebreak & more text here\\
\hline
\end{tabular}
\end{document}