
Я борюсь с, казалось бы, тривиальным случаем вертикального выравнивания в tabular
. Рассмотрим 3 столбца: два столбца содержат текст, который должен быть мягко обведен и должен быть выровнен повершинаячеек. Третий столбец (средний столбец в моем примере) должен быть вертикально отцентрирован в строке.
Пример:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{m{4cm} m{1cm} m{4cm}}
\lipsum[1][1] & x & \lipsum[1][1]
\end{tabular}
\end{document}
Это выглядит так, как и ожидалось, но только если два текста занимают одинаковую высоту. В противном случае (просто меняем второй \lipsum[1][1]
на \lipsum[1][1-2]
, результат будет:
Проблема: содержимое столбца 1 не выровнено по верху ячейки.
Конечно, изменение выравнивания двух «длинных» столбцов на следующее p{4cm}
не помогает:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{p{4cm} m{1cm} p{4cm}}
\lipsum[1][1] & x & \lipsum[1][1-2]
\end{tabular}
\end{document}
Проблема: Теперь столбец в середине больше не отцентрирован по вертикали.
я думаю, что понялпочемупроисходит следующее: Все эти выравнивания относятся к первой «линии» текущей ячейки, а не к самой ячейке. (Как) Возможно ли это? Я ищу спецификацию столбца, которая позволяет мне производить:
В лучшем случае мне даже не пришлось бы указывать ширину столбца посередине.
решение1
решение2
На самом деле не все так тривиально.
Вы можете измерить два больших ящика, а затем поместить средний в вертикальный центр. Однако TeX может сделать это за вас.
\documentclass{article}
\usepackage[latin]{babel} % for better hyphenation
\usepackage{lipsum} % for mock text
\usepackage{microtype} % for less overfull boxes
\newcommand{\mytwocols}[4][4cm]{%
\valign{##\cr
\mycol{\vtop}{#1}{#2}\vfill\cr
\noalign{\hspace{2\tabcolsep}}
\vfill\mycol{\vbox}{1cm}{#3}\vfill\cr
\noalign{\hspace{2\tabcolsep}}
\mycol{\vtop}{#1}{#4}\vfill\cr
}%
}
\newcommand{\mycol}[3]{%
#1{\hsize#2\relax\parindent0pt\relax\sloppy#3}%
}
\begin{document}
\mytwocols
{\lipsum[1][1]}
{x}
{\lipsum[1][1]}
\bigskip
\mytwocols
{\lipsum[1][1]}
{x}
{\lipsum[1][1-2]}
\bigskip
\mytwocols
{\lipsum[1][1-2]}
{x}
{\lipsum[1][1]}
\end{document}
решение3
Или используйте
\phantom
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\newcolumntype{M}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\begin{document}
\begin{tabular}{p{4cm} M{5cm} p{4cm}}
\lipsum[1][1] & {\phantom{\lipsum[1][1-2]}} x & \lipsum[1][1-2]
\end{tabular}
\end{document}
решение4
Ручное, но очень простое решение — выровнять количество строк левой ячейки и использовать столбец c
для разделителя «x»:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{m{4cm}@{\qquad}c@{\qquad}m{4cm}}
\lipsum[1][1]\newline\newline\newline & x & \lipsum[1][1-2]
\end{tabular}
\end{document}