Tabelle breiter als Satzspiegel

Tabellen und Grafiken erstellen und anordnen


Roman_95
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 5. Aug 2018, 02:07

Tabelle breiter als Satzspiegel

Beitrag von Roman_95 »

Hallo Zusammen,

ich habe ein m.M. nach kurioses Problem:

Ich möchte ein Tabelle setzen, die so breit ist wie der Textblock (\textwidth). Hierfür verwende ich folgenden Code:
\documentclass[
  numbers=noenddot,			
  12pt,
  twoside=false,
  headsepline,
  footsepline,
%  DIV=calc,
   BCOR=5mm,
   ngerman
]{scrbook}

\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{blindtext}
\usepackage{array, tabularx}
\usepackage{showframe}
\usepackage{everysel, footmisc, ragged2e} % verbesserte Silbentrennung in bündigen und zentrierten Absätzen (ragged2e, der Rest ist benötigt)
\newcolumntype{P}[1]{>{\hspace{0pt}}p{#1}}	% "p-Spalte" mit Zeilenumbruch auch nach dem ersten Wort


\begin{document}
\blinddocument

\begin{figure}
	\centering
	\begin{tabular}{|>{\centering}P{.3\textwidth}|>{\centering}P{.3\textwidth}|>{\centering\arraybackslash}P{.3\textwidth}|}
		\hline
		\multicolumn{3}{|>{\centering\bfseries}p{\textwidth}|}{Aufgabenstellung}\\ \hline
		\multicolumn{3}{|>{\centering}p{\textwidth}|}{Beschreibung einer Aufgabenstellung die so lang ist dass diese mehr als eine Zeile füllt}\\ 
		\hline
		Stichpunkt 1 & Stichpunkt 2 & Stichpunkt 3 \\ \hline
		Dies hier ist ein
Blindtext zum Testen
von Textausgaben. Wer
diesen Text liest, ist
selbst schuld. Der Text
gibt lediglich den
Grauwert der Schrift an.
Ist das wirklich so? Ist es
gleichgültig, ob ich
schreibe: Dies ist ein
Blindtext oder
Huardest gefburn? Kjift
 mitnichten!

&
 
Dies hier ist ein
Blindtext zum Testen
von Textausgaben. Wer
diesen Text liest, ist
selbst schuld. Der Text
gibt lediglich den
Grauwert der Schrift an.
Ist das wirklich so? Ist es
gleichgültig, ob ich
schreibe: Dies ist ein
Blindtext oder
Huardest gefburn? Kjift
 mitnichten!  

&

Dies hier ist ein
Blindtext zum Testen
von Textausgaben. Wer
diesen Text liest, ist
selbst schuld. Der Text
gibt lediglich den
Grauwert der Schrift an.
Ist das wirklich so? Ist es
gleichgültig, ob ich
schreibe: Dies ist ein
Blindtext oder
Huardest gefburn? Kjift
 mitnichten!  \\ \hline
	\end{tabular}
\end{figure}

\end{document}
Nun wird, wie man sieht, die Tabelle jedoch breiter als der Textblock, und in der \multicolumn mit dem langen Text reicht dieser ganz an den Rand dessen. Ich denke die Tabelle wird dann breiter, da es "intern" diese zusätzlichen Abstände zwischen den Spalten gibt.
Auffällig finde ich , dass die Tabelle genau bis an den von showframe angezeigten, rechten Block ragt. (BTW: wofür ist der gut?)

In anderen Fällen (Abbildungen, Tabelle ohne \multicolumn) funktioniert die Skalierung mittels \textwidth einwandfrei.

Dinge wie schlecht funktionierenden Zeilenumbruch in \centering (paket "ragged2e), keine Silbentrennung beim ersten Wort (neuer Spaltentyp "P") habe ich nach den mir bekannten Möglichkeiten ausgemerzt.

Ich habe auch schon versucht, \linewidth zu verwenden. Verstehe ich das richtig, dass \linewidth relativ zu einer höheren Ebene definiert ist? Also z.B. ist in einer subfigure mit width=0.5\textwidth, linewidth=0.5\textwidth? Wie auch immer, kein Unterschied...

Auch schmalere Spalten habe ich versucht, aber auf den \multicolumn-Teil hat das keinen Einfluss, sofern deren Breite nicht geändert wird.


Ich hoffe mir kann jemand helfen :D

VG, Roman


PS: Versteht Latex auch richtige Brüche? Weil wenn ich 0.3\textwidth eingebe ist die Summe aus drei Spalten ja nicht genau \textwidth. Oder ist der Fehler vernachlässigbar klein? Wenn es möglich ist, wie gibt man das an?

Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Hallo Roman,

Es ist tatsächlich so, dass links und rechts von der "Tabellenlinie" ein Abstand ist.
Wenn Du den nicht willst, dann lass LaTeX rechnen:
\dimexpr0.2\textwidth-2\tabcolsep\relax}
macht z.B. exakt 0,2-fache Textbreite (weil in \tabcolsep der Rand eingestellt ist.

Alternativ kannst Du natürlich auch \tabcolsep global auf 0 stellen.

Zu Deinen sonstigen Fragen auf die Schnelle:

Der "rechte Kasten" ist der Platz für die Marginalspalte.

LaTeX kann nicht besonders gut rechnen, was die Genauigkeit angeht. Wenn Du statt 3x 0.3\textwidth 3x 0.3333\textwidth nimmst, merkst Du den Restfehler nicht mehr.

Gruß vom Rolli

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

Warum arbeitest Du nicht mit dem von Dir bereits geladenen Paket tabularx und dessen Spaltentyp X? In der Dokumentation kannst Du nachlesen, wie der Spaltentyp angepasst werden kann. Das Paket lädt übrigens array.

Als Spaltentyp für den Befehl \multicolumn in der ersten Zeile genügt auch c, da kein Zeilenumbruch vorkommt.

Roman_95
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 5. Aug 2018, 02:07

Beitrag von Roman_95 »

Danke für die schnellen Antworten zunächst!

@Rolli: Was genau macht die Berechnung und wo soll ich sie einsetzen/den Wert verwenden? Das ist ja die Vorgabe der zusätzlichen Spaltenbreite wenn ich das richtig verstehe, aber die möchte ich ja garnicht verändern.
Eigentlich soll ja nur die umbrechende \multicolumn-Zelle genau die Breite des Textes haben... Oder ist das die Angabe die ich dieser als Breite übergeben muss? Was bedeutet eigentlich dieses \relax das man überall sieht?

@Bartmann: Ich hatte es schon einmal probiert diese Tabelle mittels tabularx zu erstellen, da klappte das aber nicht vernünftig - habe da wohl etwas falsch gemacht, jetzt klappt es einwandfrei :roll: :D Auf die Idee bin ich dann gar nicht mehr gekommen.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »


Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Hallo Roman,

Ich bin mir jetzt nicht mehr sicher, ob ich Dein Problem verstehe.

Ich habe verstanden: Tabellenspaltenbreite 0.3\textwidth+0.3\textwidth+0.4\textwidth gibt mathematisch genau die Textbreite, trotzdem schießt die Tabelle rechts raus.

Wenn ich Dich richtig verstanden habe: Dann gilt meine Antwort; es liegt daran, dass links und rechts einer Spaltengrenze automatisch ein kleiner Zwischenraum eingebaut wird. Dieser ist genau so groß, wie es in der Dimensionsvariablen \tabcolsep angegeben ist. Ich bin mir nicht sicher, meine aber, das sind standardmäßig 6pt.

Damit schießt eine dreispaltige Tabelle logischerweise um 6 * \tabcolsep rechts raus. Das kannst Du in meinem untenstehenden Beispiel in der oberen Tabelle prima sehen.

Um dem abzuhelfen, gibt es zwei Möglichkeiten:

1. Du machst deine Spalten um 2 * \tabcolsep schmäler: Du ziehst bei der Breite jeder Spalte 2 * \tabcolsep ab - dann passt es genau. Das geht mit dem Ausdruck
\dimexpr0.3\textwidth-2\tabcolsep\relax
bei einer beispielsweise exakt 0.3 * \textwidth breiten Spalte.
Der Vorteil ist, dass \tabcolsep erhalten bleibt.

Das \relax sagt \dimexpr, dass die Berechnung fertig ist.

Siehe die mittlere Tabelle im untenstehenden Beispiel.

2. Du setzt \tabcolsep auf 0. Nachteil: Dann "klebt" der Spaltentext an den Spaltenlinien. Siehe die untere Tabelle im Beispiel (habe \tabcolsep auf 1mm gesetzt, ändere es mal auf 0mm oder gar auf einen negativen Wert).

Alles klar?

Gruß vom Rolli
\documentclass[
  numbers=noenddot,         
  12pt,
  twoside=false,
  headsepline,
  footsepline,
%  DIV=calc,
   BCOR=5mm,
   ngerman
]{scrbook}

\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{array, tabularx, longtable}
\usepackage{showframe}
\usepackage{everysel, footmisc, ragged2e} % verbesserte Silbentrennung in bündigen und zentrierten Absätzen (ragged2e, der Rest ist benötigt)
\newcolumntype{P}[1]{>{\hspace{0pt}}p{#1}}   % "p-Spalte" mit Zeilenumbruch auch nach dem ersten Wort

\newcolumntype{L}[1]{>{\raggedright\hspace{0pt}}p{#1}}
\newcolumntype{C}[1]{>{\centering\hspace{0pt}}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\hspace{0pt}}p{#1}}

\begin{document}

\begin{longtable}{|L{0.3\textwidth}|C{0.4\textwidth}|R{0.3\textwidth}|}
\hline
Links & Mitte & Rechts \tabularnewline
\hline\endhead
\hline\endfoot
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb &
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb &
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb
\end{longtable}

\begin{longtable}{|L{\dimexpr0.3\textwidth-2\tabcolsep\relax}|C{\dimexpr0.4\textwidth-2\tabcolsep\relax}|R{\dimexpr0.3\textwidth-2\tabcolsep\relax}|}
\hline
Links & Mitte & Rechts \tabularnewline
\hline\endhead
\hline\endfoot
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb &
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb &
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb
\end{longtable}

\setlength{\tabcolsep}{1mm}

\begin{longtable}{|L{0.3\textwidth}|C{0.4\textwidth}|R{0.3\textwidth}|}
\hline
Links & Mitte & Rechts \tabularnewline
\hline\endhead
\hline\endfoot
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb &
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb &
Blabla Blablabla BlubbBlubb BlubbBlubbBlubb
\end{longtable}

\end{document}

Roman_95
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 5. Aug 2018, 02:07

Beitrag von Roman_95 »

Hallo Rolli,

doch, du hast mein Problem schon richtig verstanden. Ich konnte nur mit der Berechnung nicht viel anfangen, da ich weder genau verstand was sie tut, noch wie sie eingesetzt wird.

Ich glaube jetzt es verstanden zu haben: Die "Spaltenbreite", die man oben deklariert, ist eigentlich die Textbreite in der entsprechenden Spalte. Beim Setzen kommt dann noch (2x) \tabcolsep hinzu, was die tatsächliche Spaltenbreite ergibt.
Zieht man nun beim Deklarieren der Spalten-Textbreite die Breite von (2x) \tabcolsep ab, ergibt sich nach dem Setzen die Gesamt-Spaltenbreite, die ich in diesem Fall eigentlich dachte direkt vorzugeben, z.B. 0.3\textwidth, da ja (2x) \tabcolsep von LaTeX wieder draufgepackt wird...

Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Genau so habe ich es auch verstanden.
Ist Deine Frage damit beantwortet? Dann setze doch bitte den Status auf "beantwortet".

Gruß vom Rolli

Roman_95
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 5. Aug 2018, 02:07

Beitrag von Roman_95 »

...das wollte ich jetzt erledigen, wo alle eventuellen Unklarheiten beseitigt sind.

Vielen Dank für deine Mühen! VG

Antworten