![Tabellenspalten automatisch ausgleichen?](https://rvso.com/image/399824/Tabellenspalten%20automatisch%20ausgleichen%3F.png)
So gleichen Sie die Spalten einer solchen Deklaration aus:
\begin{tabularx}{\linewidth}{
>{\hsize=0.4\hsize}X% 10% of 4\hsize
>{\hsize=1.6\hsize}X% 30% of 4\hsize
>{\hsize=0.4\hsize}X% 10% of 4\hsize
>{\hsize=1.6\hsize}X% 30% of 4\hsize
}
\end{tabularx}
Offensichtlich müssen die Werte 0.4
zur 1.6
Build-Zeit automatisch angepasst werden ...
Beispiel:
.--------- Same width ---------------.
| |
<----+---> <---+---->
┌────────┬────────────────────────────┬────────┬───────────────────────────┐
│ A │ B │ A │ B │
├────────┼────────────────────────────┼────────┼───────────────────────────┤
│ 132132 │ Sed rutrum elit quis neque │ 42 │ Cras porta │
└────────┴────────────────────────────┴────────┴───────────────────────────┘
<------------+---------------> <-------------+------------->
| |
'------------- Same width -------------'
Wobei die ungeraden Spalten eine Größe A
und die geraden eine Größe haben B
? Damit garantiere ich, dass Spalte 1 und 3 immer die gleiche Größe haben, und Spalte 2 und 4 gleichmäßig im Raum verteilt sind.
Mit anderen Worten wird die Mindestbreite der Spalten wie folgt bestimmt:
min_widths[0] = min_widths[2] = max(map(width, columns[0] + columns[2]))
min_widths[1] = min_widths[3] = max(map(width, columns[1] + columns[3]))
Dann wird alles so gestreckt, dass es in das Folgende passt \linewidth
:
if sum(min_widths) > \linewidth:
% Attempts to wrap some text and reduce the column sizes
else:
widths = map(lambda x: x * (\linewidth / sum(min_widths), min_widths)
Gute Parameter für eine solche Funktion wären:
- Column alignment: left, center, right, raggedleft, raggedright
- Maximum width: e.g. 10em
- Minimum width: e.g. 0em
- Desired width ratio: 1
- Automatic wrapping: yes, no
Antwort1
Hier ist eine Lösung mit {NiceTabular}
von nicematrix
(≥ 6.25a). In dieser Umgebung haben Sie einen Schlüssel columns-width=auto
, der erfordert, dass alle Spalten die gleiche Breite haben, mit Ausnahme der Spalten (die den Spalten von X
ähnlich sind ).X
tabularx
\documentclass{article}
\usepackage{nicematrix}
\usepackage{lipsum} % for dummy text
\begin{document}
\lipsum[1]
\begin{center}
\begin{NiceTabular}{lXlX}[columns-width=auto,hvlines]
A & B & A & B \\
132132 & Sed rutrum elit quis neque & 42 & Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna
fringilla ultrices.
\end{NiceTabular}
\end{center}
\lipsum[2]
\end{document}
Antwort2
BEARBEITEN 20190807Am Ende der Antwort habe ich den von mir empfohlenen Code eingefügt, eine Zusammenführung der Antwort von Zarko und meiner.
Sie müssen möglicherweise tabular
das Ganze verwenden, linewidth
indem Sie die Breite der p{}
-Spalten als Bruchteile der berechnen linewidth
. Stellen Sie einfach sicher, dass die Gesamtzahl der Spaltenbreiten die ergibt linewidth
. Sie müssen die richtige Anzahl von tabcolsep
s abziehen, also zwei pro Spalte (insgesamt acht für vier Spalten). Wenn Sie vertikale Linien haben, müssen Sie auch die richtige Anzahl von arrayrulewidth
s abziehen.
Ich habe das vorherige Beispiel „verbessert“. Wenn Sie sich die Definition einer A
-Spalte ansehen, lautet sie jetzt:
\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/2-1.5\tabcolsep\relax}}
- Wenn Sie zentrierte oder rechtsbündige Spalten bevorzugen, wechseln Sie
\RaggedRight
zu\Centering
oder\RaggedLeft
. - Wenn Sie eine Tabelle benötigen, deren Gesamtbreite kleiner als die vollen ist
linewidth
, ändern Sie sie(1\linewidth)
in den richtigen Bruchteil. Wenn Sie beispielsweise eine Tabelle mit 80 Prozent der benötigenlinewidth
, verwenden Sie(0.8\linewidth)
. - Die Formel
25/100/2
gibt die relative Breite derA
-Spalte an, hier 25%. Diese Zahl soll so gesetzt werden, dass die Summe dernewcolumntype
100 ergibt. Daher wird in derB
-Spalte verwendet75/100
. Die letzte Ziffer ist die Anzahl derA
-oderB
-Spalten. - Wenn Sie die linken und rechten Lager entfernen (
@{}
),tabcolsep
ist die Anzahl der zu subtrahierenden s zwei kleiner als die Gesamtzahl dertabcolsept
s. Wenn Sie vier Spalten haben, müssen Sie sechs subtrahieren, wenn Sie sechs Spalten haben, müssen Sie zehn subtrahieren,usw. Die Formel lautet-(2\tabcolsep-(\tabcolsep/<no. col.type>))
. Wenn Sie dreiA
Spalten haben, müssen Sie subtrahieren-(2\tabcolsep-(\tabcolsep/3))
. - Wenn Sie vertikale Regeln verwenden, müssen Sie die Anzahl
arrayruleswidth
auch richtig verteilen. Ich überlasse es Ihnen als Übung, dies zu tun.
Oben habe ich angenommen, dass Sie die gleiche Anzahl der Spaltentypen (ABAB, ABBA, ABBBAA) verwenden werden.usw.). Bei einer automatisierten Berechnung muss berücksichtigt werden, dass die Anzahl der Spaltentypen nicht zwangsläufig gleich sein muss (es können ABBAA, ABABA,usw.). So erhalten Sie schnell ein sehr kompliziertes Paket. Wahrscheinlich ist es besser, einen Taschenrechner oder Stift und Papier zu verwenden, um die Spaltenbreite festzulegen. Das ist offensichtlich viel schneller, als es in LaTeX zu programmieren.
Achtung! Ich betone das tabularx
und tabulary
erledige bereits die ganze Mathematik für Sie. Sehen Sie sich jedoch Abschnitt 4.3 im tabularx
Handbuch an.
Unten habe ich Code für eine Tabelle mit sechs Spalten beigefügt:
\documentclass{article}
\usepackage{array, booktabs, ragged2e}
\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\newcolumntype{B}{>{\Centering\arraybackslash}p{\dimexpr(1\textwidth)*75/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\usepackage{showframe}
\renewcommand*\ShowFrameColor{\color{red}}
\renewcommand*\ShowFrameLinethickness{.4pt}
\setlength{\tabcolsep}{2pt}
\begin{document}
{\centering
\begin{tabular}{@{}ABABBA@{}}
\toprule
A & B & A & B & A & B\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text & Wide centered column, which has lots of text & Short left alig\-ned column \\
\bottomrule
\end{tabular}%
}
\end{document}
Empfohlener Beispielcode
\documentclass{article}
\usepackage{booktabs, ragged2e}
\usepackage{tabularx}
\newcolumntype{D}{>{\small\RaggedRight\arraybackslash\hsize=0.4\hsize}X}
\newcolumntype{E}{>{\small\Centering\arraybackslash\hsize=1.6\hsize}X}
\setlength{\tabcolsep}{1.5pt}
\begin{document}
\noindent\begin{tabularx}{\linewidth}{@{}DEDEED@{}}
\toprule
D & E & D & E & E & D\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text & Wide centered column, which has lots of text & Short left alig\-ned column \\
\bottomrule
\end{tabularx}
\end{document}
Antwort3
So wie ich die Frage verstehe, sollten Tabellen eine Breite haben, die der Breite des Textes entspricht. Ich sehe also keine Vorteile (vielleicht aufgrund meines Urlaubs?), warumnichtzu verwenden tabularx
, wie ich in meinem Kommentar unter der Frage vorgeschlagen habe:
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{2}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} }
\hline
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx
& xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\
\hline
\end{tabularx}
\caption{Four column}
\end{table}
\begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{3}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} }
\hline
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx
& xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx
& xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\
\hline
\end{tabularx}
\caption{Sixt column}
\end{table}
\end{document}
(rote Linien zeigen Textränder an)