![Tabellarisch: Koppeln Sie die Dimensionen einer Tabelle mit einer anderen Tabelle.](https://rvso.com/image/335499/Tabellarisch%3A%20Koppeln%20Sie%20die%20Dimensionen%20einer%20Tabelle%20mit%20einer%20anderen%20Tabelle..png)
tabular
Legt die Spaltenbreite auf das breiteste Element aller Zeilen fest.
Ist es möglich, zwei oder mehr separate s so einzustellen, tabular
dass sie die Spaltenbreiten der jeweils anderen berücksichtigen und die größte davon auswählen?
Wenn ich beispielsweise eine tabular
Tabelle 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 tabbing
Umgebung gemacht wird. Sie legen eine erste Zeile fest, die die Tabstopps definiert, und dann \kill
diese Zeile, damit sie nicht angezeigt wird. Nachfolgende Zeilen verwenden diese Tabstopps, ohne dass die erste Zeile vorhanden ist.
\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 „ \kill
Zeile“ 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 " \kill
Zeile" ein mit\multicolumn{1}{l}{...}
ohnevertikale Regeln.