Табличный: Соедините измерения одной таблицы с другой таблицей.

Табличный: Соедините измерения одной таблицы с другой таблицей.

tabularустанавливает ширину столбцов по самому широкому элементу во всех строках.

Можно ли задать два или более отдельных tabulars, чтобы они учитывали ширину столбцов друг друга и выбирали наибольшую из них?

Например, если я разбиваю tabularтекст дополнительным абзацем и хочу продолжить таблицу, как если бы это был longtableпереход на следующую страницу (та же ширина столбцов, возможно, повторение заголовков), возможно ли это?

решение1

Идея состоит в том, чтобы создать кучу специальных типов столбцов, так что каждый раз, когда этот тип столбца появляется в таблице, он всегда будет иметь одну и ту же ширину. Для этого требуется 2 прогона документа, где ширины, вычисленные в первом прогоне, сохраняются в файле aux.

Примечание: если вы когда-нибудь захотите сделать столбцы уже, вам придется удалить aux-файл или, по крайней мере, закомментировать \AtEndDocument.

\documentclass{article}
\usepackage{array}

\newsavebox{\tempbox}% \box0 etc. used

\makeatletter
\newcommand{\saveWidth}[1]% #1=column name (A,B,...)
{\immediate\write\@auxout{\string\initWidth{#1}{\the\csname Width#1\endcsname}}}

\newcommand{\initWidth}[2]% #1=column name (A,B,...), #2=the width
{\@ifundefined{Width#1}{}{\global\csname Width#1\endcsname=#2\relax}}
\makeatother

\newlength{\WidthA}% one for each column type
\newlength{\WidthB}
\newlength{\WidthC}

\AtEndDocument{\saveWidth{A}\saveWidth{B}\saveWidth{C}}

\newcolumntype{A}{>{\savebox{\tempbox}\bgroup}{l}<{\egroup%
  \ifdim\wd\tempbox>\WidthA \global\WidthA=\wd\tempbox\fi%
  \makebox[\WidthA][l]{\usebox\tempbox}}}

\newcolumntype{B}{>{\savebox{\tempbox}\bgroup}{c}<{\egroup%
  \ifdim\wd\tempbox>\WidthB \global\WidthB=\wd\tempbox\fi%
  \makebox[\WidthB][c]{\usebox\tempbox}}}

\newcolumntype{C}{>{\savebox{\tempbox}\bgroup}{r}<{\egroup%
  \ifdim\wd\tempbox>\WidthC \global\WidthC=\wd\tempbox\fi%
  \makebox[\WidthC][r]{\usebox\tempbox}}}

\begin{document}
\noindent\begin{tabular}{ABC}
left & center & right\\
wide left & wide center  & wide right
\end{tabular}

\medskip
Some text here.
\medskip

\noindent\begin{tabular}{ABC}
left & center & right\\
\end{tabular}

\medskip
Some text here.
\medskip

\noindent\begin{tabular}{ABC}
very wide left & very wide center & very wide right\\
\end{tabular}

\end{document}

Чтобы было проще создавать новые столбцы, я добавил \newcolumnwidth{<name>}{l/c/r}(что само по себе довольно некрасиво).

\newcommand{\newcolumnwidth}[2]% #1=new column type, #2=l/c/r
{\expandafter\newlength\csname Width#1\endcsname%
 \AtEndDocument{\saveWidth{#1}}%
 \newcolumntype{#1}{>{\savebox{\tempbox}\bgroup}{#2}<{\egroup%
  \ifdim\wd\tempbox>\csname Width#1\endcsname \global\csname Width#1\endcsname=\wd\tempbox\fi%
  \makebox[\csname Width#1\endcsname][#2]{\usebox\tempbox}}}}

\newcolumnwidth{A}{l}
\newcolumnwidth{B}{c}
\newcolumnwidth{C}{r}

решение2

Подход, которому я бы следовал, похож на то, что делается внутри tabbingсреды. Вы устанавливаете первую строку, которая определяет позиции табуляции, а затем \killэту строку, чтобы она не отображалась. Последующие строки будут использовать эти позиции табуляции без первой строки.

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

\documentclass{article}

\begin{document}

\noindent
\begin{tabular}{l c r}
  left      & center      &      right \\
  wide left & wide center & wide right
\end{tabular}

\medskip

Some text here.

\medskip

\noindent
\begin{tabular}{l c r}
  \phantom{wide left} &
    \phantom{wide center} & 
    \phantom{wide right} \\[-\normalbaselineskip]% Similar to \kill
  left      & center      &      right
\end{tabular}

\end{document}

« \killСтрока» в приведенном выше примере помещает самые широкие элементы обеих таблиц внутрь \phantom, тогда как высота строки удаляется с помощью новой строки в форме \\[-\normalbaselineskip].

Если содержимое, которое нужно скрыть, очень высокое, используйте \hphantom. Если вас беспокоит наложение вертикальных линий, не используйте их (как предлагает awesomebooktabs) или вставьте каждый элемент столбца в « \killстроку», используя\multicolumn{1}{l}{...} безвертикальные правила.

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