Tabellarisch: Koppeln Sie die Dimensionen einer Tabelle mit einer anderen Tabelle.

Tabellarisch: Koppeln Sie die Dimensionen einer Tabelle mit einer anderen Tabelle.

tabularLegt die Spaltenbreite auf das breiteste Element aller Zeilen fest.

Ist es möglich, zwei oder mehr separate s so einzustellen, tabulardass sie die Spaltenbreiten der jeweils anderen berücksichtigen und die größte davon auswählen?

Wenn ich beispielsweise eine tabularTabelle durch weiteren Absatztext unterbreche und sie wie einen longtableÜbergang auf der nächsten Seite fortsetzen möchte (gleiche Spaltenbreiten, evtl. Wiederholung der Überschriften), wäre dies möglich?

Antwort1

Die Idee besteht darin, eine Reihe spezieller Spaltentypen zu erstellen, sodass dieser Spaltentyp jedes Mal, wenn er in einer Tabelle erscheint, immer die gleiche Breite hat. Dies erfordert zwei Durchläufe des Dokuments, wobei die im ersten Durchlauf berechneten Breiten in der AUX-Datei gespeichert werden.

Hinweis: Wenn Sie die Spalten jemals schmaler machen möchten, müssen Sie die AUX-Datei löschen oder zumindest \AtEndDocument auskommentieren.

\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}

Um das Erstellen neuer Spalten zu vereinfachen, habe ich Folgendes hinzugefügt \newcolumnwidth{<name>}{l/c/r}(was an sich schon ziemlich hässlich ist).

\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}

Antwort2

Der Ansatz, den ich verfolgen würde, ähnelt dem, was innerhalb der tabbingUmgebung gemacht wird. Sie legen eine erste Zeile fest, die die Tabstopps definiert, und dann \killdiese Zeile, damit sie nicht angezeigt wird. Nachfolgende Zeilen verwenden diese Tabstopps, ohne dass die erste Zeile vorhanden ist.

Bildbeschreibung hier eingeben

\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}

Die „ \killZeile“ im obigen Beispiel platziert die breitesten Elemente aus beiden Tabellen innerhalb eines \phantom, während die Höhe der Zeile mithilfe eines Zeilenumbruchs der Form entfernt wird \\[-\normalbaselineskip].

Wenn der auszublendende Inhalt sehr hoch ist, verwenden Sie \hphantom. Wenn Sie sich Sorgen über das Überdrucken vertikaler Linien machen, verwenden Sie diese nicht (wie von dem großartigenbooktabs) oder fügen Sie jedes Spaltenelement in die " \killZeile" ein mit\multicolumn{1}{l}{...} ohnevertikale Regeln.

verwandte Informationen