Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Spaltenbreite in Longtables

761 views
Skip to first unread message

Ralf Kiefer

unread,
Dec 6, 2013, 9:58:46 AM12/6/13
to
Hallo!

Meine n�chste Aufgabe :-)

Ich habe viele Tabellen in meinen Dokumenten. Die k�nnen auch mal etwas
l�nger werden hinsichtlich Seitengrenzen, also sind sie vom Typ Longtable.
Die Spaltenbreite setze ich selbst fest, denn dadurch bekommen die Tabellen
ein einheitliches Aussehen bzgl. der Spaltenbreiten. Die Tabellen sollen
100% der nutzbaren Breite belegen, exakt 100%.

Mit p{0.3\textwidth} lege ich den Anteil des Spalteninhalts(!) an der
nutzbaren Breite fest. D.h. eine Tabelle mit 100% wird zu breit, denn je
nach Spaltenzahl kann ich nur <100% nutzen. Mit \tabcolsep stelle ich den
horizontalen Abstand zwischen Tabelleninhalt und Spaltengrenze ein. Dieser
Wert steht typischerweise auf 6pt. D.h. bei einer 4-spaltigen Tabelle
stelle ich f�r die 4. Spalte die Spaltenbreite so ein:
p{[1.0-N-M-P]\textwidth-48pt} ein (N, M, P ist der Anteil der
vorangegangenen Spalten). Allerdings finde ich keinen Weg, wie ich das
automatisch berechnen lassen kann. Das m�chte ich, geht blo� nicht :-(

<schnipp>
\documentclass[a4paper,titlepage,onecolumn,oneside,10pt]{scrreprt}

\usepackage[english, ngerman]{babel}
\selectlanguage{english}

% Einstellungen der Seitenr�nder
\usepackage[inner=25mm,outer=25mm,top=10mm,bottom=0mm,includeheadfoot]{geometry}
\setlength{\parindent}{0pt}

\usepackage{longtable}

\begin{document}
\hrulefill

\begin{longtable}{|p{0.2\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|p{0.4\textwidth-24pt}|}
\hline
\textbf{Spalte 1} & \textbf{Spalte 2} &
\textbf{Spalte 3} & \textbf{Spalte 4}\\
\hline
A1 & A2 & A3 & A4\\
B1 & B2 & B3 & B4\\
C1 & C2 & C3 & C4\\
\hline
\end{longtable}

\noindent\rule{\textwidth}{5pt}
\end{document}
</schnipp>

D.h. wie kann ich eine Berechnung innerhalb solch einer Klammerung
anstellen? Scheitert es evtl.am Mix der Einheiten (pt, mm, usw)? \tabcolsep
auf 0 setzen ist keine Alternative.

TIA, Gru�, Ralf

Olaf Meltzer

unread,
Dec 6, 2013, 10:18:00 AM12/6/13
to
* Ralf Kiefer schrieb:

> D.h. wie kann ich eine Berechnung innerhalb solch einer Klammerung
> anstellen? Scheitert es evtl.am Mix der Einheiten (pt, mm, usw)?

Solche Berechnungen benötigen das Paket calc.

> \tabcolsep auf 0 setzen ist keine Alternative.

Du kannst nun die nötige Anzahl von \tabcolsep, in Deinem Fall mit vier
Spalten wären das 8, von der letzten Spaltenbreite subtrahieren.

Dein Beispiel sähe dann so aus:

\documentclass[a4paper,titlepage,onecolumn,oneside,10pt]{scrreprt}

\usepackage[english, ngerman]{babel}
\selectlanguage{english}
\usepackage{calc}
% Einstellungen der Seitenränder
\usepackage[inner=25mm,outer=25mm,top=10mm,bottom=0mm,includeheadfoot]
{geometry}
\setlength{\parindent}{0pt}

\usepackage{longtable}

\begin{document}
\hrulefill

\begin{longtable}{|p{0.2\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|
p{0.4\textwidth-8\tabcolsep}|}
\hline
\textbf{Spalte 1} & \textbf{Spalte 2} &
\textbf{Spalte 3} & \textbf{Spalte 4}\\
\hline
A1 & A2 & A3 & A4\\
B1 & B2 & B3 & B4\\
C1 & C2 & C3 & C4\\
\hline
\end{longtable}

\noindent\rule{\textwidth}{5pt}
\end{document}

Gruß -- Olaf Meltzer

--
openSUSE 12.3 - TeX Live 2013, aktuell mit tlmgr

Christine Roemer

unread,
Dec 6, 2013, 10:22:04 AM12/6/13
to
Hallo,

wenn Du deine definierte logtable-Breite als Ma� f�r die Textbreite
nehmen willst, gibt es in Vo�: Tabellen mit LaTeX (2. Aufl.), S. 169 ein
Beispiel 05-01-4, das auf einen Trick von Oberdiek zur�ckgreift.
Die Beispiele liegen laut Vorwort auf CTAN://info/examples/Tabellen/.

Gr��e
Christine

Ralf Kiefer

unread,
Dec 6, 2013, 11:15:16 AM12/6/13
to
Am Fri, 06 Dec 2013 16:22:04 +0100 schrieb Christine Roemer:

> wenn Du deine definierte logtable-Breite als Ma� f�r die Textbreite
> nehmen willst, gibt es in Vo�: Tabellen mit LaTeX (2. Aufl.), S. 169 ein
> Beispiel 05-01-4, das auf einen Trick von Oberdiek zur�ckgreift.

Die andere Variante mit dem Package calc ist schnell, einfach und
wirkungsvoll. An Deinem Link lese ich weiter, auch wenn ich auf der
CTAN-Seite schon viele Stunden verbracht habe :-)

Danke, Gru�, Ralf

Ralf Kiefer

unread,
Dec 6, 2013, 11:15:20 AM12/6/13
to
Am Fri, 06 Dec 2013 16:18 +0100 schrieb Olaf Meltzer:

> Solche Berechnungen ben�tigen das Paket calc.

Genau das war's, was mir fehlte.


> Du kannst nun die n�tige Anzahl von \tabcolsep, in Deinem Fall mit vier
> Spalten w�ren das 8, von der letzten Spaltenbreite subtrahieren.

Genau so sieht's perfekt aus.

Danke, Gru�, Ralf

Axel Berger

unread,
Dec 6, 2013, 11:54:00 AM12/6/13
to
Ralf Kiefer wrote on Fri, 13-12-06 15:58:
>Das m�chte ich, geht blo� nicht :-(

Paket calc.

Ralf Kiefer

unread,
Dec 9, 2013, 11:07:54 AM12/9/13
to
Hallo!

Es funktioniert, wie schon geschrieben. Aber nicht ganz, wie ich mir das
vorstellte. Hier zwei Tabellen, eine als Tabular in 3 Spalten, die andere
als Longtable in 5 Spalten, wobei die Spaltenzahl nichts mit Tabular oder
Longtable zu tun hat. Eigentlich(!) m��te die 2. Spalte der ersten Tabelle
mit der 3. Spalte der zweiten Tabelle fluchten. Mache ich einen
gedanklichen Fehler?

In Tabelle 3 und 4 sollte die rechte Spalte gleich breit sein. Ist sie aber
nicht. Irgendwas habe ich mit den \tabcolsep noch nicht korrekt.

<schnipp>
\documentclass[a4paper,titlepage,onecolumn,oneside,10pt]{scrreprt}

\usepackage[english, ngerman]{babel}
\selectlanguage{english}

\usepackage[inner=25mm,outer=25mm,top=10mm,bottom=0mm,includeheadfoot]{geometry}

\usepackage{longtable}
\usepackage{calc}

\begin{document}

\begin{table}[h]
\begin{tabular}{p{0.44\textwidth-6\tabcolsep}|p{0.08\textwidth}|p{0.48\textwidth}}
\hline
\textbf{State} & \textbf{Value} & \textbf{Description}\\
\hline
Closed & 0 & S is closed.\\
\hline
\end{tabular}
\end{table}

\begin{longtable}{p{0.12\textwidth}|p{0.32\textwidth-10\tabcolsep}|p{0.02\textwidth}|p{0.06\textwidth}|p{0.48\textwidth}}
\hline
\textbf{Function} & \textbf{Syntax} & \textbf{S} & \textbf{DDE} &
\textbf{Description}\\
\hline
\endhead
create & create( ) & p & V0.1 & Creates a new function.\\
\hline
\end{longtable}

\begin{table}[h]
\begin{tabular}{p{0.44\textwidth-2\tabcolsep}|p{0.08\textwidth-2\tabcolsep}|p{0.48\textwidth-2\tabcolsep}}
\hline
\textbf{State} & \textbf{Value} & \textbf{Description}\\
\hline
Closed & 0 & S is closed.\\
\hline
\end{tabular}
\end{table}

\begin{longtable}{p{0.12\textwidth-2\tabcolsep}|p{0.30\textwidth-2\tabcolsep}|p{0.02\textwidth-2\tabcolsep}|p{0.08\textwidth-2\tabcolsep}|p{0.48\textwidth-2\tabcolsep}}
\hline
\textbf{Function} & \textbf{Syntax} & \textbf{S} & \textbf{DDE} &
\textbf{Description}\\
\hline
\endhead
create & create( ) & p & V0.1 & Creates a new function.\\
\hline
\end{longtable}

\end{document}
</schnipp>

TIA, Gru�, Ralf

Olaf Meltzer

unread,
Dec 10, 2013, 8:56:40 AM12/10/13
to
* Ralf Kiefer schrieb:

> Hier zwei Tabellen, eine als Tabular in 3 Spalten, die
> andere als Longtable in 5 Spalten, wobei die Spaltenzahl nichts mit
> Tabular oder Longtable zu tun hat. Eigentlich(!) müßte die 2. Spalte
> der ersten Tabelle mit der 3. Spalte der zweiten Tabelle fluchten.
> Mache ich einen gedanklichen Fehler?

Ja, das machst Du noch falsch, denn: Eine Spalte, deren Ausdehnung Du
beispielsweise mit p{0.44\textwidth-6\tabcolsep} bestimmst, ist ja nicht
wirklich 0.44\textwidth-6\tabcolsec breit, sondern nimmt tatsächlich
0.44\textwidth+2\tabcolsec-6\tabcolsec ein.

Gruß -- Olaf Meltzer

--
openSUSE 13.1 - TeX Live 2013, aktuell mit tlmgr

Olaf Meltzer

unread,
Dec 10, 2013, 8:58:35 AM12/10/13
to
* Ralf Kiefer schrieb:

> Hier zwei Tabellen, eine als Tabular in 3 Spalten, die
> andere als Longtable in 5 Spalten, wobei die Spaltenzahl nichts mit
> Tabular oder Longtable zu tun hat. Eigentlich(!) müßte die 2. Spalte
> der ersten Tabelle mit der 3. Spalte der zweiten Tabelle fluchten.
> Mache ich einen gedanklichen Fehler?

Ja, das machst Du noch falsch, denn: Eine Spalte, deren Ausdehnung Du
beispielsweise mit p{0.44\textwidth-6\tabcolsep} bestimmst, ist ja nicht
wirklich 0.44\textwidth-6\tabcolsep breit, sondern nimmt tatsächlich
0.44\textwidth+2\tabcolsep-6\tabcolsep ein.

Ralf Kiefer

unread,
Dec 11, 2013, 11:40:43 AM12/11/13
to
Am Tue, 10 Dec 2013 14:58:35 +0100 schrieb Olaf Meltzer:

> Ja, das machst Du noch falsch, denn: Eine Spalte, deren Ausdehnung Du
> beispielsweise mit p{0.44\textwidth-6\tabcolsep} bestimmst, ist ja nicht
> wirklich 0.44\textwidth-6\tabcolsep breit, sondern nimmt tats�chlich
> 0.44\textwidth+2\tabcolsep-6\tabcolsep ein.

So weit, so gut, aber es pa�t nicht zu meinem bisherigen Verst�ndnis.

Wie berechnet sich die Breite einer Tabelle, der jeweiligen Spalte sowie
die nutzbare Breite f�r den Text in einer Spalte?

Ich probiere mich an einer Antwort:
- \textwidth ist die nutzbare Breite f�r Text oder Tabelle in einer Zeile.
- In einer Tabelle addieren sich Textbreiten _und_ Abst�nde in einer Reihe.
Diese m�chte ich aus �sthetischen Gr�nden auf exakt \textwidth haben.
- Pro Spalte mu� ich 2\tabcolsep von \textwidth abziehen, um die
verbleibende nutzbare Breite f�r Text (verteilt �ber die Spalten) zu
erhalten.
- Habe ich N Spalten, bleiben mir \textwidth - (N * 2)\tabcolsep f�r Text
(verteilt auf die N Spalten).
- Selbstverst�ndlich k�nnte ich auch f�r jede Spalte eine Spaltenbreite von
x\textwidth - 2\tabcolsep angeben mit 0<x<1 (fast).


Gru�, Ralf

Ralf Kiefer

unread,
Dec 11, 2013, 12:06:27 PM12/11/13
to
/ingrid:

> So weit, so gut, aber es pa�t nicht zu meinem bisherigen Verst�ndnis.

Ich habe einen Hinweis: ist eine Spalte sehr schmal angegeben und der Text
pa�t �berhaupt nicht rein, wird die Spalte etwas breiter angelegt. Die
Breite der anderen Spalten bleibt allerdings unver�ndert. Folge: die
Tabelle wird breiter als 100% von \textwidth.

Jetzt fehlt mir noch die Regel, wie ich die Minimalbreite einer Spalte
festlege.

Gru�, Ralf

Olaf Meltzer

unread,
Dec 11, 2013, 1:55:27 PM12/11/13
to
* Ralf Kiefer schrieb:

> Wie berechnet sich die Breite einer Tabelle, der jeweiligen Spalte
> sowie die nutzbare Breite für den Text in einer Spalte?

Eine mit p{0\textwidth} ausgewiesene Spalte wäre 2\tabcolsep breit.

Eine p-Spalte, die genau \textwidth breit sein soll, muss als
p{\textwidth-2\tabcolsep} ausgewiesen werden.

Wenn alle n Spalten einer Tabelle vom p-Typ sind, man für die Berechnung
der Spaltenbreiten mit Ausdrücken der Form x\textwidth arbeitet und die
Summe aller x gleich 1 ist, müssen irgendwo 2n \tabcolsep subtrahiert
werden.

Angewendet auf Dein Beispiel aus einem früheren Posting -- und zwar so,
dass auch noch die letzten Spalten beider Tabellen wieder fluchten:

\documentclass[a4paper,titlepage,onecolumn,oneside,10pt]{scrreprt}

\usepackage[english, ngerman]{babel}
\selectlanguage{english}

\usepackage[inner=25mm,outer=25mm,top=10mm,bottom=0mm,includeheadfoot]
{geometry}

\usepackage{longtable}
\usepackage{calc}

\begin{document}
\noindent a \hfill b

\begin{table}[h]
\begin{tabular}{p{0.44\textwidth-6\tabcolsep}|
p{0.08\textwidth+2\tabcolsep}|
p{0.48\textwidth-2\tabcolsep}}
\hline
\textbf{State} & \textbf{Value} & \textbf{Description}\\
\hline
Closed & 0 & S is closed.\\
\hline
\end{tabular}
\end{table}

\begin{longtable}{p{0.12\textwidth}|
p{0.32\textwidth-8\tabcolsep}|
p{0.02\textwidth}|
p{0.06\textwidth}|
p{0.48\textwidth-2\tabcolsep}}
\hline
\textbf{Function} & \textbf{Syntax} & \textbf{S} & \textbf{DDE} &
\textbf{Description}\\
\hline
\endhead
create & create( ) & p & V0.1 & Creates a new function.\\
\hline
\end{longtable}

\noindent c \hfill d
\end{document}
0 new messages