
В 2013 году я задал этот вопрос и получил ответ, но при реализации другого кода у меня возникли новые проблемы, которые ранее не возникали.
У меня есть три столбца tabularx
, в двух из которых есть l
, r
или c
и средний столбец является X
столбцом. Если X
столбец занимает больше одной строки, желаемое поведение заключается в том, что первый столбец (скажем, столбец l
) должен быть выровнен по верхнему краю (в той же строке, что и первая строка столбца) X
, а третий столбец должен быть выровнен по нижнему краю (в той же строке, что и последняя строка столбца X
). Пустые столбцы заполняются чем-то вроде \cdot
.
Оригинальный пост доступен по адресу [1]; решение, предоставленное Дэвидом Карлайлом, включало новые команды для проведения измерений и размещения текста в нужных позициях: \xleft
, \xright
, \xstart
, \xend
и \xpad
. До сих пор все работало отлично.
- Если ячейки в первом и третьем столбцах содержат более одного символа текста, заполненные ячейки будут выровнены по горизонтали относительно начала/конца текста в других задействованных ячейках, а не по центру, что и является желаемым внешним видом.
- Использование
\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
. В этом примере \hfill
in 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}