Tabellenspalten automatisch ausgleichen?

Tabellenspalten automatisch ausgleichen?

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.4zur 1.6Build-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 Aund 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 ).Xtabularx

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

Ausgabe des obigen Codes

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 tabulardas Ganze verwenden, linewidthindem 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 tabcolseps abziehen, also zwei pro Spalte (insgesamt acht für vier Spalten). Wenn Sie vertikale Linien haben, müssen Sie auch die richtige Anzahl von arrayrulewidths 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}}
  1. Wenn Sie zentrierte oder rechtsbündige Spalten bevorzugen, wechseln Sie \RaggedRightzu \Centeringoder \RaggedLeft.
  2. 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ötigen linewidth, verwenden Sie (0.8\linewidth).
  3. Die Formel 25/100/2gibt die relative Breite der A-Spalte an, hier 25%. Diese Zahl soll so gesetzt werden, dass die Summe der newcolumntype100 ergibt. Daher wird in der B-Spalte verwendet 75/100. Die letzte Ziffer ist die Anzahl der A-oder B-Spalten.
  4. Wenn Sie die linken und rechten Lager entfernen ( @{}), tabcolsepist die Anzahl der zu subtrahierenden s zwei kleiner als die Gesamtzahl der tabcolsepts. 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 drei ASpalten haben, müssen Sie subtrahieren -(2\tabcolsep-(\tabcolsep/3)).
  5. Wenn Sie vertikale Regeln verwenden, müssen Sie die Anzahl arrayruleswidthauch 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 tabularxund tabularyerledige bereits die ganze Mathematik für Sie. Sehen Sie sich jedoch Abschnitt 4.3 im tabularxHandbuch an.

Unten habe ich Code für eine Tabelle mit sechs Spalten beigefügt:

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

(rote Linien zeigen Textränder an)

verwandte Informationen