Вертикальное выравнивание относительно высоты строки

Вертикальное выравнивание относительно высоты строки

Я борюсь с, казалось бы, тривиальным случаем вертикального выравнивания в 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}

Вывод 1: ок

Это выглядит так, как и ожидалось, но только если два текста занимают одинаковую высоту. В противном случае (просто меняем второй \lipsum[1][1]на \lipsum[1][1-2], результат будет:

Вывод 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}

Вывод 3: неверно

Проблема: Теперь столбец в середине больше не отцентрирован по вертикали.


я думаю, что понялпочемупроисходит следующее: Все эти выравнивания относятся к первой «линии» текущей ячейки, а не к самой ячейке. (Как) Возможно ли это? Я ищу спецификацию столбца, которая позволяет мне производить:

Ожидаемый результат

В лучшем случае мне даже не пришлось бы указывать ширину столбца посередине.

решение1

Можно схитрить \multirow, посчитав максимальное количество строк в ячейках строки:

\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array, multirow}

\begin{document}

    \begin{tabular}{p{4cm} m{1cm} p{4cm}}
    \lipsum[1][1] & \multirow{6}{=}{x} & \lipsum[1][1-2]
    \end{tabular}

\end{document} 

введите описание изображения здесь

решение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}

Связанный контент