Различное выравнивание столбцов, когда столбец «X» переносится в tabularx

Различное выравнивание столбцов, когда столбец «X» переносится в tabularx

В 2013 году я задал этот вопрос и получил ответ, но при реализации другого кода у меня возникли новые проблемы, которые ранее не возникали.

У меня есть три столбца tabularx, в двух из которых есть l, rили cи средний столбец является Xстолбцом. Если Xстолбец занимает больше одной строки, желаемое поведение заключается в том, что первый столбец (скажем, столбец l) должен быть выровнен по верхнему краю (в той же строке, что и первая строка столбца) X, а третий столбец должен быть выровнен по нижнему краю (в той же строке, что и последняя строка столбца X). Пустые столбцы заполняются чем-то вроде \cdot.

Оригинальный пост доступен по адресу [1]; решение, предоставленное Дэвидом Карлайлом, включало новые команды для проведения измерений и размещения текста в нужных позициях: \xleft, \xright, \xstart, \xendи \xpad. До сих пор все работало отлично.

  1. Если ячейки в первом и третьем столбцах содержат более одного символа текста, заполненные ячейки будут выровнены по горизонтали относительно начала/конца текста в других задействованных ячейках, а не по центру, что и является желаемым внешним видом.
  2. Использование \hboxдля печати содержимого ячеек препятствует использованию растягиваемых пробелов, таких как \hfill, и одна ячейка в правом столбце должна иметь шаблон text\hfill textдля расширения пробела между двумя словами до ширины столбца (взятого из более длинной ячейки, в моем случае это заголовок столбца).

Следующий код — это решение Дэвида Карлайла, проиллюстрированное для того, чтобы показать, чего я хочу сейчас:

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2{\xpad{#1}{\hbox{#2}}{}}
\def\xright#1#2{\xpad{#1}{}{\hbox{#2}}}

\begin{document}
\begin{tabularx}{5cm}{cXr}
title 1 & title 2 & title 3 \\

 \xleft{a}{7890} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1} \\
 \xleft{b}{50} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

Как мы видим, точки под "7890" выровнены по началу этой ячейки, т. е. под числом "7", а точка под ячейкой "50" находится прямо под "5". Общий вид таков, что все это не выровнено. Я предпочитаю, чтобы они все были центрированы как по первому, так и по третьему столбцам ( cи rстолбцам).

Второй момент относится к использованию \hfill. В этом примере \hfillin A\hfill1расширяется до нуля, поэтому отображается текст "A1", но следующая строка содержит , A\hfill2в которой растягиваемое пространство расширяется до размера самой широкой ячейки (первая: "title 3"). Было бы здорово, если бы эффект \hfillможно было также достичь со строками, по которым Xможет переноситься столбец.

ТИА.

[1]tabularx: выравнивание по нижнему краю в столбцах r или l при переносе столбца X

решение1

Простейшая вещь без переписывания всего этого — разрешить вам указывать ширину для использования в поле, чтобы позволить \hfillрастягиваться. Было бы возможно (я полагаю) использовать механизм, \pdflatstposиспользуемый для измерения вертикальной протяженности столбца X, для измерения горизонтальной протяженности 1-го и 3-го столбцов, но это добавляет много сложностей для того, что, возможно, имеет мало практического применения. Вместо того, чтобы использовать фиксированную ширину 2 см, как здесь, вы могли бы использовать \settowidthдля получения ширины того, что, как вы знаете, является самым широким входом.

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

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2#3{\xpad{#1}{\hbox\ifx!#3!\else to #3\fi{#2}}{}}
\def\xright#1#2#3{\xpad{#1}{}{\hbox\ifx!#3!\else to #3\fi{#2}}}

\begin{document}
\begin{tabularx}{5cm}{lXr}
\multicolumn{1}{c}{title 1}& title 2 & title 3 \\

 \xleft{a}{7890}{} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1}{2cm} \\
 \xleft{b}{50}{} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1}{2cm} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

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